}
func (w *exportWriter) pkg(pkg *types.Pkg) {
+ // TODO(mdempsky): Add flag to types.Pkg to mark pseudo-packages.
+ if pkg == ir.Pkgs.Go {
+ base.Fatalf("export of pseudo-package: %q", pkg.Path)
+ }
+
// Ensure any referenced packages are declared in the main index.
w.p.allPkgs[pkg] = true
}
func (w *exportWriter) localIdent(s *types.Sym, v int32) {
+ if w.currPkg == nil {
+ base.Fatalf("missing currPkg")
+ }
+
// Anonymous parameters.
if s == nil {
w.string("")
name = fmt.Sprintf("%s·%d", name, v)
}
- if !types.IsExported(name) && s.Pkg != w.currPkg {
- base.Fatalf("weird package in name: %v => %v, not %q", s, name, w.currPkg.Path)
+ if s.Pkg != w.currPkg {
+ base.Fatalf("weird package in name: %v => %v from %q, not %q", s, name, s.Pkg.Path, w.currPkg.Path)
}
w.string(name)
ms := make([]*types.Field, r.uint64())
for i := range ms {
mpos := r.pos()
- msym := r.ident()
+ msym := r.selector()
recv := r.param()
mtyp := r.signature(recv)
return constant.Make(&f)
}
-func (r *importReader) ident() *types.Sym {
+func (r *importReader) ident(selector bool) *types.Sym {
name := r.string()
if name == "" {
return nil
}
pkg := r.currPkg
- if types.IsExported(name) {
+ if selector && types.IsExported(name) {
pkg = types.LocalPkg
}
return pkg.Lookup(name)
}
+func (r *importReader) localIdent() *types.Sym { return r.ident(false) }
+func (r *importReader) selector() *types.Sym { return r.ident(true) }
+
func (r *importReader) qualifiedIdent() *ir.Ident {
name := r.string()
pkg := r.pkg()
fs := make([]*types.Field, r.uint64())
for i := range fs {
pos := r.pos()
- sym := r.ident()
+ sym := r.selector()
typ := r.typ()
emb := r.bool()
note := r.string()
methods := make([]*types.Field, r.uint64())
for i := range methods {
pos := r.pos()
- sym := r.ident()
+ sym := r.selector()
typ := r.signature(fakeRecvField())
methods[i] = types.NewField(pos, sym, typ)
}
func (r *importReader) param() *types.Field {
- return types.NewField(r.pos(), r.ident(), r.typ())
+ return types.NewField(r.pos(), r.localIdent(), r.typ())
}
func (r *importReader) bool() bool {
// Note: per-case variables will have distinct, dotted
// names after import. That's okay: swt.go only needs
// Sym for diagnostics anyway.
- caseVar := ir.NewNameAt(cas.Pos(), r.ident())
+ caseVar := ir.NewNameAt(cas.Pos(), r.localIdent())
Declare(caseVar, DeclContext)
cas.Var = caseVar
caseVar.Defn = switchExpr
return r.qualifiedIdent()
case ir.ONAME:
- return r.ident().Def.(*ir.Name)
+ return r.localIdent().Def.(*ir.Name)
// case OPACK, ONONAME:
// unreachable - should have been resolved by typechecking
case ir.OTYPESW:
pos := r.pos()
var tag *ir.Ident
- if s := r.ident(); s != nil {
+ if s := r.localIdent(); s != nil {
tag = ir.NewIdent(pos, s)
}
return ir.NewTypeSwitchGuard(pos, tag, r.expr())
case ir.OXDOT:
// see parser.new_dotname
- return ir.NewSelectorExpr(r.pos(), ir.OXDOT, r.expr(), r.ident())
+ return ir.NewSelectorExpr(r.pos(), ir.OXDOT, r.expr(), r.selector())
// case ODOTTYPE, ODOTTYPE2:
// unreachable - mapped to case ODOTTYPE below by exporter
// statements
case ir.ODCL:
pos := r.pos()
- lhs := ir.NewDeclNameAt(pos, ir.ONAME, r.ident())
+ lhs := ir.NewDeclNameAt(pos, ir.ONAME, r.localIdent())
lhs.SetType(r.typ())
Declare(lhs, ir.PAUTO)
func (r *importReader) fieldList() []ir.Node {
list := make([]ir.Node, r.uint64())
for i := range list {
- list[i] = ir.NewStructKeyExpr(r.pos(), r.ident(), r.expr())
+ list[i] = ir.NewStructKeyExpr(r.pos(), r.selector(), r.expr())
}
return list
}