[cfe] Remove inheritanceConflictCache
Change-Id: I91619b9292a6dd20f657aea9cf8e642ce21ffda5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/158381
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 76b47a0..42c9895 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -243,17 +243,6 @@
void registerOverrideDependency(ClassMember overriddenMember);
}
-/// Returns true if [a] is a class member conflict with [b]. [a] is assumed to
-/// be declared in the class, [b] is assumed to be inherited.
-///
-/// See the section named "Class Member Conflicts" in [Dart Programming
-/// Language Specification](
-/// ../../../../../../docs/language/dartLangSpec.tex#classMemberConflicts).
-bool isInheritanceConflict(ClassMember a, ClassMember b) {
- if (a.isStatic) return true;
- return a.isProperty != b.isProperty;
-}
-
bool hasSameSignature(FunctionNode a, FunctionNode b) {
List<TypeParameter> aTypeParameters = a.typeParameters;
List<TypeParameter> bTypeParameters = b.typeParameters;
@@ -346,9 +335,6 @@
Types types;
- Map<ClassMember, Map<ClassMember, ClassMember>> inheritanceConflictCache =
- new Map.identity();
-
ClassHierarchyBuilder(this.objectClassBuilder, this.loader, this.coreTypes)
: objectClass = objectClassBuilder.cls,
futureClass = coreTypes.futureClass,
@@ -362,7 +348,6 @@
substitutions.clear();
_overrideChecks.clear();
_delayedTypeComputations.clear();
- inheritanceConflictCache.clear();
_delayedMemberChecks.clear();
}
@@ -651,35 +636,10 @@
classBuilder.library.loader == hierarchy.loader;
ClassMember checkInheritanceConflict(ClassMember a, ClassMember b) {
- hierarchy.inheritanceConflictCache[a] ??= new Map.identity();
- if (hierarchy.inheritanceConflictCache[a].containsKey(b)) {
- return hierarchy.inheritanceConflictCache[a][b];
- }
-
- if (a.hasDeclarations) {
- ClassMember result;
- for (int i = 0; i < a.declarations.length; i++) {
- ClassMember d = checkInheritanceConflict(a.declarations[i], b);
- result ??= d;
- }
- hierarchy.inheritanceConflictCache[a][b] = result;
- return result;
- }
- if (b.hasDeclarations) {
- ClassMember result;
- for (int i = 0; i < b.declarations.length; i++) {
- ClassMember d = checkInheritanceConflict(a, b.declarations[i]);
- result ??= d;
- }
- hierarchy.inheritanceConflictCache[a][b] = result;
- return result;
- }
- if (isInheritanceConflict(a, b)) {
+ if (a.isStatic || a.isProperty != b.isProperty) {
reportInheritanceConflict(a, b);
- hierarchy.inheritanceConflictCache[a][b] = a;
return a;
}
- hierarchy.inheritanceConflictCache[a][b] = null;
return null;
}
@@ -2693,7 +2653,10 @@
final Name name;
DelayedMember(this.classBuilder, this.declarations, this.isProperty,
- this.isSetter, this.modifyKernel, this.isExplicitlyAbstract, this.name);
+ this.isSetter, this.modifyKernel, this.isExplicitlyAbstract, this.name) {
+ assert(declarations.every((element) => element.isProperty == isProperty),
+ "isProperty mismatch for $this");
+ }
@override
bool get isSourceDeclaration => false;
diff --git a/pkg/front_end/testcases/general/instance_setter_conflict.dart b/pkg/front_end/testcases/general/instance_setter_conflict.dart
new file mode 100644
index 0000000..c570aaf
--- /dev/null
+++ b/pkg/front_end/testcases/general/instance_setter_conflict.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+ int v;
+}
+
+class C extends A {
+ static int n;
+ static get v {
+ return n;
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/instance_setter_conflict.dart.outline.expect b/pkg/front_end/testcases/general/instance_setter_conflict.dart.outline.expect
new file mode 100644
index 0000000..75a49e7
--- /dev/null
+++ b/pkg/front_end/testcases/general/instance_setter_conflict.dart.outline.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:11:14: Error: Can't declare a member that conflicts with an inherited one.
+// static get v {
+// ^
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:6:7: Context: This is the inherited member.
+// int v;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int* v;
+ synthetic constructor •() → self::A*
+ ;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
+class C extends self::A {
+ static field core::int* n;
+ synthetic constructor •() → self::C*
+ ;
+ static get v() → dynamic
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/instance_setter_conflict.dart.strong.expect b/pkg/front_end/testcases/general/instance_setter_conflict.dart.strong.expect
new file mode 100644
index 0000000..98ce703
--- /dev/null
+++ b/pkg/front_end/testcases/general/instance_setter_conflict.dart.strong.expect
@@ -0,0 +1,40 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:11:14: Error: Can't declare a member that conflicts with an inherited one.
+// static get v {
+// ^
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:6:7: Context: This is the inherited member.
+// int v;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int* v = null;
+ synthetic constructor •() → self::A*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
+class C extends self::A {
+ static field core::int* n = null;
+ synthetic constructor •() → self::C*
+ : super self::A::•()
+ ;
+ static get v() → dynamic {
+ return self::C::n;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/instance_setter_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/instance_setter_conflict.dart.strong.transformed.expect
new file mode 100644
index 0000000..98ce703
--- /dev/null
+++ b/pkg/front_end/testcases/general/instance_setter_conflict.dart.strong.transformed.expect
@@ -0,0 +1,40 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:11:14: Error: Can't declare a member that conflicts with an inherited one.
+// static get v {
+// ^
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:6:7: Context: This is the inherited member.
+// int v;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ field core::int* v = null;
+ synthetic constructor •() → self::A*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
+class C extends self::A {
+ static field core::int* n = null;
+ synthetic constructor •() → self::C*
+ : super self::A::•()
+ ;
+ static get v() → dynamic {
+ return self::C::n;
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/instance_setter_conflict.dart.textual_outline.expect b/pkg/front_end/testcases/general/instance_setter_conflict.dart.textual_outline.expect
new file mode 100644
index 0000000..90576ff
--- /dev/null
+++ b/pkg/front_end/testcases/general/instance_setter_conflict.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+class A {
+ int v;
+}
+
+class C extends A {
+ static int n;
+ static get v {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/instance_setter_conflict.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/instance_setter_conflict.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e921e15
--- /dev/null
+++ b/pkg/front_end/testcases/general/instance_setter_conflict.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+class A {
+ int v;
+}
+
+class C extends A {
+ static get v {}
+ static int n;
+}
+
+main() {}