[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>
This commit is contained in:
Johnni Winther 2020-08-13 11:14:34 +00:00 committed by commit-bot@chromium.org
parent 642412c447
commit bc73bb1b2c
7 changed files with 159 additions and 42 deletions

View file

@ -243,17 +243,6 @@ abstract class ClassMember {
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 @@ class ClassHierarchyBuilder implements ClassHierarchyBase {
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 @@ class ClassHierarchyBuilder implements ClassHierarchyBase {
substitutions.clear();
_overrideChecks.clear();
_delayedTypeComputations.clear();
inheritanceConflictCache.clear();
_delayedMemberChecks.clear();
}
@ -651,35 +636,10 @@ class ClassHierarchyNodeBuilder {
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 @@ abstract class DelayedMember implements ClassMember {
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;

View file

@ -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() {}

View file

@ -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
;

View file

@ -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 {}

View file

@ -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 {}

View file

@ -0,0 +1,10 @@
class A {
int v;
}
class C extends A {
static int n;
static get v {}
}
main() {}

View file

@ -0,0 +1,10 @@
class A {
int v;
}
class C extends A {
static get v {}
static int n;
}
main() {}