Add ast.Expr IsArgsDotFoo and IsMethodCall methods
diff --git a/internal/cgen/var.go b/internal/cgen/var.go
index 6106b29..7321f10 100644
--- a/internal/cgen/var.go
+++ b/internal/cgen/var.go
@@ -25,29 +25,20 @@
var errNeedDerivedVar = errors.New("cgen: internal error: need derived var")
func (g *gen) needDerivedVar(name t.ID) bool {
+ if name == 0 {
+ return false
+ }
for _, o := range g.currFunk.astFunc.Body() {
err := o.Walk(func(p *a.Node) error {
// Look for p matching "args.name.etc(etc)".
if p.Kind() != a.KExpr {
return nil
}
- q := p.AsExpr()
- if q.Operator() != t.IDOpenParen {
- return nil
+ recv, _, _ := p.AsExpr().IsMethodCall()
+ if (recv != nil) && (recv.IsArgsDotFoo() == name) {
+ return errNeedDerivedVar
}
- q = q.LHS().AsExpr()
- if q.Operator() != t.IDDot {
- return nil
- }
- q = q.LHS().AsExpr()
- if q.Operator() != t.IDDot || q.Ident() != name {
- return nil
- }
- q = q.LHS().AsExpr()
- if q.Operator() != 0 || q.Ident() != t.IDArgs {
- return nil
- }
- return errNeedDerivedVar
+ return nil
})
if err == errNeedDerivedVar {
return true
diff --git a/lang/ast/ast.go b/lang/ast/ast.go
index 95e20a1..a1b773f 100644
--- a/lang/ast/ast.go
+++ b/lang/ast/ast.go
@@ -371,6 +371,24 @@
func (n *Expr) SetMBounds(x interval.IntRange) { n.mBounds = x }
func (n *Expr) SetMType(x *TypeExpr) { n.mType = x }
+func (n *Expr) IsArgsDotFoo() (foo t.ID) {
+ if n.id0 == t.IDDot {
+ if (n.lhs.id0 == 0) && (n.lhs.id2 == t.IDArgs) {
+ return n.id2
+ }
+ }
+ return 0
+}
+
+func (n *Expr) IsMethodCall() (recv *Expr, meth t.ID, args []*Node) {
+ if n.id0 == t.IDOpenParen {
+ if o := n.lhs; o.id0 == t.IDDot {
+ return o.lhs.AsExpr(), o.id2, n.list0
+ }
+ }
+ return nil, 0, nil
+}
+
func NewExpr(flags Flags, operator t.ID, ident t.ID, lhs *Node, mhs *Node, rhs *Node, args []*Node) *Expr {
subExprEffect := Flags(0)
if lhs != nil {