diff --git a/pkg/kernel/lib/src/dart_type_equivalence.dart b/pkg/kernel/lib/src/dart_type_equivalence.dart index 630108546664..cd7ecbf8c475 100644 --- a/pkg/kernel/lib/src/dart_type_equivalence.dart +++ b/pkg/kernel/lib/src/dart_type_equivalence.dart @@ -129,18 +129,19 @@ class DartTypeEquivalence implements DartTypeVisitor1 { } } - // The named fields of [RecordType]s are supposed to be sorted, so we can - // use a linear search to compare them. - int nodeIndex = 0; - int otherIndex = 0; - while (result && nodeIndex < node.named.length) { - NamedType nodeNamedType = node.named[nodeIndex]; - NamedType otherNamedType = other.named[otherIndex]; + // The named fields of [RecordType]s are supposed to be sorted and we know + // there are the same number of named fields, so we can use a linear + // search to compare them. + int i = 0; + while (result && i < node.named.length) { + NamedType nodeNamedType = node.named[i]; + NamedType otherNamedType = other.named[i]; if (nodeNamedType.name != otherNamedType.name) { result = false; } else { result = nodeNamedType.type.accept1(this, otherNamedType.type); } + i++; } return result; diff --git a/pkg/kernel/test/dart_type_equivalence_test.dart b/pkg/kernel/test/dart_type_equivalence_test.dart index fdb27ebed3cf..8e8f5daf6acc 100644 --- a/pkg/kernel/test/dart_type_equivalence_test.dart +++ b/pkg/kernel/test/dart_type_equivalence_test.dart @@ -162,6 +162,22 @@ void run() { notEqual("Typedef?", "Typedef", equateTopTypes: true); areEqual("Typedef?", "Typedef", equateTopTypes: true, ignoreTopLevelNullability: true); + + // Record types. + areEqual("(int, bool)", "(int, bool)"); + notEqual("(int, bool)", "(int?, bool)"); + notEqual("(int, bool)", "(int, bool?)"); + notEqual("(int, bool)", "({int i, bool b})"); + areEqual("({int i, bool b})", "({int i, bool b})"); + areEqual("({int i, bool b})", "({bool b ,int i})"); + notEqual("({int i, bool b})", "({int? i, bool b})"); + notEqual("({int i, bool b})", "({int i, bool? b})"); + notEqual("({int i, bool b})", "({int n, bool b})"); + notEqual("({int i, bool b})", "({int i, bool t})"); + areEqual("(int, {bool b})", "(int, {bool b})"); + notEqual("(int, {bool b})", "(int?, {bool b})"); + notEqual("(int, {bool b})", "(int, {bool? b})"); + notEqual("(int, {bool b})", "(int, {bool t})"); } void areEqual(String type1, String type2,