// Special case: name used as local variable in export.
// _ becomes ~b%d internally; print as _ for export
if n.Sym != nil && n.Sym.Name[0] == '~' && n.Sym.Name[1] == 'b' {
- // case 0: mapped to OPACK
- p.op(OPACK)
+ p.op(ONAME)
p.string("_") // inlined and customized version of p.sym(n)
break
}
if n.Sym != nil && !isblank(n) && n.Name.Vargen > 0 {
- // case 1: mapped to OPACK
- p.op(OPACK)
+ p.op(ONAME)
p.sym(n)
break
}
// but for export, this should be rendered as (*pkg.T).meth.
// These nodes have the special property that they are names with a left OTYPE and a right ONAME.
if n.Left != nil && n.Left.Op == OTYPE && n.Right != nil && n.Right.Op == ONAME {
- // case 2: mapped to OXDOT
p.op(OXDOT)
p.expr(n.Left) // n.Left.Op == OTYPE
p.fieldSym(n.Right.Sym, true)
break
}
- // case 3: mapped to OPACK
- fallthrough
-
- case OPACK, ONONAME:
- p.op(OPACK)
+ p.op(ONAME)
p.sym(n)
+ // case OPACK, ONONAME:
+ // should have been resolved by typechecking - handled by default case
+
case OTYPE:
p.op(OTYPE)
if p.bool(n.Type == nil) {
p.expr(n.Right)
}
- case OAS2DOTTYPE, OAS2FUNC, OAS2MAPR, OAS2RECV:
- fallthrough
-
- case OAS2:
+ case OAS2, OAS2DOTTYPE, OAS2FUNC, OAS2MAPR, OAS2RECV:
p.op(OAS2)
p.exprList(n.List)
p.exprList(n.Rlist)
}
return n
- // case ONAME, OPACK, ONONAME:
- // unreachable - mapped to case OPACK below by exporter
-
- case OPACK:
+ case ONAME:
return mkname(p.sym())
+ // case OPACK, ONONAME:
+ // unreachable - should have been resolved by typechecking
+
case OTYPE:
if p.bool() {
return mkname(p.sym())
case OXDOT:
// see parser.new_dotname
- obj := p.expr()
- sel := p.fieldSym()
- if obj.Op == OPACK {
- s := restrictlookup(sel.Name, obj.Name.Pkg)
- obj.Used = true
- return oldname(s)
- }
- return NodSym(OXDOT, obj, sel)
+ return NodSym(OXDOT, p.expr(), p.fieldSym())
// case ODOTTYPE, ODOTTYPE2:
// unreachable - mapped to case ODOTTYPE below by exporter