func (p *importer) field() *types.Var { pkg, name := p.qualifiedName() typ := p.typ() anonymous := false if name == "" { // anonymous field - typ must be T or *T and T must be a type name switch typ := deref(typ).(type) { case *types.Basic: // basic types are named types pkg = nil name = typ.Name() case *types.Named: obj := typ.Obj() name = obj.Name() // correct the field package for anonymous fields if exported(name) { pkg = p.pkgList[0] } default: panic("anonymous field expected") } anonymous = true } return types.NewField(token.NoPos, pkg, name, typ, anonymous) }
// Field = Name Type [ string_lit ] . // func (p *parser) parseField() (*types.Var, string) { pkg, name := p.parseName(true) typ := p.parseType() anonymous := false if name == "" { // anonymous field - typ must be T or *T and T must be a type name switch typ := deref(typ).(type) { case *types.Basic: // basic types are named types pkg = nil name = typ.Name() case *types.Named: name = typ.Obj().Name() default: p.errorf("anonymous field expected") } anonymous = true } tag := "" if p.tok == scanner.String { s := p.expect(scanner.String) var err error tag, err = strconv.Unquote(s) if err != nil { p.errorf("invalid struct tag %s: %s", s, err) } } return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag }
// Field = Name Type [string] . func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string) { name := p.parseName() typ := p.parseType(pkg) anon := false if name == "" { anon = true switch typ := deref(typ).(type) { case *types.Basic: name = typ.Name() case *types.Named: name = typ.Obj().Name() default: p.error("anonymous field expected") } } field = types.NewField(token.NoPos, pkg, name, typ, anon) if p.tok == scanner.String { tag = p.parseString() } return }