mirror of
https://github.com/dart-lang/sdk
synced 2024-09-18 20:51:19 +00:00
[cfe] Fix ExtensionType.==
DartType.== was declared abstract, expecting subtypes to call the `equals` method, but this was accidentally omitted for ExtensionType. This CL moves the implementation to DartType.== since it was called with the same arguments in all subtypes, thus ensuring that new DartType classes will get the correct equals by default. Closes #53046 Change-Id: Ieaaf33ecb569ea7361ac338066a3a5760391e424 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/316583 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
parent
39fe8f458a
commit
de20ac1447
|
@ -161,9 +161,6 @@ class _ImplicitFieldTypeRoot extends InferredType {
|
|||
printer.write('<implicit-field-type:$fieldBuilder>');
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) return true;
|
||||
|
@ -204,9 +201,6 @@ class _InferredTypeUse extends InferredType {
|
|||
printer.write('<inferred-type:${inferableTypeUse.typeBuilder}>');
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) return true;
|
||||
|
|
|
@ -59,9 +59,6 @@ class UnknownType extends DartType {
|
|||
@override
|
||||
DartType get resolveTypeParameterType => this;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
// This class doesn't have any fields so all instances of `UnknownType` are
|
||||
|
|
|
@ -13,7 +13,7 @@ extension type B._(A a) {
|
|||
|
||||
external A method();
|
||||
|
||||
external T genericMethod<T>(T t);
|
||||
external T genericMethod<T extends B>(T t);
|
||||
|
||||
external B get getter;
|
||||
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
library;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/inline_class/extension_types/external.dart:42:29: Error: Inferred type argument 'int' doesn't conform to the bound 'B' of the type variable 'T' on 'T Function<T extends B>(T)'.
|
||||
// Try specifying type arguments explicitly so that they conform to the bounds.
|
||||
// int Function(int) f3 = b2.genericMethod;
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
|
@ -46,9 +54,9 @@ external static inline-class-member method B|set#field(lowered self::A #this, se
|
|||
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
|
||||
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
|
||||
return () → self::A => self::B|method(#this);
|
||||
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
|
||||
return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
|
||||
external static inline-class-member method B|genericMethod<T extends self::B>(lowered final self::B #this, self::B|genericMethod::T t) → self::B|genericMethod::T;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends self::B>(T) → T
|
||||
return <T extends self::B>(T t) → T => self::B|genericMethod<T>(#this, t);
|
||||
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
|
||||
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
|
||||
external static inline-class-member get B|staticField() → self::A;
|
||||
|
@ -65,7 +73,7 @@ static method method(self::A a) → void {
|
|||
a = self::B|method(b1);
|
||||
() → self::A f1 = self::B|get#method(b1);
|
||||
b2 = self::B|genericMethod<self::B>(b2, b2);
|
||||
<T extends core::Object? = dynamic>(T%) → T% f2 = self::B|get#genericMethod(b2);
|
||||
<T extends self::B>(T) → T f2 = self::B|get#genericMethod(b2);
|
||||
(core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
|
||||
b1 = self::B|get#getter(b2);
|
||||
self::B|set#setter(b1, b2);
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
library;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/inline_class/extension_types/external.dart:42:29: Error: Inferred type argument 'int' doesn't conform to the bound 'B' of the type variable 'T' on 'T Function<T extends B>(T)'.
|
||||
// Try specifying type arguments explicitly so that they conform to the bounds.
|
||||
// int Function(int) f3 = b2.genericMethod;
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
|
@ -46,9 +54,9 @@ external static inline-class-member method B|set#field(lowered self::A #this, se
|
|||
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
|
||||
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
|
||||
return () → self::A => self::B|method(#this);
|
||||
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
|
||||
return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
|
||||
external static inline-class-member method B|genericMethod<T extends self::B>(lowered final self::B #this, self::B|genericMethod::T t) → self::B|genericMethod::T;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends self::B>(T) → T
|
||||
return <T extends self::B>(T t) → T => self::B|genericMethod<T>(#this, t);
|
||||
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
|
||||
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
|
||||
external static inline-class-member get B|staticField() → self::A;
|
||||
|
@ -65,7 +73,7 @@ static method method(self::A a) → void {
|
|||
a = self::B|method(b1);
|
||||
() → self::A f1 = self::B|get#method(b1);
|
||||
b2 = self::B|genericMethod<self::B>(b2, b2);
|
||||
<T extends core::Object? = dynamic>(T%) → T% f2 = self::B|get#genericMethod(b2);
|
||||
<T extends self::B>(T) → T f2 = self::B|get#genericMethod(b2);
|
||||
(core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
|
||||
b1 = self::B|get#getter(b2);
|
||||
self::B|set#setter(b1, b2);
|
||||
|
|
|
@ -4,7 +4,7 @@ external B(A a);
|
|||
external B.named(int i);
|
||||
external A field;
|
||||
external A method();
|
||||
external T genericMethod<T>(T t);
|
||||
external T genericMethod<T extends B>(T t);
|
||||
external B get getter;
|
||||
external void set setter(B b);
|
||||
external static A staticField;
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
library;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/inline_class/extension_types/external.dart:42:29: Error: Inferred type argument 'int' doesn't conform to the bound 'B' of the type variable 'T' on 'T Function<T extends B>(T)'.
|
||||
// Try specifying type arguments explicitly so that they conform to the bounds.
|
||||
// int Function(int) f3 = b2.genericMethod;
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
|
@ -46,9 +54,9 @@ external static inline-class-member method B|set#field(lowered self::A #this, se
|
|||
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
|
||||
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
|
||||
return () → self::A => self::B|method(#this);
|
||||
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
|
||||
return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
|
||||
external static inline-class-member method B|genericMethod<T extends self::B>(lowered final self::B #this, self::B|genericMethod::T t) → self::B|genericMethod::T;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends self::B>(T) → T
|
||||
return <T extends self::B>(T t) → T => self::B|genericMethod<T>(#this, t);
|
||||
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
|
||||
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
|
||||
external static inline-class-member get B|staticField() → self::A;
|
||||
|
@ -65,7 +73,7 @@ static method method(self::A a) → void {
|
|||
a = self::B|method(b1);
|
||||
() → self::A f1 = self::B|get#method(b1);
|
||||
b2 = self::B|genericMethod<self::B>(b2, b2);
|
||||
<T extends core::Object? = dynamic>(T%) → T% f2 = self::B|get#genericMethod(b2);
|
||||
<T extends self::B>(T) → T f2 = self::B|get#genericMethod(b2);
|
||||
(core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
|
||||
b1 = self::B|get#getter(b2);
|
||||
self::B|set#setter(b1, b2);
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
library;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/inline_class/extension_types/external.dart:42:29: Error: Inferred type argument 'int' doesn't conform to the bound 'B' of the type variable 'T' on 'T Function<T extends B>(T)'.
|
||||
// Try specifying type arguments explicitly so that they conform to the bounds.
|
||||
// int Function(int) f3 = b2.genericMethod;
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
|
@ -46,9 +54,9 @@ external static inline-class-member method B|set#field(lowered self::A #this, se
|
|||
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
|
||||
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
|
||||
return () → self::A => self::B|method(#this);
|
||||
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
|
||||
return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
|
||||
external static inline-class-member method B|genericMethod<T extends self::B>(lowered final self::B #this, self::B|genericMethod::T t) → self::B|genericMethod::T;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends self::B>(T) → T
|
||||
return <T extends self::B>(T t) → T => self::B|genericMethod<T>(#this, t);
|
||||
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
|
||||
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
|
||||
external static inline-class-member get B|staticField() → self::A;
|
||||
|
@ -65,7 +73,7 @@ static method method(self::A a) → void {
|
|||
a = self::B|method(b1);
|
||||
() → self::A f1 = self::B|get#method(b1);
|
||||
b2 = self::B|genericMethod<self::B>(b2, b2);
|
||||
<T extends core::Object? = dynamic>(T%) → T% f2 = self::B|get#genericMethod(b2);
|
||||
<T extends self::B>(T) → T f2 = self::B|get#genericMethod(b2);
|
||||
(core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
|
||||
b1 = self::B|get#getter(b2);
|
||||
self::B|set#setter(b1, b2);
|
||||
|
|
|
@ -43,9 +43,9 @@ external static inline-class-member method B|set#field(lowered self::A #this, se
|
|||
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
|
||||
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
|
||||
return () → self::A => self::B|method(#this);
|
||||
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
|
||||
return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
|
||||
external static inline-class-member method B|genericMethod<T extends self::B>(lowered final self::B #this, self::B|genericMethod::T t) → self::B|genericMethod::T;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends self::B>(T) → T
|
||||
return <T extends self::B>(T t) → T => self::B|genericMethod<T>(#this, t);
|
||||
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
|
||||
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
|
||||
external static inline-class-member get B|staticField() → self::A;
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
library;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/inline_class/extension_types/external.dart:42:29: Error: Inferred type argument 'int' doesn't conform to the bound 'B' of the type variable 'T' on 'T Function<T extends B>(T)'.
|
||||
// Try specifying type arguments explicitly so that they conform to the bounds.
|
||||
// int Function(int) f3 = b2.genericMethod;
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
|
@ -46,9 +54,9 @@ external static inline-class-member method B|set#field(lowered self::A #this, se
|
|||
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
|
||||
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
|
||||
return () → self::A => self::B|method(#this);
|
||||
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
|
||||
return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
|
||||
external static inline-class-member method B|genericMethod<T extends self::B>(lowered final self::B #this, self::B|genericMethod::T t) → self::B|genericMethod::T;
|
||||
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends self::B>(T) → T
|
||||
return <T extends self::B>(T t) → T => self::B|genericMethod<T>(#this, t);
|
||||
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
|
||||
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
|
||||
external static inline-class-member get B|staticField() → self::A;
|
||||
|
@ -65,7 +73,7 @@ static method method(self::A a) → void {
|
|||
a = self::B|method(b1);
|
||||
() → self::A f1 = self::B|get#method(b1);
|
||||
b2 = self::B|genericMethod<self::B>(b2, b2);
|
||||
<T extends core::Object? = dynamic>(T%) → T% f2 = self::B|get#genericMethod(b2);
|
||||
<T extends self::B>(T) → T f2 = self::B|get#genericMethod(b2);
|
||||
(core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
|
||||
b1 = self::B|get#getter(b2);
|
||||
self::B|set#setter(b1, b2);
|
||||
|
|
|
@ -10808,7 +10808,7 @@ abstract class DartType extends Node {
|
|||
R accept1<R, A>(DartTypeVisitor1<R, A> v, A arg);
|
||||
|
||||
@override
|
||||
bool operator ==(Object other);
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
/// The nullability declared on the type.
|
||||
///
|
||||
|
@ -10875,6 +10875,8 @@ abstract class DartType extends Node {
|
|||
/// Returns the non-type parameter type bound of this type.
|
||||
DartType get resolveTypeParameterType;
|
||||
|
||||
/// Internal implementation of equality using [assumptions] to handle equality
|
||||
/// of type parameters on function types coinductively.
|
||||
bool equals(Object other, Assumptions? assumptions);
|
||||
|
||||
/// Returns a textual representation of the this type.
|
||||
|
@ -10914,9 +10916,6 @@ class InvalidType extends DartType {
|
|||
@override
|
||||
DartType get resolveTypeParameterType => this;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) => other is InvalidType;
|
||||
|
||||
|
@ -10967,9 +10966,6 @@ class DynamicType extends DartType {
|
|||
@override
|
||||
DartType get resolveTypeParameterType => this;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) => other is DynamicType;
|
||||
|
||||
|
@ -11012,9 +11008,6 @@ class VoidType extends DartType {
|
|||
@override
|
||||
DartType get resolveTypeParameterType => this;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) => other is VoidType;
|
||||
|
||||
|
@ -11086,9 +11079,6 @@ class NeverType extends DartType {
|
|||
@override
|
||||
void visitChildren(Visitor v) {}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) =>
|
||||
other is NeverType && nullability == other.nullability;
|
||||
|
@ -11132,9 +11122,6 @@ class NullType extends DartType {
|
|||
@override
|
||||
DartType get resolveTypeParameterType => this;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) => other is NullType;
|
||||
|
||||
|
@ -11207,9 +11194,6 @@ class InterfaceType extends DartType {
|
|||
visitList(typeArguments, v);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) return true;
|
||||
|
@ -11305,9 +11289,6 @@ class FunctionType extends DartType {
|
|||
returnType.accept(v);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) {
|
||||
|
@ -11520,9 +11501,6 @@ class TypedefType extends DartType {
|
|||
return unaliasOnce.unalias;
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) {
|
||||
|
@ -11605,9 +11583,6 @@ class FutureOrType extends DartType {
|
|||
@override
|
||||
DartType get resolveTypeParameterType => this;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) return true;
|
||||
|
@ -11951,9 +11926,6 @@ class IntersectionType extends DartType {
|
|||
right.accept(v);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) {
|
||||
|
@ -12240,9 +12212,6 @@ class TypeParameterType extends DartType {
|
|||
@override
|
||||
void visitChildren(Visitor v) {}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) {
|
||||
|
@ -12398,9 +12367,6 @@ class RecordType extends DartType {
|
|||
visitList(named, v);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => equals(other, null);
|
||||
|
||||
@override
|
||||
bool equals(Object other, Assumptions? assumptions) {
|
||||
if (identical(this, other)) {
|
||||
|
|
Loading…
Reference in a new issue