apidiff: handle TypeParam in order to handle generic code

This enables apidiff to handle code that uses generics, whereas currently it
panics when it encounters it.

Change-Id: Ic77561fd4f269d2060da76ccdaab9166ec65e7ca
Reviewed-on: https://go-review.googlesource.com/c/exp/+/410855
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/apidiff/correspondence.go b/apidiff/correspondence.go
index 00b314b..34ce797 100644
--- a/apidiff/correspondence.go
+++ b/apidiff/correspondence.go
@@ -126,6 +126,13 @@
 			return d.establishCorrespondence(old, new)
 		}
 
+	case *types.TypeParam:
+		if new, ok := new.(*types.TypeParam); ok {
+			if old.Index() == new.Index() {
+				return true
+			}
+		}
+
 	default:
 		panic(fmt.Sprintf("unknown type kind %T", old))
 	}
diff --git a/cmd/gorelease/testdata/generics/changed_param.test b/cmd/gorelease/testdata/generics/changed_param.test
new file mode 100644
index 0000000..e989e5a
--- /dev/null
+++ b/cmd/gorelease/testdata/generics/changed_param.test
@@ -0,0 +1,25 @@
+mod=example.com/generics
+base=v0.0.1
+-- want --
+# example.com/generics/a
+## incompatible changes
+Foo[V any].Value: changed from func() V to func() any
+## compatible changes
+Number: added
+
+# summary
+Suggested version: v0.1.0
+-- go.mod --
+module example.com/generics
+
+go 1.18
+-- a/a.go --
+package a
+
+type Number interface {
+    int64 | float64
+}
+
+type Foo[V Number] interface {
+    Value() any
+}
diff --git a/cmd/gorelease/testdata/generics/changed_return.test b/cmd/gorelease/testdata/generics/changed_return.test
new file mode 100644
index 0000000..1592d64
--- /dev/null
+++ b/cmd/gorelease/testdata/generics/changed_return.test
@@ -0,0 +1,19 @@
+mod=example.com/generics
+base=v0.0.1
+-- want --
+# example.com/generics/a
+## incompatible changes
+Foo[V any].Value: changed from func() V to func() int
+
+# summary
+Suggested version: v0.1.0
+-- go.mod --
+module example.com/generics
+
+go 1.18
+-- a/a.go --
+package a
+
+type Foo[V any] interface {
+    Value() int
+}
diff --git a/cmd/gorelease/testdata/generics/unchanged.test b/cmd/gorelease/testdata/generics/unchanged.test
new file mode 100644
index 0000000..6cf0d05
--- /dev/null
+++ b/cmd/gorelease/testdata/generics/unchanged.test
@@ -0,0 +1,15 @@
+mod=example.com/generics
+base=v0.0.1
+-- want --
+# summary
+Suggested version: v0.0.2
+-- go.mod --
+module example.com/generics
+
+go 1.18
+-- a/a.go --
+package a
+
+type Foo[V any] interface {
+    Value() V
+}
diff --git a/cmd/gorelease/testdata/mod/example.com_generics_v0.0.1.txt b/cmd/gorelease/testdata/mod/example.com_generics_v0.0.1.txt
new file mode 100644
index 0000000..31993b0
--- /dev/null
+++ b/cmd/gorelease/testdata/mod/example.com_generics_v0.0.1.txt
@@ -0,0 +1,14 @@
+-- go.mod --
+module example.com/generics
+
+go 1.18
+-- a/a.go --
+package a
+
+type Urk[T any] interface {
+    Value() T
+}
+
+type Foo[V any] interface {
+    Value() V
+}