// findTypesIn finalizes the package import and searches through the package // for types. func (b *Builder) findTypesIn(pkgPath string, u *types.Universe) error { pkg, err := b.makePackage(pkgPath) if err != nil { return err } if !b.userRequested[pkgPath] { // Since walkType is recursive, all types that the // packages they asked for depend on will be included. // But we don't need to include all types in all // *packages* they depend on. return nil } for _, f := range b.parsed[pkgPath] { if strings.HasSuffix(f.name, "/doc.go") { tp := u.Package(pkgPath) for i := range f.file.Comments { tp.Comments = append(tp.Comments, splitLines(f.file.Comments[i].Text())...) } if f.file.Doc != nil { tp.DocComments = splitLines(f.file.Doc.Text()) } } } s := pkg.Scope() for _, n := range s.Names() { obj := s.Lookup(n) tn, ok := obj.(*tc.TypeName) if ok { t := b.walkType(*u, nil, tn.Type()) c1 := b.priorCommentLines(obj.Pos(), 1) t.CommentLines = splitLines(c1.Text()) if c1 == nil { t.SecondClosestCommentLines = splitLines(b.priorCommentLines(obj.Pos(), 2).Text()) } else { t.SecondClosestCommentLines = splitLines(b.priorCommentLines(c1.List[0].Slash, 2).Text()) } } tf, ok := obj.(*tc.Func) // We only care about functions, not concrete/abstract methods. if ok && tf.Type() != nil && tf.Type().(*tc.Signature).Recv() == nil { b.addFunction(*u, nil, tf) } tv, ok := obj.(*tc.Var) if ok && !tv.IsField() { b.addVariable(*u, nil, tv) } } for p := range b.importGraph[pkgPath] { u.AddImports(pkgPath, p) } u.Package(pkgPath).Name = pkg.Name() return nil }
// findTypesIn finalizes the package import and searches through the package // for types. func (b *Builder) findTypesIn(pkgPath importPathString, u *types.Universe) error { glog.V(5).Infof("findTypesIn %s", pkgPath) pkg := b.typeCheckedPackages[pkgPath] if pkg == nil { return fmt.Errorf("findTypesIn(%s): package is not known", pkgPath) } if !b.userRequested[pkgPath] { // Since walkType is recursive, all types that the // packages they asked for depend on will be included. // But we don't need to include all types in all // *packages* they depend on. glog.V(5).Infof("findTypesIn %s: package is not user requested", pkgPath) return nil } // We're keeping this package. This call will create the record. u.Package(string(pkgPath)).Name = pkg.Name() u.Package(string(pkgPath)).Path = pkg.Path() u.Package(string(pkgPath)).SourcePath = b.absPaths[pkgPath] for _, f := range b.parsed[pkgPath] { if strings.HasSuffix(f.name, "/doc.go") { tp := u.Package(string(pkgPath)) for i := range f.file.Comments { tp.Comments = append(tp.Comments, splitLines(f.file.Comments[i].Text())...) } if f.file.Doc != nil { tp.DocComments = splitLines(f.file.Doc.Text()) } } } s := pkg.Scope() for _, n := range s.Names() { obj := s.Lookup(n) tn, ok := obj.(*tc.TypeName) if ok { t := b.walkType(*u, nil, tn.Type()) c1 := b.priorCommentLines(obj.Pos(), 1) // c1.Text() is safe if c1 is nil t.CommentLines = splitLines(c1.Text()) if c1 == nil { t.SecondClosestCommentLines = splitLines(b.priorCommentLines(obj.Pos(), 2).Text()) } else { t.SecondClosestCommentLines = splitLines(b.priorCommentLines(c1.List[0].Slash, 2).Text()) } } tf, ok := obj.(*tc.Func) // We only care about functions, not concrete/abstract methods. if ok && tf.Type() != nil && tf.Type().(*tc.Signature).Recv() == nil { t := b.addFunction(*u, nil, tf) c1 := b.priorCommentLines(obj.Pos(), 1) // c1.Text() is safe if c1 is nil t.CommentLines = splitLines(c1.Text()) if c1 == nil { t.SecondClosestCommentLines = splitLines(b.priorCommentLines(obj.Pos(), 2).Text()) } else { t.SecondClosestCommentLines = splitLines(b.priorCommentLines(c1.List[0].Slash, 2).Text()) } } tv, ok := obj.(*tc.Var) if ok && !tv.IsField() { b.addVariable(*u, nil, tv) } } for p := range b.importGraph[pkgPath] { u.AddImports(string(pkgPath), p) } return nil }