diff --git a/internal/breakings/syntax/types/same_test.go b/internal/breakings/syntax/types/same_test.go
index a07cd20..0c4afda 100644
--- a/internal/breakings/syntax/types/same_test.go
+++ b/internal/breakings/syntax/types/same_test.go
@@ -76,3 +76,28 @@
})
}
}
+
+func TestArrayTypeSame(t *testing.T) {
+ tests := []struct {
+ name string
+ a1 *ArrayType
+ t2 Type
+ want tri.Bool
+ }{
+ {"both slice same elt", &ArrayType{Elt: tInt}, &ArrayType{Elt: tInt}, tri.Yes},
+ {"both slice diff elt", &ArrayType{Elt: tInt}, &ArrayType{Elt: tString}, tri.No},
+ {"slice vs array", &ArrayType{Elt: tInt}, &ArrayType{Len: "10", Elt: tInt}, tri.No},
+ {"both array same len same elt", &ArrayType{Len: "10", Elt: tInt}, &ArrayType{Len: "10", Elt: tInt}, tri.Yes},
+ {"both array diff len", &ArrayType{Len: "10", Elt: tInt}, &ArrayType{Len: "2*5", Elt: tInt}, tri.Maybe},
+ {"vs imported named", &ArrayType{Elt: tInt}, tImpA, tri.Maybe},
+ {"vs bad type", &ArrayType{Elt: tInt}, tBad, tri.Maybe},
+ {"vs local named", &ArrayType{Elt: tInt}, tInt, tri.No},
+ }
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ if got := tc.a1.Same(tc.t2); got != tc.want {
+ t.Errorf("%s.Same(%s) = %v, want %v", tc.a1, tc.t2, got, tc.want)
+ }
+ })
+ }
+}
diff --git a/internal/breakings/syntax/types/types.go b/internal/breakings/syntax/types/types.go
index f70a417..ad1b597 100644
--- a/internal/breakings/syntax/types/types.go
+++ b/internal/breakings/syntax/types/types.go
@@ -121,7 +121,23 @@
return fmt.Sprintf("[%s]%s", t.Len, t.Elt.String())
}
-func (*ArrayType) Same(Type) tri.Bool { panic("unimplemented") }
+func (a1 *ArrayType) Same(t Type) tri.Bool {
+ if a2, ok := t.(*ArrayType); ok {
+ if (a1.Len == "") != (a2.Len == "") {
+ // slice vs. array
+ return tri.No
+ }
+ if a1.Len != a2.Len {
+ // maybe one is a literal and the other is a const.
+ return tri.Maybe
+ }
+ return a1.Elt.Same(a2.Elt)
+ }
+ if badOrPossibleAlias(t) {
+ return tri.Maybe
+ }
+ return tri.No
+}
// MapType is the syntax for a map type.
type MapType struct {