[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:
Johnni Winther 2023-08-01 11:04:22 +00:00 committed by Commit Queue
parent 39fe8f458a
commit de20ac1447
11 changed files with 68 additions and 71 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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