Ignore generated code
Fixes #239
diff --git a/lint.go b/lint.go
index a13129c..5b85d8e 100644
--- a/lint.go
+++ b/lint.go
@@ -8,6 +8,7 @@
package lint
import (
+ "bufio"
"bytes"
"fmt"
"go/ast"
@@ -90,6 +91,9 @@
}
var pkgName string
for filename, src := range files {
+ if isGenerated(src) {
+ continue // See issue #239
+ }
f, err := parser.ParseFile(pkg.fset, filename, src, parser.ParseComments)
if err != nil {
return nil, err
@@ -110,6 +114,24 @@
return pkg.lint(), nil
}
+var (
+ genHdr = []byte("// Code generated ")
+ genFtr = []byte(" DO NOT EDIT.")
+)
+
+// isGenerated reports whether the source file is generated code
+// according the rules from https://golang.org/s/generatedcode.
+func isGenerated(src []byte) bool {
+ sc := bufio.NewScanner(bytes.NewReader(src))
+ for sc.Scan() {
+ b := sc.Bytes()
+ if bytes.HasPrefix(b, genHdr) && bytes.HasSuffix(b, genFtr) && len(b) >= len(genHdr)+len(genFtr) {
+ return true
+ }
+ }
+ return false
+}
+
// pkg represents a package being linted.
type pkg struct {
fset *token.FileSet
diff --git a/lint_test.go b/lint_test.go
index c12370f..92db596 100644
--- a/lint_test.go
+++ b/lint_test.go
@@ -288,3 +288,30 @@
}
}
}
+
+func TestIsGenerated(t *testing.T) {
+ tests := []struct {
+ source string
+ generated bool
+ }{
+ {"// Code Generated by some tool. DO NOT EDIT.", false},
+ {"// Code generated by some tool. DO NOT EDIT.", true},
+ {"// Code generated by some tool. DO NOT EDIT", false},
+ {"// Code generated DO NOT EDIT.", true},
+ {"// Code generated DO NOT EDIT.", false},
+ {"\t\t// Code generated by some tool. DO NOT EDIT.\npackage foo\n", false},
+ {"// Code generated by some tool. DO NOT EDIT.\npackage foo\n", true},
+ {"package foo\n// Code generated by some tool. DO NOT EDIT.\ntype foo int\n", true},
+ {"package foo\n // Code generated by some tool. DO NOT EDIT.\ntype foo int\n", false},
+ {"package foo\n// Code generated by some tool. DO NOT EDIT. \ntype foo int\n", false},
+ {"package foo\ntype foo int\n// Code generated by some tool. DO NOT EDIT.\n", true},
+ {"package foo\ntype foo int\n// Code generated by some tool. DO NOT EDIT.", true},
+ }
+
+ for i, test := range tests {
+ got := isGenerated([]byte(test.source))
+ if got != test.generated {
+ t.Errorf("test %d, isGenerated() = %v, want %v", i, got, test.generated)
+ }
+ }
+}