File tree 9 files changed +42
-40
lines changed
9 files changed +42
-40
lines changed Original file line number Diff line number Diff line change @@ -44,6 +44,17 @@ abstract class DartType {
44
44
@Deprecated ('Use element instead' )
45
45
Element ? get element2;
46
46
47
+ /// The extension type erasure of this type.
48
+ ///
49
+ /// The extension type erasure of a type `V` is obtained by recursively
50
+ /// replacing every subterm of `V` which is an extension type with the
51
+ /// corresponding representation type.
52
+ ///
53
+ /// This getter can be used on any type, not necessary on a type that has
54
+ /// an extension type as a subterm. If there are no extension types, the
55
+ /// same type is returned.
56
+ DartType get extensionTypeErasure;
57
+
47
58
/// Return `true` if this type represents the bottom type.
48
59
bool get isBottom;
49
60
Original file line number Diff line number Diff line change @@ -26,8 +26,7 @@ import 'package:analyzer/src/dart/element/element.dart';
26
26
import 'package:analyzer/src/dart/element/member.dart' ;
27
27
import 'package:analyzer/src/dart/element/type.dart' ;
28
28
import 'package:analyzer/src/dart/element/type_algebra.dart' ;
29
- import 'package:analyzer/src/dart/element/type_system.dart'
30
- show ExtensionTypeErasure, TypeSystemImpl;
29
+ import 'package:analyzer/src/dart/element/type_system.dart' show TypeSystemImpl;
31
30
import 'package:analyzer/src/diagnostic/diagnostic.dart' ;
32
31
import 'package:analyzer/src/error/codes.dart' ;
33
32
import 'package:analyzer/src/generated/engine.dart' ;
@@ -3140,7 +3139,7 @@ extension RuntimeExtensions on TypeSystemImpl {
3140
3139
DartObjectImpl obj,
3141
3140
DartType type,
3142
3141
) {
3143
- type = ExtensionTypeErasure (). perform ( type) ;
3142
+ type = type.extensionTypeErasure ;
3144
3143
if (! isNonNullableByDefault) {
3145
3144
type = toLegacyTypeIfOptOut (type);
3146
3145
}
Original file line number Diff line number Diff line change @@ -187,7 +187,7 @@ class DartObjectImpl implements DartObject, Constant {
187
187
InstanceState state, {
188
188
VariableElementImpl ? variable,
189
189
}) {
190
- type = ExtensionTypeErasure (). perform ( type) ;
190
+ type = type.extensionTypeErasure ;
191
191
return DartObjectImpl ._(
192
192
typeSystem,
193
193
type,
@@ -2506,7 +2506,7 @@ class ListState extends InstanceState {
2506
2506
required List <DartObjectImpl > elements,
2507
2507
bool isUnknown = false ,
2508
2508
}) {
2509
- elementType = ExtensionTypeErasure (). perform ( elementType) ;
2509
+ elementType = elementType.extensionTypeErasure ;
2510
2510
return ListState ._(
2511
2511
elementType: elementType,
2512
2512
elements: elements,
@@ -3105,9 +3105,7 @@ class TypeState extends InstanceState {
3105
3105
final DartType ? _type;
3106
3106
3107
3107
factory TypeState (DartType ? type) {
3108
- if (type != null ) {
3109
- type = ExtensionTypeErasure ().perform (type);
3110
- }
3108
+ type = type? .extensionTypeErasure;
3111
3109
return TypeState ._(type);
3112
3110
}
3113
3111
Original file line number Diff line number Diff line change @@ -6,7 +6,6 @@ import 'package:analyzer/dart/element/element.dart';
6
6
import 'package:analyzer/dart/element/nullability_suffix.dart' ;
7
7
import 'package:analyzer/dart/element/type.dart' ;
8
8
import 'package:analyzer/src/dart/element/element.dart' ;
9
- import 'package:analyzer/src/dart/element/type.dart' ;
10
9
import 'package:analyzer/src/generated/utilities_dart.dart' ;
11
10
import 'package:collection/collection.dart' ;
12
11
import 'package:meta/meta_meta.dart' ;
@@ -15,16 +14,6 @@ extension DartTypeExtension on DartType {
15
14
bool get isExtensionType {
16
15
return element is ExtensionTypeElement ;
17
16
}
18
-
19
- /// If `this` is an [InterfaceType] that is an instantiation of an extension
20
- /// type, returns its representation type erasure. Otherwise, returns self.
21
- DartType get representationTypeErasureOrSelf {
22
- final self = this ;
23
- if (self is InterfaceTypeImpl ) {
24
- return self.representationTypeErasure ?? self;
25
- }
26
- return self;
27
- }
28
17
}
29
18
30
19
extension ElementAnnotationExtensions on ElementAnnotation {
Original file line number Diff line number Diff line change @@ -666,17 +666,6 @@ class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
666
666
return null ;
667
667
}
668
668
669
- /// The instantiated representation type erasure, if [element] is an
670
- /// extension type.
671
- DartType ? get representationTypeErasure {
672
- if (element case ExtensionTypeElement element) {
673
- final substitution = Substitution .fromInterfaceType (this );
674
- final typeErasure = element.typeErasure;
675
- return substitution.substituteType (typeErasure);
676
- }
677
- return null ;
678
- }
679
-
680
669
@override
681
670
InterfaceType ? get superclass {
682
671
var supertype = element.supertype;
@@ -1269,6 +1258,11 @@ abstract class TypeImpl implements DartType {
1269
1258
/// Initialize a newly created type.
1270
1259
TypeImpl ({this .alias});
1271
1260
1261
+ @override
1262
+ DartType get extensionTypeErasure {
1263
+ return const ExtensionTypeErasure ().perform (this );
1264
+ }
1265
+
1272
1266
@override
1273
1267
bool get isBottom => false ;
1274
1268
Original file line number Diff line number Diff line change @@ -36,15 +36,16 @@ import 'package:analyzer/src/utilities/extensions/collection.dart';
36
36
import 'package:meta/meta.dart' ;
37
37
38
38
class ExtensionTypeErasure extends ReplacementVisitor {
39
+ const ExtensionTypeErasure ();
40
+
39
41
DartType perform (DartType type) {
40
42
return type.accept (this ) ?? type;
41
43
}
42
44
43
45
@override
44
46
DartType ? visitInterfaceType (covariant InterfaceTypeImpl type) {
45
- final typeErasure = type.representationTypeErasure;
46
- if (typeErasure != null ) {
47
- return typeErasure;
47
+ if (type.representationType case final representationType? ) {
48
+ return representationType.accept (this ) ?? representationType;
48
49
}
49
50
50
51
return super .visitInterfaceType (type);
@@ -156,9 +157,7 @@ class TypeSystemImpl implements TypeSystem {
156
157
/// type that implements both [left] and [right] , regardless of whether
157
158
/// [left] is a subtype of [right] , or [right] is a subtype of [left] .
158
159
bool canBeSubtypeOf (DartType left, DartType right) {
159
- if (left case InterfaceTypeImpl (: final representationTypeErasure? )) {
160
- left = representationTypeErasure;
161
- }
160
+ left = left.extensionTypeErasure;
162
161
163
162
// If one is `Null`, then the other must be nullable.
164
163
final leftIsNullable = isPotentiallyNullable (left);
Original file line number Diff line number Diff line change @@ -20,7 +20,6 @@ import 'package:analyzer/src/dart/ast/ast.dart';
20
20
import 'package:analyzer/src/dart/ast/extensions.dart' ;
21
21
import 'package:analyzer/src/dart/element/class_hierarchy.dart' ;
22
22
import 'package:analyzer/src/dart/element/element.dart' ;
23
- import 'package:analyzer/src/dart/element/extensions.dart' ;
24
23
import 'package:analyzer/src/dart/element/inheritance_manager3.dart' ;
25
24
import 'package:analyzer/src/dart/element/non_covariant_type_parameter_position.dart' ;
26
25
import 'package:analyzer/src/dart/element/type.dart' ;
@@ -4904,7 +4903,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
4904
4903
final boundNode = current.bound;
4905
4904
if (boundNode is NamedType ) {
4906
4905
var boundType = boundNode.typeOrThrow;
4907
- boundType = boundType.representationTypeErasureOrSelf ;
4906
+ boundType = boundType.extensionTypeErasure ;
4908
4907
current = elementToNode[boundType.element];
4909
4908
} else {
4910
4909
current = null ;
Original file line number Diff line number Diff line change @@ -8,7 +8,6 @@ import 'package:analyzer/src/dart/ast/ast.dart';
8
8
import 'package:analyzer/src/dart/ast/extensions.dart' ;
9
9
import 'package:analyzer/src/dart/element/element.dart' ;
10
10
import 'package:analyzer/src/dart/element/type.dart' ;
11
- import 'package:analyzer/src/dart/element/type_system.dart' ;
12
11
import 'package:analyzer/src/dart/element/type_visitor.dart' ;
13
12
import 'package:analyzer/src/summary2/link.dart' ;
14
13
import 'package:analyzer/src/utilities/extensions/collection.dart' ;
@@ -151,7 +150,7 @@ class _Node extends graph.Node<_Node> {
151
150
final typeSystem = element.library.typeSystem;
152
151
153
152
element.representation.type = type;
154
- element.typeErasure = ExtensionTypeErasure (). perform ( type) ;
153
+ element.typeErasure = type.extensionTypeErasure ;
155
154
156
155
final interfaces = node.implementsClause? .interfaces
157
156
.map ((e) => e.type)
Original file line number Diff line number Diff line change @@ -601,6 +601,20 @@ const v = int;
601
601
_assertHasPrimitiveEqualityTrue ('v' );
602
602
}
603
603
604
+ test_identical_extensionType_types_recursive () async {
605
+ await assertNoErrorsInCode ('''
606
+ const c = identical(ExList<ExInt>, List<int>);
607
+
608
+ extension type const ExInt(int value) implements int {}
609
+ extension type const ExList<T>(List<T> value) implements List<T> {}
610
+ ''' );
611
+ final result = _topLevelVar ('c' );
612
+ assertDartObjectText (result, r'''
613
+ bool true
614
+ variable: self::@variable::c
615
+ ''' );
616
+ }
617
+
604
618
test_identical_typeLiteral_explicitTypeArgs_differentTypeArgs () async {
605
619
await assertNoErrorsInCode ('''
606
620
class C<T> {}
You can’t perform that action at this time.
0 commit comments