go.tools/godoc: sanitize function signatures for object index

Fixes golang/go#7703.

LGTM=bgarcia
R=bgarcia
CC=golang-codereviews
https://golang.org/cl/84410045
diff --git a/godoc/godoc_test.go b/godoc/godoc_test.go
index 955f2f8..76ce946 100644
--- a/godoc/godoc_test.go
+++ b/godoc/godoc_test.go
@@ -16,8 +16,8 @@
 		{"/src/pkg/fmt", "pkg/fmt"},
 		{"/fmt", "pkg/fmt"},
 	} {
-		if got, want := pkgLinkFunc(tc.path), tc.want; got != want {
-			t.Errorf("pkgLinkFunc(%v) = %v; want %v", tc.path, got, want)
+		if got := pkgLinkFunc(tc.path); got != tc.want {
+			t.Errorf("pkgLinkFunc(%v) = %v; want %v", tc.path, got, tc.want)
 		}
 	}
 }
@@ -38,8 +38,8 @@
 		{"fmt/print.go", 0, 0, 0, "/src/pkg/fmt/print.go"},
 		{"fmt/print.go", 0, 1, 5, "/src/pkg/fmt/print.go?s=1:5#L1"},
 	} {
-		if got, want := srcPosLinkFunc(tc.src, tc.line, tc.low, tc.high), tc.want; got != want {
-			t.Errorf("srcLinkFunc(%v, %v, %v, %v) = %v; want %v", tc.src, tc.line, tc.low, tc.high, got, want)
+		if got := srcPosLinkFunc(tc.src, tc.line, tc.low, tc.high); got != tc.want {
+			t.Errorf("srcLinkFunc(%v, %v, %v, %v) = %v; want %v", tc.src, tc.line, tc.low, tc.high, got, tc.want)
 		}
 	}
 }
@@ -54,8 +54,8 @@
 		{"/fmt/print.go", "/src/pkg/fmt/print.go"},
 		{"fmt/print.go", "/src/pkg/fmt/print.go"},
 	} {
-		if got, want := srcLinkFunc(tc.src), tc.want; got != want {
-			t.Errorf("srcLinkFunc(%v) = %v; want %v", tc.src, got, want)
+		if got := srcLinkFunc(tc.src); got != tc.want {
+			t.Errorf("srcLinkFunc(%v) = %v; want %v", tc.src, got, tc.want)
 		}
 	}
 }
@@ -72,8 +72,8 @@
 		{"src/pkg/fmt/print.go", "EOF", 33, "/src/pkg/fmt/print.go?h=EOF#L33"},
 		{"src/pkg/fmt/print.go", "a%3f+%26b", 1, "/src/pkg/fmt/print.go?h=a%3f+%26b#L1"},
 	} {
-		if got, want := queryLinkFunc(tc.src, tc.query, tc.line), tc.want; got != want {
-			t.Errorf("queryLinkFunc(%v, %v, %v) = %v; want %v", tc.src, tc.query, tc.line, got, want)
+		if got := queryLinkFunc(tc.src, tc.query, tc.line); got != tc.want {
+			t.Errorf("queryLinkFunc(%v, %v, %v) = %v; want %v", tc.src, tc.query, tc.line, got, tc.want)
 		}
 	}
 }
@@ -87,8 +87,30 @@
 		{"/src/pkg/fmt", "Sprintf", "/pkg/fmt/#Sprintf"},
 		{"/src/pkg/fmt", "EOF", "/pkg/fmt/#EOF"},
 	} {
-		if got, want := docLinkFunc(tc.src, tc.ident), tc.want; got != want {
-			t.Errorf("docLinkFunc(%v, %v) = %v; want %v", tc.src, tc.ident, got, want)
+		if got := docLinkFunc(tc.src, tc.ident); got != tc.want {
+			t.Errorf("docLinkFunc(%v, %v) = %v; want %v", tc.src, tc.ident, got, tc.want)
+		}
+	}
+}
+
+func TestSanitizeFunc(t *testing.T) {
+	for _, tc := range []struct {
+		src  string
+		want string
+	}{
+		{},
+		{"foo", "foo"},
+		{"func   f()", "func f()"},
+		{"func f(a int,)", "func f(a int)"},
+		{"func f(a int,\n)", "func f(a int)"},
+		{"func f(\n\ta int,\n\tb int,\n\tc int,\n)", "func f(a int, b int, c int)"},
+		{"  (   a,   b,  c  )  ", "(a, b, c)"},
+		{"(  a,  b, c    int, foo   bar  ,  )", "(a, b, c int, foo bar)"},
+		{"{   a,   b}", "{a, b}"},
+		{"[   a,   b]", "[a, b]"},
+	} {
+		if got := sanitizeFunc(tc.src); got != tc.want {
+			t.Errorf("sanitizeFunc(%v) = %v; want %v", tc.src, got, tc.want)
 		}
 	}
 }