mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 13:08:01 +00:00
[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:
parent
642412c447
commit
bc73bb1b2c
|
@ -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;
|
||||
|
|
|
@ -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() {}
|
|
@ -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
|
||||
;
|
|
@ -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 {}
|
|
@ -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 {}
|
|
@ -0,0 +1,10 @@
|
|||
class A {
|
||||
int v;
|
||||
}
|
||||
|
||||
class C extends A {
|
||||
static int n;
|
||||
static get v {}
|
||||
}
|
||||
|
||||
main() {}
|
|
@ -0,0 +1,10 @@
|
|||
class A {
|
||||
int v;
|
||||
}
|
||||
|
||||
class C extends A {
|
||||
static get v {}
|
||||
static int n;
|
||||
}
|
||||
|
||||
main() {}
|
Loading…
Reference in a new issue