Fix crash on ill-formed receiver type.

Signed-off-by: Joe Tsai <joetsai@google.com>
diff --git a/lint.go b/lint.go
index bbfdaf9..3aaaf2a 100644
--- a/lint.go
+++ b/lint.go
@@ -1437,14 +1437,19 @@
 	})
 }
 
+// receiverType returns the named type of the method receiver, sans "*",
+// or "invalid-type" if fn.Recv is ill formed.
 func receiverType(fn *ast.FuncDecl) string {
 	switch e := fn.Recv.List[0].Type.(type) {
 	case *ast.Ident:
 		return e.Name
 	case *ast.StarExpr:
-		return e.X.(*ast.Ident).Name
+		if id, ok := e.X.(*ast.Ident); ok {
+			return id.Name
+		}
 	}
-	panic(fmt.Sprintf("unknown method receiver AST node type %T", fn.Recv.List[0].Type))
+	// The parser accepts much more than just the legal forms.
+	return "invalid-type"
 }
 
 func (f *file) walk(fn func(ast.Node) bool) {
diff --git a/testdata/receiver-names.go b/testdata/receiver-names.go
index e5f3fa2..5fce725 100644
--- a/testdata/receiver-names.go
+++ b/testdata/receiver-names.go
@@ -39,3 +39,6 @@
 
 func (_ *bar) f7() { // MATCH /receiver name should not be an underscore/
 }
+
+// Regression test for a panic caused by ill-formed receiver type.
+func (recv []*x.y) f()