Add check for MixedCaps in package name

Lint already checks for underscores in package names, but did not yet
check for lower case names. The section on Package names in the
Effective Go document states that "By convention, packages packages are
given lower case, single-word names; there should be no need for
underscores or mixedCaps."

GitHub-Last-Rev: 91b0fc6545806c03760f2ceef4d148271965bbc9
GitHub-Pull-Request: golang/lint#285
Change-Id: Ibb234166360b67f0f561b463a951a87399cad1d3
Reviewed-on: https://go-review.googlesource.com/96080
Reviewed-by: Andrew Bonventre <andybons@golang.org>
diff --git a/lint.go b/lint.go
index 8bb1faa..946936e 100644
--- a/lint.go
+++ b/lint.go
@@ -527,7 +527,10 @@
 	})
 }
 
-var allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`)
+var (
+	allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`)
+	anyCapsRE = regexp.MustCompile(`[A-Z]`)
+)
 
 // knownNameExceptions is a set of names that are known to be exempt from naming checks.
 // This is usually because they are constrained by having to match names in the
@@ -544,6 +547,9 @@
 	if strings.Contains(f.f.Name.Name, "_") && !strings.HasSuffix(f.f.Name.Name, "_test") {
 		f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("naming"), "don't use an underscore in package name")
 	}
+	if anyCapsRE.MatchString(f.f.Name.Name) {
+		f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("mixed-caps"), "don't use MixedCaps in package name; %s should be %s", f.f.Name.Name, strings.ToLower(f.f.Name.Name))
+	}
 
 	check := func(id *ast.Ident, thing string) {
 		if id.Name == "_" {
diff --git a/testdata/pkg-caps.go b/testdata/pkg-caps.go
new file mode 100644
index 0000000..72225d7
--- /dev/null
+++ b/testdata/pkg-caps.go
@@ -0,0 +1,4 @@
+// MixedCaps package name
+
+// Package PkgName ...
+package PkgName // MATCH /don't use MixedCaps in package name/