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