Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not parse operations in dependency #1432

Merged
merged 4 commits into from
Dec 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions golist.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,15 @@ func (parser *Parser) getAllGoFileInfoFromDepsByList(pkg *build.Package) error {
srcDir := pkg.Dir
var err error
for i := range pkg.GoFiles {
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.GoFiles[i]), nil)
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.GoFiles[i]), nil, ParseModels)
if err != nil {
return err
}
}

// parse .go source files that import "C"
for i := range pkg.CgoFiles {
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.CgoFiles[i]), nil)
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.CgoFiles[i]), nil, ParseModels)
if err != nil {
return err
}
Expand Down
11 changes: 6 additions & 5 deletions packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,18 @@ func NewPackagesDefinitions() *PackagesDefinitions {
}

// ParseFile parse a source file.
func (pkgDefs *PackagesDefinitions) ParseFile(packageDir, path string, src interface{}) error {
func (pkgDefs *PackagesDefinitions) ParseFile(packageDir, path string, src interface{}, flag ParseFlag) error {
// positions are relative to FileSet
fileSet := token.NewFileSet()
astFile, err := goparser.ParseFile(fileSet, path, src, goparser.ParseComments)
if err != nil {
return fmt.Errorf("failed to parse file %s, error:%+v", path, err)
}
return pkgDefs.collectAstFile(fileSet, packageDir, path, astFile)
return pkgDefs.collectAstFile(fileSet, packageDir, path, astFile, flag)
}

// collectAstFile collect ast.file.
func (pkgDefs *PackagesDefinitions) collectAstFile(fileSet *token.FileSet, packageDir, path string, astFile *ast.File) error {
func (pkgDefs *PackagesDefinitions) collectAstFile(fileSet *token.FileSet, packageDir, path string, astFile *ast.File, flag ParseFlag) error {
if pkgDefs.files == nil {
pkgDefs.files = make(map[*ast.File]*AstFileInfo)
}
Expand Down Expand Up @@ -81,13 +81,14 @@ func (pkgDefs *PackagesDefinitions) collectAstFile(fileSet *token.FileSet, packa
File: astFile,
Path: path,
PackagePath: packageDir,
ParseFlag: flag,
}

return nil
}

// RangeFiles for range the collection of ast.File in alphabetic order.
func (pkgDefs *PackagesDefinitions) RangeFiles(handle func(filename string, file *ast.File) error) error {
func (pkgDefs *PackagesDefinitions) RangeFiles(handle func(info *AstFileInfo) error) error {
sortedFiles := make([]*AstFileInfo, 0, len(pkgDefs.files))
for _, info := range pkgDefs.files {
// ignore package path prefix with 'vendor' or $GOROOT,
Expand All @@ -103,7 +104,7 @@ func (pkgDefs *PackagesDefinitions) RangeFiles(handle func(filename string, file
})

for _, info := range sortedFiles {
err := handle(info.Path, info.File)
err := handle(info)
if err != nil {
return err
}
Expand Down
21 changes: 11 additions & 10 deletions packages_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,22 @@ import (
func TestPackagesDefinitions_ParseFile(t *testing.T) {
pd := PackagesDefinitions{}
packageDir := "github.com/swaggo/swag/testdata/simple"
assert.NoError(t, pd.ParseFile(packageDir, "testdata/simple/main.go", nil))
assert.NoError(t, pd.ParseFile(packageDir, "testdata/simple/main.go", nil, ParseAll))
assert.Equal(t, 1, len(pd.packages))
assert.Equal(t, 1, len(pd.files))
}

func TestPackagesDefinitions_collectAstFile(t *testing.T) {
pd := PackagesDefinitions{}
fileSet := token.NewFileSet()
assert.NoError(t, pd.collectAstFile(fileSet, "", "", nil))
assert.NoError(t, pd.collectAstFile(fileSet, "", "", nil, ParseAll))

firstFile := &ast.File{
Name: &ast.Ident{Name: "main.go"},
}

packageDir := "github.com/swaggo/swag/testdata/simple"
assert.NoError(t, pd.collectAstFile(fileSet, packageDir, "testdata/simple/"+firstFile.Name.String(), firstFile))
assert.NoError(t, pd.collectAstFile(fileSet, packageDir, "testdata/simple/"+firstFile.Name.String(), firstFile, ParseAll))
assert.NotEmpty(t, pd.packages[packageDir])

absPath, _ := filepath.Abs("testdata/simple/" + firstFile.Name.String())
Expand All @@ -37,18 +37,19 @@ func TestPackagesDefinitions_collectAstFile(t *testing.T) {
File: firstFile,
Path: absPath,
PackagePath: packageDir,
ParseFlag: ParseAll,
}
assert.Equal(t, pd.files[firstFile], astFileInfo)

// Override
assert.NoError(t, pd.collectAstFile(fileSet, packageDir, "testdata/simple/"+firstFile.Name.String(), firstFile))
assert.NoError(t, pd.collectAstFile(fileSet, packageDir, "testdata/simple/"+firstFile.Name.String(), firstFile, ParseAll))
assert.Equal(t, pd.files[firstFile], astFileInfo)

// Another file
secondFile := &ast.File{
Name: &ast.Ident{Name: "api.go"},
}
assert.NoError(t, pd.collectAstFile(fileSet, packageDir, "testdata/simple/"+secondFile.Name.String(), secondFile))
assert.NoError(t, pd.collectAstFile(fileSet, packageDir, "testdata/simple/"+secondFile.Name.String(), secondFile, ParseAll))
}

func TestPackagesDefinitions_rangeFiles(t *testing.T) {
Expand All @@ -72,8 +73,8 @@ func TestPackagesDefinitions_rangeFiles(t *testing.T) {
}

i, expect := 0, []string{"testdata/simple/api/api.go", "testdata/simple/main.go"}
_ = pd.RangeFiles(func(filename string, file *ast.File) error {
assert.Equal(t, expect[i], filename)
_ = pd.RangeFiles(func(fileInfo *AstFileInfo) error {
assert.Equal(t, expect[i], fileInfo.Path)
i++
return nil
})
Expand Down Expand Up @@ -225,14 +226,14 @@ func TestPackage_rangeFiles(t *testing.T) {
}

var sorted []string
processor := func(filename string, file *ast.File) error {
sorted = append(sorted, filename)
processor := func(fileInfo *AstFileInfo) error {
sorted = append(sorted, fileInfo.Path)
return nil
}
assert.NoError(t, pd.RangeFiles(processor))
assert.Equal(t, []string{"testdata/simple/api/api.go", "testdata/simple/main.go"}, sorted)

assert.Error(t, pd.RangeFiles(func(filename string, file *ast.File) error {
assert.Error(t, pd.RangeFiles(func(fileInfo *AstFileInfo) error {
return ErrFuncTypeField
}))

Expand Down
33 changes: 25 additions & 8 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,20 @@ const (
scopeAttrPrefix = "@scope."
)

// ParseFlag determine what to parse
type ParseFlag int

const (
// ParseNone parse nothing
ParseNone ParseFlag = 0x00
// ParseOperations parse operations
ParseOperations = 0x01
// ParseModels parse models
ParseModels = 0x02
// ParseAll parse operations and models
ParseAll = ParseOperations | ParseModels
)

var (
// ErrRecursiveParseStruct recursively parsing struct.
ErrRecursiveParseStruct = errors.New("recursively parsing struct")
Expand Down Expand Up @@ -866,18 +880,21 @@ func matchExtension(extensionToMatch string, comments []*ast.Comment) (match boo
}

// ParseRouterAPIInfo parses router api info for given astFile.
func (parser *Parser) ParseRouterAPIInfo(fileName string, astFile *ast.File) error {
for _, astDescription := range astFile.Decls {
func (parser *Parser) ParseRouterAPIInfo(fileInfo *AstFileInfo) error {
for _, astDescription := range fileInfo.File.Decls {
if (fileInfo.ParseFlag & ParseOperations) == ParseNone {
continue
}
astDeclaration, ok := astDescription.(*ast.FuncDecl)
if ok && astDeclaration.Doc != nil && astDeclaration.Doc.List != nil {
if parser.matchTags(astDeclaration.Doc.List) &&
matchExtension(parser.parseExtension, astDeclaration.Doc.List) {
// for per 'function' comment, create a new 'Operation' object
operation := NewOperation(parser, SetCodeExampleFilesDirectory(parser.codeExampleFilesDir))
for _, comment := range astDeclaration.Doc.List {
err := operation.ParseComment(comment.Text, astFile)
err := operation.ParseComment(comment.Text, fileInfo.File)
if err != nil {
return fmt.Errorf("ParseComment error in file %s :%+v", fileName, err)
return fmt.Errorf("ParseComment error in file %s :%+v", fileInfo.Path, err)
}
}
err := processRouterOperation(parser, operation)
Expand Down Expand Up @@ -1518,7 +1535,7 @@ func (parser *Parser) getAllGoFileInfo(packageDir, searchDir string) error {
return err
}

return parser.parseFile(filepath.ToSlash(filepath.Dir(filepath.Clean(filepath.Join(packageDir, relPath)))), path, nil)
return parser.parseFile(filepath.ToSlash(filepath.Dir(filepath.Clean(filepath.Join(packageDir, relPath)))), path, nil, ParseAll)
})
}

Expand Down Expand Up @@ -1546,7 +1563,7 @@ func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg) error {
}

path := filepath.Join(srcDir, f.Name())
if err := parser.parseFile(pkg.Name, path, nil); err != nil {
if err := parser.parseFile(pkg.Name, path, nil, ParseModels); err != nil {
return err
}
}
Expand All @@ -1560,12 +1577,12 @@ func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg) error {
return nil
}

func (parser *Parser) parseFile(packageDir, path string, src interface{}) error {
func (parser *Parser) parseFile(packageDir, path string, src interface{}, flag ParseFlag) error {
if strings.HasSuffix(strings.ToLower(path), "_test.go") || filepath.Ext(path) != ".go" {
return nil
}

return parser.packages.ParseFile(packageDir, path, src)
return parser.packages.ParseFile(packageDir, path, src, flag)
}

func (parser *Parser) checkOperationIDUniqueness() error {
Expand Down
Loading