diff options
| author | Taras Madan <tarasmadan@google.com> | 2023-02-22 22:16:50 +0100 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2023-02-24 12:47:23 +0100 |
| commit | 4165372ec8fd142475a4e35fd0cf4f8042132208 (patch) | |
| tree | 21cd62211b4dd80bee469054c5b65db77342333c /vendor/github.com/daixiang0/gci/pkg/parse/parse.go | |
| parent | 2b3ed821a493b8936c8bacfa6f8b4f1c90a00855 (diff) | |
dependencies: update
set go min requirements to 1.19
update dependencies
update vendor
Diffstat (limited to 'vendor/github.com/daixiang0/gci/pkg/parse/parse.go')
| -rw-r--r-- | vendor/github.com/daixiang0/gci/pkg/parse/parse.go | 106 |
1 files changed, 82 insertions, 24 deletions
diff --git a/vendor/github.com/daixiang0/gci/pkg/parse/parse.go b/vendor/github.com/daixiang0/gci/pkg/parse/parse.go index d84ed1335..33d6e1705 100644 --- a/vendor/github.com/daixiang0/gci/pkg/parse/parse.go +++ b/vendor/github.com/daixiang0/gci/pkg/parse/parse.go @@ -8,6 +8,8 @@ import ( "strings" ) +const C = "\"C\"" + type GciImports struct { // original index of import group, include doc, name, path and comment Start, End int @@ -68,41 +70,96 @@ func getImports(imp *ast.ImportSpec) (start, end int, name string) { return } -func ParseFile(src []byte, filename string) (ImportList, int, int, error) { +func ParseFile(src []byte, filename string) (ImportList, int, int, int, int, error) { fileSet := token.NewFileSet() f, err := parser.ParseFile(fileSet, filename, src, parser.ParseComments) if err != nil { - return nil, 0, 0, err + return nil, 0, 0, 0, 0, err } if len(f.Imports) == 0 { - return nil, 0, 0, NoImportError{} + return nil, 0, 0, 0, 0, NoImportError{} } - var headEnd int - var tailStart int - - var data ImportList - for i, imp := range f.Imports { - start, end, name := getImports(imp) + var ( + // headEnd means the start of import block + headEnd int + // tailStart means the end + 1 of import block + tailStart int + // cStart means the start of C import block + cStart int + // cEnd means the end of C import block + cEnd int + data ImportList + ) - if i == 0 { - headEnd = start + for index, decl := range f.Decls { + switch decl.(type) { + // skip BadDecl and FuncDecl + case *ast.GenDecl: + genDecl := decl.(*ast.GenDecl) + + if genDecl.Tok == token.IMPORT { + // there are two cases, both end with linebreak: + // 1. + // import ( + // "xxxx" + // ) + // 2. + // import "xxx" + if headEnd == 0 { + headEnd = int(decl.Pos()) - 1 + } + tailStart = int(decl.End()) + + for _, spec := range genDecl.Specs { + imp := spec.(*ast.ImportSpec) + // there are only one C import block + // ensure C import block is the first import block + if imp.Path.Value == C { + /* + common case: + + // #include <png.h> + import "C" + + notice that decl.Pos() == genDecl.Pos() > genDecl.Doc.Pos() + */ + if genDecl.Doc != nil { + cStart = int(genDecl.Doc.Pos()) - 1 + // if C import block is the first, update headEnd + if index == 0 { + headEnd = cStart + } + } else { + /* + special case: + + import "C" + */ + cStart = int(decl.Pos()) - 1 + } + + cEnd = int(decl.End()) + + continue + } + + start, end, name := getImports(imp) + + data = append(data, &GciImports{ + Start: start, + End: end, + Name: name, + Path: strings.Trim(imp.Path.Value, `"`), + }) + } + } } - if i == len(f.Imports)-1 { - tailStart = end - } - - data = append(data, &GciImports{ - Start: start, - End: end, - Name: name, - Path: strings.Trim(imp.Path.Value, `"`), - }) } sort.Sort(data) - return data, headEnd, tailStart, nil + return data, headEnd, tailStart, cStart, cEnd, nil } // IsGeneratedFileByComment reports whether the source file is generated code. @@ -113,10 +170,11 @@ func IsGeneratedFileByComment(in string) bool { const ( genCodeGenerated = "code generated" genDoNotEdit = "do not edit" - genAutoFile = "autogenerated file" // easyjson + genAutoFile = "autogenerated file" // easyjson + genAutoGenerated = "automatically generated" // genny ) - markers := []string{genCodeGenerated, genDoNotEdit, genAutoFile} + markers := []string{genCodeGenerated, genDoNotEdit, genAutoFile, genAutoGenerated} in = strings.ToLower(in) for _, marker := range markers { if strings.Contains(in, marker) { |
