aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/daixiang0/gci/pkg/parse/parse.go
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2022-09-05 14:27:54 +0200
committerGitHub <noreply@github.com>2022-09-05 12:27:54 +0000
commitb2f2446b46bf02821d90ebedadae2bf7ae0e880e (patch)
tree923cf42842918d6bebca1d6bbdc08abed54d274d /vendor/github.com/daixiang0/gci/pkg/parse/parse.go
parente6654faff4bcca4be92e9a8596fd4b77f747c39e (diff)
go.mod, vendor: update (#3358)
* go.mod, vendor: remove unnecessary dependencies Commands: 1. go mod tidy 2. go mod vendor * go.mod, vendor: update cloud.google.com/go Commands: 1. go get -u cloud.google.com/go 2. go mod tidy 3. go mod vendor * go.mod, vendor: update cloud.google.com/* Commands: 1. go get -u cloud.google.com/storage cloud.google.com/logging 2. go mod tidy 3. go mod vendor * go.mod, .golangci.yml, vendor: update *lint* Commands: 1. go get -u golang.org/x/tools github.com/golangci/golangci-lint@v1.47.0 2. go mod tidy 3. go mod vendor 4. edit .golangci.yml to suppress new errors (resolved in the same PR later) * all: fix lint errors hash.go: copy() recommended by gosimple parse.go: ent is never nil verifier.go: signal.Notify() with unbuffered channel is bad. Have no idea why. * .golangci.yml: adjust godot rules check-all is deprecated, but still work if you're hesitating too - I'll remove this commit
Diffstat (limited to 'vendor/github.com/daixiang0/gci/pkg/parse/parse.go')
-rw-r--r--vendor/github.com/daixiang0/gci/pkg/parse/parse.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/vendor/github.com/daixiang0/gci/pkg/parse/parse.go b/vendor/github.com/daixiang0/gci/pkg/parse/parse.go
new file mode 100644
index 000000000..d84ed1335
--- /dev/null
+++ b/vendor/github.com/daixiang0/gci/pkg/parse/parse.go
@@ -0,0 +1,139 @@
+package parse
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "sort"
+ "strings"
+)
+
+type GciImports struct {
+ // original index of import group, include doc, name, path and comment
+ Start, End int
+ Name, Path string
+}
+type ImportList []*GciImports
+
+func (l ImportList) Len() int {
+ return len(l)
+}
+
+func (l ImportList) Less(i, j int) bool {
+ if strings.Compare(l[i].Path, l[j].Path) == 0 {
+ return strings.Compare(l[i].Name, l[j].Name) < 0
+ }
+
+ return strings.Compare(l[i].Path, l[j].Path) < 0
+}
+
+func (l ImportList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
+
+/*
+ * AST considers a import block as below:
+ * ```
+ * Doc
+ * Name Path Comment
+ * ```
+ * An example is like below:
+ * ```
+ * // test
+ * test "fmt" // test
+ * ```
+ * getImports return a import block with name, start and end index
+ */
+func getImports(imp *ast.ImportSpec) (start, end int, name string) {
+ if imp.Doc != nil {
+ // doc poc need minus one to get the first index of comment
+ start = int(imp.Doc.Pos()) - 1
+ } else {
+ if imp.Name != nil {
+ // name pos need minus one too
+ start = int(imp.Name.Pos()) - 1
+ } else {
+ // path pos start without quote, need minus one for it
+ start = int(imp.Path.Pos()) - 1
+ }
+ }
+
+ if imp.Name != nil {
+ name = imp.Name.Name
+ }
+
+ if imp.Comment != nil {
+ end = int(imp.Comment.End())
+ } else {
+ end = int(imp.Path.End())
+ }
+ return
+}
+
+func ParseFile(src []byte, filename string) (ImportList, int, int, error) {
+ fileSet := token.NewFileSet()
+ f, err := parser.ParseFile(fileSet, filename, src, parser.ParseComments)
+ if err != nil {
+ return nil, 0, 0, err
+ }
+
+ if len(f.Imports) == 0 {
+ return nil, 0, 0, NoImportError{}
+ }
+
+ var headEnd int
+ var tailStart int
+
+ var data ImportList
+ for i, imp := range f.Imports {
+ start, end, name := getImports(imp)
+
+ if i == 0 {
+ headEnd = start
+ }
+ 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
+}
+
+// IsGeneratedFileByComment reports whether the source file is generated code.
+// Using a bit laxer rules than https://golang.org/s/generatedcode to
+// match more generated code.
+// Taken from https://github.com/golangci/golangci-lint.
+func IsGeneratedFileByComment(in string) bool {
+ const (
+ genCodeGenerated = "code generated"
+ genDoNotEdit = "do not edit"
+ genAutoFile = "autogenerated file" // easyjson
+ )
+
+ markers := []string{genCodeGenerated, genDoNotEdit, genAutoFile}
+ in = strings.ToLower(in)
+ for _, marker := range markers {
+ if strings.Contains(in, marker) {
+ return true
+ }
+ }
+
+ return false
+}
+
+type NoImportError struct{}
+
+func (n NoImportError) Error() string {
+ return "No imports"
+}
+
+func (i NoImportError) Is(err error) bool {
+ _, ok := err.(NoImportError)
+ return ok
+}