3838)
3939
4040const (
41- docCommentForceIncludes = "// +gencrdrefdocs:force"
41+ docCommentForceIncludes = "+gencrdrefdocs:force"
42+ docCommentIncludeUnversionedTypes = "+gencrdrefdocs:unversionedTypes"
4243)
4344
4445type generatorConfig struct {
@@ -130,22 +131,31 @@ func main() {
130131 }
131132
132133 klog .Infof ("parsing go packages in directory %s" , * flAPIDir )
133- pkgs , err := parseAPIPackages (* flAPIDir )
134+ pkgs , unversionedPkgs , err := parseAPIPackages (* flAPIDir )
134135 if err != nil {
135136 klog .Fatal (err )
136137 }
137138 if len (pkgs ) == 0 {
138139 klog .Fatalf ("no API packages found in %s" , * flAPIDir )
139140 }
140141
141- apiPackages , err := combineAPIPackages (pkgs )
142+ var unversionedPkgNames []string
143+ for _ , uvp := range unversionedPkgs {
144+ unversionedPkgNames = append (unversionedPkgNames , uvp .Path )
145+ }
146+ apiPackages , err := combineAPIPackages (pkgs , unversionedPkgNames )
147+ if err != nil {
148+ klog .Fatal (err )
149+ }
150+
151+ unversionedAPIPackages , err := combineAPIPackages (unversionedPkgs , unversionedPkgNames )
142152 if err != nil {
143153 klog .Fatal (err )
144154 }
145155
146156 mkOutput := func () (string , error ) {
147157 var b bytes.Buffer
148- err := render (& b , apiPackages , config )
158+ err := render (& b , apiPackages , unversionedAPIPackages , config )
149159 if err != nil {
150160 return "" , errors .Wrap (err , "failed to render the result" )
151161 }
@@ -200,16 +210,17 @@ func groupName(pkg *types.Package) string {
200210 return ""
201211}
202212
203- func parseAPIPackages (dir string ) ([]* types.Package , error ) {
213+ func parseAPIPackages (dir string ) ([]* types.Package , [] * types. Package , error ) {
204214 b := parser .New ()
205215 // the following will silently fail (turn on -v=4 to see logs)
206216 if err := b .AddDirRecursive (* flAPIDir ); err != nil {
207- return nil , err
217+ return nil , nil , err
208218 }
209219 scan , err := b .FindTypes ()
210220 if err != nil {
211- return nil , errors .Wrap (err , "failed to parse pkgs and types" )
221+ return nil , nil , errors .Wrap (err , "failed to parse pkgs and types" )
212222 }
223+ var unversionedPkgs []* types.Package
213224 var pkgNames []string
214225 for p := range scan {
215226 pkg := scan [p ]
@@ -223,7 +234,10 @@ func parseAPIPackages(dir string) ([]*types.Package, error) {
223234 continue
224235 }
225236
226- if groupName (pkg ) != "" && len (pkg .Types ) > 0 || containsString (pkg .DocComments , docCommentForceIncludes ) {
237+ if len (pkg .Types ) > 0 && containsString (pkg .DocComments , docCommentIncludeUnversionedTypes ) {
238+ klog .Infof ("including package=%s as an additional unversioned include" , p )
239+ unversionedPkgs = append (unversionedPkgs , pkg )
240+ } else if groupName (pkg ) != "" && len (pkg .Types ) > 0 || containsString (pkg .DocComments , docCommentForceIncludes ) {
227241 klog .V (3 ).Infof ("package=%v has groupName and has types" , p )
228242 pkgNames = append (pkgNames , p )
229243 }
@@ -234,7 +248,7 @@ func parseAPIPackages(dir string) ([]*types.Package, error) {
234248 klog .Infof ("using package=%s" , p )
235249 pkgs = append (pkgs , scan [p ])
236250 }
237- return pkgs , nil
251+ return pkgs , unversionedPkgs , nil
238252}
239253
240254func containsString (sl []string , str string ) bool {
@@ -248,7 +262,7 @@ func containsString(sl []string, str string) bool {
248262
249263// combineAPIPackages groups the Go packages by the <apiGroup+apiVersion> they
250264// offer, and combines the types in them.
251- func combineAPIPackages (pkgs []* types.Package ) ([]* apiPackage , error ) {
265+ func combineAPIPackages (pkgs []* types.Package , unversionedPkgNames [] string ) ([]* apiPackage , error ) {
252266 pkgMap := make (map [string ]* apiPackage )
253267 var pkgIds []string
254268
@@ -263,7 +277,7 @@ func combineAPIPackages(pkgs []*types.Package) ([]*apiPackage, error) {
263277 }
264278
265279 for _ , pkg := range pkgs {
266- apiGroup , apiVersion , err := apiVersionForPackage (pkg )
280+ apiGroup , apiVersion , err := apiVersionForPackage (pkg , unversionedPkgNames )
267281 if err != nil {
268282 return nil , errors .Wrapf (err , "could not get apiVersion for package %s" , pkg .Path )
269283 }
@@ -597,8 +611,13 @@ func isOptionalMember(m types.Member) bool {
597611 return ok
598612}
599613
600- func apiVersionForPackage (pkg * types.Package ) (string , string , error ) {
614+ func apiVersionForPackage (pkg * types.Package , unversionedPkgNames [] string ) (string , string , error ) {
601615 group := groupName (pkg )
616+ for _ , upn := range unversionedPkgNames {
617+ if upn == pkg .Path {
618+ return group , "unversioned" , nil
619+ }
620+ }
602621 version := pkg .Name // assumes basename (i.e. "v1" in "core/v1") is apiVersion
603622 r := `^v\d+((alpha|beta)[a-z0-9]+)?$`
604623 if ! regexp .MustCompile (r ).MatchString (version ) {
@@ -648,9 +667,9 @@ func constantsOfType(t *types.Type, pkg *apiPackage) []*types.Type {
648667 return sortTypes (constants )
649668}
650669
651- func render (w io.Writer , pkgs []* apiPackage , config generatorConfig ) error {
652- references := findTypeReferences (pkgs )
653- typePkgMap := extractTypeToPackageMap (pkgs )
670+ func render (w io.Writer , pkgs []* apiPackage , unversionedPkgs [] * apiPackage , config generatorConfig ) error {
671+ references := findTypeReferences (append ( pkgs , unversionedPkgs ... ) )
672+ typePkgMap := extractTypeToPackageMap (append ( pkgs , unversionedPkgs ... ) )
654673
655674 t , err := template .New ("" ).Funcs (map [string ]interface {}{
656675 "isExportedType" : isExportedType ,
0 commit comments