Skip to content

Commit 6ce2d5a

Browse files
abayertekton-robot
authored andcommitted
Support additional unversioned types
github.com/tektoncd/pipeline has an additional type in https://github.com/tektoncd/pipeline/tree/main/pkg/apis/pipeline/pod which isn't versioned, and shouldn't be its own package section in the generated doc, but is referenced in versioned packages under `pkg/apis/pipeline`. This probably isn't the ideal way to have things set up, but it's what we've got. In order to use this tool to generate reference docs for Tekton Pipeline properly, we need to include the type in that package. To enable that, this adds an additional doc comment, `+gencrdrefdocs:unversionedTypes`. When that is found in a package's `doc.go` and that package isn't already being included normally, its types will be made available for reference by the "real" API packages, with `unversioned` as their version. I also fixed the existing `docCommentForceIncludes` - `pkg.DocComments` doesn't include the `// ` prefix, so searching for `// +gencrdrefdocs:force` would always fail. Therefore, I removed the `// ` prefix. Signed-off-by: Andrew Bayer <[email protected]>
1 parent 8a27bc3 commit 6ce2d5a

File tree

1 file changed

+34
-15
lines changed

1 file changed

+34
-15
lines changed

main.go

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ var (
3838
)
3939

4040
const (
41-
docCommentForceIncludes = "// +gencrdrefdocs:force"
41+
docCommentForceIncludes = "+gencrdrefdocs:force"
42+
docCommentIncludeUnversionedTypes = "+gencrdrefdocs:unversionedTypes"
4243
)
4344

4445
type 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

240254
func 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

Comments
 (0)