aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/daixiang0/gci/pkg/parse/parse.go
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2023-02-22 22:16:50 +0100
committerTaras Madan <tarasmadan@google.com>2023-02-24 12:47:23 +0100
commit4165372ec8fd142475a4e35fd0cf4f8042132208 (patch)
tree21cd62211b4dd80bee469054c5b65db77342333c /vendor/github.com/daixiang0/gci/pkg/parse/parse.go
parent2b3ed821a493b8936c8bacfa6f8b4f1c90a00855 (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.go106
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) {