in processor/processor.go [160:227]
func (p *processor) findAPITypes(directory string) error {
cfg := &packages.Config{Dir: directory}
pkgs, err := loader.LoadRootsWithConfig(cfg, "./...")
if err != nil {
return err
}
for _, pkg := range pkgs {
gvInfo := p.extractGroupVersionIfExists(p.parser.Collector, pkg)
if gvInfo == nil {
continue
}
if p.shouldIgnoreGroupVersion(gvInfo.GroupVersion.String()) {
continue
}
// let the parser know that we need this package
p.parser.AddPackage(pkg)
// if we have encountered this GV before, use that instead
if gv, ok := p.groupVersions[gvInfo.GroupVersion]; ok {
gvInfo = gv
} else {
p.groupVersions[gvInfo.GroupVersion] = gvInfo
}
if gvInfo.types == nil {
gvInfo.types = make(types.TypeMap)
}
// locate the kinds
markers.EachType(p.parser.Collector, pkg, func(info *markers.TypeInfo) {
// ignore types explicitly listed by the user
if p.shouldIgnoreType(fmt.Sprintf("%s.%s", pkg.PkgPath, info.Name)) {
return
}
// ignore unexported types
if info.RawSpec.Name == nil || !info.RawSpec.Name.IsExported() {
return
}
// load the type
key := fmt.Sprintf("%s.%s", pkg.PkgPath, info.Name)
typeDef, ok := p.types[key]
if !ok {
typeDef = p.processType(pkg, nil, pkg.TypesInfo.TypeOf(info.RawSpec.Name), 0)
}
if typeDef != nil && typeDef.Kind != types.BasicKind {
gvInfo.types[info.Name] = typeDef
}
// is this a root object?
if root := info.Markers.Get(objectRootMarker); root != nil {
if gvInfo.kinds == nil {
gvInfo.kinds = make(map[string]struct{})
}
gvInfo.kinds[info.Name] = struct{}{}
typeDef.GVK = &schema.GroupVersionKind{Group: gvInfo.Group, Version: gvInfo.Version, Kind: info.Name}
}
})
}
return nil
}