case exprFuncLit:
return r.funcLit()
- case exprSelector:
- var x ir.Node
- if r.Bool() { // MethodExpr
- if r.Bool() {
- return r.dict.methodExprs[r.Len()]
- }
+ case exprFieldVal:
+ x := r.expr()
+ pos := r.pos()
+ _, sym := r.selector()
- n := ir.TypeNode(r.typ())
- n.SetTypecheck(1)
- x = n
- } else { // FieldVal, MethodVal
- x = r.expr()
- }
+ return typecheck.Expr(ir.NewSelectorExpr(pos, ir.OXDOT, x, sym)).(*ir.SelectorExpr)
+
+ case exprMethodVal:
+ x := r.expr()
pos := r.pos()
_, sym := r.selector()
n := typecheck.Expr(ir.NewSelectorExpr(pos, ir.OXDOT, x, sym)).(*ir.SelectorExpr)
- if n.Op() == ir.OMETHVALUE {
- wrapper := methodValueWrapper{
- rcvr: n.X.Type(),
- method: n.Selection,
- }
- if r.importedDef() {
- haveMethodValueWrappers = append(haveMethodValueWrappers, wrapper)
- } else {
- needMethodValueWrappers = append(needMethodValueWrappers, wrapper)
- }
+ wrapper := methodValueWrapper{
+ rcvr: n.X.Type(),
+ method: n.Selection,
+ }
+ if r.importedDef() {
+ haveMethodValueWrappers = append(haveMethodValueWrappers, wrapper)
+ } else {
+ needMethodValueWrappers = append(needMethodValueWrappers, wrapper)
}
return n
+ case exprMethodExpr:
+ if r.Bool() {
+ return r.dict.methodExprs[r.Len()]
+ }
+
+ typ := r.typ()
+ pos := r.pos()
+ _, sym := r.selector()
+
+ return typecheck.Expr(ir.NewSelectorExpr(pos, ir.OXDOT, ir.TypeNode(typ), sym)).(*ir.SelectorExpr)
+
case exprIndex:
x := r.expr()
pos := r.pos()
sel, ok := w.p.info.Selections[expr]
assert(ok)
- w.Code(exprSelector)
- if w.Bool(sel.Kind() == types2.MethodExpr) {
+ switch sel.Kind() {
+ default:
+ w.p.fatalf(expr, "unexpected selection kind: %v", sel.Kind())
+
+ case types2.FieldVal:
+ w.Code(exprFieldVal)
+ w.expr(expr.X)
+ w.pos(expr)
+ w.selector(sel.Obj())
+
+ case types2.MethodVal:
+ w.Code(exprMethodVal)
+ w.expr(expr.X)
+ w.pos(expr)
+ w.selector(sel.Obj())
+
+ case types2.MethodExpr:
+ w.Code(exprMethodExpr)
+
tv, ok := w.p.info.Types[expr.X]
assert(ok)
assert(tv.IsType())
}
w.typInfo(typInfo)
- } else {
- w.expr(expr.X)
+ w.pos(expr)
+ w.selector(sel.Obj())
}
- w.pos(expr)
- w.selector(sel.Obj())
case *syntax.IndexExpr:
_ = w.p.typeOf(expr.Index) // ensure this is an index expression, not an instantiation