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)
+		}
+	}
+}