func (p *exporter) field(f *types.Var) { // anonymous fields have "" name name := "" if !f.Anonymous() { name = f.Name() } // qualifiedName will always emit the field package for // anonymous fields because "" is not an exported name. p.qualifiedName(f.Pkg(), name) p.typ(f.Type()) }
func (c *funcContext) varPtrName(o *types.Var) string { if isPkgLevel(o) && o.Exported() { return c.pkgVar(o.Pkg()) + "." + o.Name() + "$ptr" } name, ok := c.p.varPtrNames[o] if !ok { name = c.newVariableWithLevel(o.Name()+"$ptr", isPkgLevel(o)) c.p.varPtrNames[o] = name } return name }
// fieldName is like qualifiedName but it doesn't record the package // for blank (_) or exported names. func (p *exporter) fieldName(f *types.Var) { name := f.Name() // anonymous field with unexported base type name: use "?" as field name // (bname != "" per spec, but we are conservative in case of errors) if f.Anonymous() { base := f.Type() if ptr, ok := base.(*types.Pointer); ok { base = ptr.Elem() } if named, ok := base.(*types.Named); ok && !named.Obj().Exported() { name = "?" } } p.string(name) if name == "?" || name != "_" && !f.Exported() { p.pkg(f.Pkg(), false) } }