Skip to content

Commit c6b0e21

Browse files
chloestefantsovaCommit Queue
authored and
Commit Queue
committed
[cfe] Make extension type non-nullable only if it implements Object
Part of #49731 TEST=existing Change-Id: I397bbd5ca7868a9fb344286c910536c6ac341222 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/333500 Reviewed-by: Alexander Markov <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Srujan Gaddam <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 000e67b commit c6b0e21

File tree

149 files changed

+3574
-1354
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

149 files changed

+3574
-1354
lines changed

pkg/front_end/lib/src/fasta/builder/extension_type_declaration_builder.dart

-3
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ abstract class ExtensionTypeDeclarationBuilderImpl
6868
Uri fileUri,
6969
int charOffset,
7070
{required bool hasExplicitTypeArguments}) {
71-
buildRepresentationTypeAndName();
7271
ExtensionType type =
7372
new ExtensionType(extensionTypeDeclaration, nullability, arguments);
7473
if (typeVariablesCount != 0 && library is SourceLibraryBuilder) {
@@ -80,6 +79,4 @@ abstract class ExtensionTypeDeclarationBuilderImpl
8079

8180
@override
8281
String get debugName => "ExtensionTypeDeclarationBuilder";
83-
84-
void buildRepresentationTypeAndName() {}
8582
}

pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart

+3-14
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ class SourceExtensionTypeDeclarationBuilder
4747
final List<ConstructorReferenceBuilder>? constructorReferences;
4848

4949
final ExtensionTypeDeclaration _extensionTypeDeclaration;
50-
bool _builtRepresentationTypeAndName = false;
5150

5251
SourceExtensionTypeDeclarationBuilder? _origin;
5352
SourceExtensionTypeDeclarationBuilder? patchForTesting;
@@ -255,19 +254,6 @@ class SourceExtensionTypeDeclarationBuilder
255254
}
256255
}
257256

258-
buildRepresentationTypeAndName();
259-
buildInternal(coreLibrary, addMembersToLibrary: addMembersToLibrary);
260-
261-
return _extensionTypeDeclaration;
262-
}
263-
264-
@override
265-
void buildRepresentationTypeAndName() {
266-
// We cut the potential infinite recursion here. The cyclic dependencies
267-
// should be reported elsewhere.
268-
if (_builtRepresentationTypeAndName) return;
269-
_builtRepresentationTypeAndName = true;
270-
271257
DartType representationType;
272258
String representationName;
273259
if (representationFieldBuilder != null) {
@@ -312,6 +298,9 @@ class SourceExtensionTypeDeclarationBuilder
312298
}
313299
_extensionTypeDeclaration.declaredRepresentationType = representationType;
314300
_extensionTypeDeclaration.representationName = representationName;
301+
buildInternal(coreLibrary, addMembersToLibrary: addMembersToLibrary);
302+
303+
return _extensionTypeDeclaration;
315304
}
316305

317306
bool _checkRepresentationDependency(

pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart

+15-7
Original file line numberDiff line numberDiff line change
@@ -1524,15 +1524,18 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
15241524
void test_upper_bound_extension_type() {
15251525
parseTestLibrary("extension type E1(Object? it); "
15261526
"extension type E2(Object it);"
1527-
"extension type E3<X>(X it);");
1527+
"extension type E3<X>(X it); "
1528+
"extension type E4(Object it) implements Object; "
1529+
"extension type E5<X extends Object>(X it) implements Object;");
15281530
checkUpperBound(type1: "E1", type2: "E1", upperBound: "E1");
15291531
checkUpperBound(type1: "E2", type2: "E2", upperBound: "E2");
15301532
checkUpperBound(type1: "E1", type2: "E2", upperBound: "Object?");
15311533
checkUpperBound(type1: "E1", type2: "E3<Object?>", upperBound: "Object?");
15321534
checkUpperBound(type1: "E1", type2: "E3<num?>", upperBound: "Object?");
15331535
checkUpperBound(type1: "E2", type2: "E3<Object?>", upperBound: "Object?");
15341536
checkUpperBound(type1: "E2", type2: "E3<num?>", upperBound: "Object?");
1535-
checkUpperBound(type1: "E2", type2: "E3<Object>", upperBound: "Object");
1537+
checkUpperBound(type1: "E2", type2: "E3<Object>", upperBound: "Object?");
1538+
checkUpperBound(type1: "E4", type2: "E5<Object>", upperBound: "Object");
15361539
}
15371540

15381541
void test_upper_bound_extension_type_implements() {
@@ -1546,7 +1549,8 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
15461549
"extension type E8(bool it); "
15471550
"extension type E9(int it) implements E6; "
15481551
"extension type E10(double it) implements E5; "
1549-
"extension type E11<X>(X it); ");
1552+
"extension type E11<X>(X it); "
1553+
"extension type E12(bool it) implements Object;");
15501554
checkUpperBound(type1: "E1", type2: "E2", upperBound: "num");
15511555
checkUpperBound(type1: "E1", type2: "E3<int>", upperBound: "num");
15521556
checkUpperBound(type1: "E2", type2: "E3<double>", upperBound: "num");
@@ -1557,7 +1561,8 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
15571561
checkUpperBound(type1: "E1", type2: "E6", upperBound: "Object?");
15581562
checkUpperBound(type1: "E2", type2: "E6", upperBound: "Object?");
15591563
checkUpperBound(type1: "E1", type2: "E7", upperBound: "Object");
1560-
checkUpperBound(type1: "E1", type2: "E8", upperBound: "Object");
1564+
checkUpperBound(type1: "E1", type2: "E8", upperBound: "Object?");
1565+
checkUpperBound(type1: "E1", type2: "E12", upperBound: "Object");
15611566
checkUpperBound(type1: "E6", type2: "E9", upperBound: "E6");
15621567
checkUpperBound(type1: "E5", type2: "E9", upperBound: "E5");
15631568
checkUpperBound(type1: "E5", type2: "E6", upperBound: "E5");
@@ -1580,16 +1585,19 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
15801585
"extension type E2(num it); "
15811586
"extension type E3(num? it) implements E1; "
15821587
"extension type E4(num it) implements num; "
1583-
"extension type E5<Y extends Object>(Y it) implements A<Y>;");
1588+
"extension type E5<Y extends Object>(Y it) implements A<Y>; "
1589+
"extension type E6(num it) implements Object;");
15841590
checkUpperBound(type1: "E1", type2: "num?", upperBound: "Object?");
15851591
checkUpperBound(type1: "E1", type2: "num", upperBound: "Object?");
15861592
checkUpperBound(type1: "E1", type2: "int?", upperBound: "Object?");
15871593
checkUpperBound(type1: "E1", type2: "int", upperBound: "Object?");
15881594

15891595
checkUpperBound(type1: "E2", type2: "num?", upperBound: "Object?");
1590-
checkUpperBound(type1: "E2", type2: "num", upperBound: "Object");
1596+
checkUpperBound(type1: "E2", type2: "num", upperBound: "Object?");
1597+
checkUpperBound(type1: "E6", type2: "num", upperBound: "Object");
15911598
checkUpperBound(type1: "E2", type2: "int?", upperBound: "Object?");
1592-
checkUpperBound(type1: "E2", type2: "int", upperBound: "Object");
1599+
checkUpperBound(type1: "E2", type2: "int", upperBound: "Object?");
1600+
checkUpperBound(type1: "E6", type2: "int", upperBound: "Object");
15931601

15941602
checkUpperBound(type1: "E3", type2: "num?", upperBound: "Object?");
15951603
checkUpperBound(type1: "E3", type2: "num", upperBound: "Object?");

pkg/front_end/test/fasta/types/kernel_type_parser_test.dart

+18-12
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,18 @@ extension GenericExtension<Y> on ExtendedGenericClass<Y>;
3939
extension TopExtension on dynamic;
4040
extension GenericTopExtension<Z> on dynamic;
4141
class ExtendedSubclass extends ExtendedClass;
42-
extension type NullableExtensionType(Object? it);
43-
extension type NonNullableExtensionType(Object it);
44-
extension type GenericExtensionType<T>(T it);
45-
extension type GenericExtensionSubType<T>(T it) implements GenericExtensionType<T>;
46-
extension type NonNullableGenericExtensionType<T extends Object>(T it);
42+
extension type NullableExtensionType(Object it);
43+
extension type NonNullableExtensionType(Object it) implements Object;
44+
extension type PotentiallyNullableGenericExtensionType<T>(T it);
45+
extension type PotentiallyNullableGenericExtensionSubType<T>(T it) implements PotentiallyNullableGenericExtensionType<T>;
46+
extension type NonNullableGenericExtensionType<T extends Object>(T it) implements Object;
47+
extension type NonNullableGenericExtensionSubType<T extends Object>(T it) implements NonNullableGenericExtensionType<T>;
4748
class GenericClass<T>;
4849
extension type GenericExtensionTypeImplements<T>(GenericClass<T> it) implements GenericClass<T>;
4950
class SubGenericClass<T> extends GenericClass<T>;
5051
extension type GenericSubExtensionTypeImplements<T>(SubGenericClass<T> it) implements GenericExtensionTypeImplements<T>, SubGenericClass<T>;
51-
extension type NestedGenericExtensionType<T>(GenericExtensionType<T> it);
52+
extension type PotentiallyNullableNestedGenericExtensionType<T>(PotentiallyNullableGenericExtensionType<T> it);
53+
extension type NonNullableNestedGenericExtensionType<T extends Object>(NonNullableGenericExtensionType<T> it) implements Object;
5254
""";
5355

5456
const String expectedSdk = """
@@ -116,21 +118,25 @@ extension TopExtension on dynamic {
116118
}
117119
extension GenericTopExtension<Z extends self::Object? = dynamic> on dynamic {
118120
}
119-
extension type NullableExtensionType(self::Object? it) {
121+
extension type NullableExtensionType(self::Object it) {
120122
}
121-
extension type NonNullableExtensionType(self::Object it) {
123+
extension type NonNullableExtensionType(self::Object it) implements self::Object {
122124
}
123-
extension type GenericExtensionType<T extends self::Object? = dynamic>(T% it) {
125+
extension type PotentiallyNullableGenericExtensionType<T extends self::Object? = dynamic>(T% it) {
124126
}
125-
extension type GenericExtensionSubType<T extends self::Object? = dynamic>(T% it) implements self::GenericExtensionType<T%> /* = T% */ {
127+
extension type PotentiallyNullableGenericExtensionSubType<T extends self::Object? = dynamic>(T% it) implements self::PotentiallyNullableGenericExtensionType<T%> /* = T% */ {
126128
}
127-
extension type NonNullableGenericExtensionType<T extends self::Object>(T it) {
129+
extension type NonNullableGenericExtensionType<T extends self::Object>(T it) implements self::Object {
130+
}
131+
extension type NonNullableGenericExtensionSubType<T extends self::Object>(T it) implements self::NonNullableGenericExtensionType<T> /* = T */ {
128132
}
129133
extension type GenericExtensionTypeImplements<T extends self::Object? = dynamic>(self::GenericClass<T%> it) implements self::GenericClass<T%> {
130134
}
131135
extension type GenericSubExtensionTypeImplements<T extends self::Object? = dynamic>(self::SubGenericClass<T%> it) implements self::GenericExtensionTypeImplements<T%> /* = self::GenericClass<T%> */, self::SubGenericClass<T%> {
132136
}
133-
extension type NestedGenericExtensionType<T extends self::Object? = dynamic>(self::GenericExtensionType<T%> /* = T% */ it) {
137+
extension type PotentiallyNullableNestedGenericExtensionType<T extends self::Object? = dynamic>(self::PotentiallyNullableGenericExtensionType<T%> /* = T% */ it) {
138+
}
139+
extension type NonNullableNestedGenericExtensionType<T extends self::Object>(self::NonNullableGenericExtensionType<T> /* = T */ it) implements self::Object {
134140
}
135141
""";
136142

pkg/front_end/test/fasta/types/shared_type_tests.dart

+76-40
Original file line numberDiff line numberDiff line change
@@ -1268,12 +1268,13 @@ abstract class SubtypeTest<T, E> {
12681268
// Tests for extension types.
12691269
isSubtype("Never", "NullableExtensionType");
12701270
isSubtype("Never", "NonNullableExtensionType");
1271-
isSubtype("Never", "GenericExtensionType<Object>");
1272-
isSubtype("Never", "GenericExtensionSubType<Object>");
1271+
isSubtype("Never", "PotentiallyNullableGenericExtensionType<Object>");
1272+
isSubtype("Never", "PotentiallyNullableGenericExtensionSubType<Object>");
12731273
isSubtype("Never", "NonNullableGenericExtensionType<Object>");
12741274
isSubtype("Never", "GenericExtensionTypeImplements<Object>");
12751275
isSubtype("Never", "GenericSubExtensionTypeImplements<Object>");
1276-
isSubtype("Never", "NestedGenericExtensionType<Object>");
1276+
isSubtype("Never", "PotentiallyNullableNestedGenericExtensionType<Object>");
1277+
isSubtype("Never", "NonNullableNestedGenericExtensionType<Object>");
12771278

12781279
isSubtype("NullableExtensionType", "dynamic");
12791280
isSubtype("NullableExtensionType", "void");
@@ -1289,28 +1290,32 @@ abstract class SubtypeTest<T, E> {
12891290
isSubtype("NonNullableExtensionType", "Object");
12901291
isObliviousSubtype("NonNullableExtensionType?", "Object");
12911292

1292-
isSubtype("GenericExtensionType<Object>", "dynamic");
1293-
isSubtype("GenericExtensionType<Object>", "void");
1294-
isSubtype("GenericExtensionType<Object>", "Object?");
1295-
isSubtype("GenericExtensionType<Object>", "FutureOr<dynamic>");
1296-
isSubtype("GenericExtensionType<Object>", "Object");
1297-
isObliviousSubtype("GenericExtensionType<Object>?", "Object");
1293+
isSubtype("PotentiallyNullableGenericExtensionType<Object>", "dynamic");
1294+
isSubtype("PotentiallyNullableGenericExtensionType<Object>", "void");
1295+
isSubtype("PotentiallyNullableGenericExtensionType<Object>", "Object?");
1296+
isSubtype(
1297+
"PotentiallyNullableGenericExtensionType<Object>", "FutureOr<dynamic>");
1298+
isSubtype("NonNullableGenericExtensionType<Object>", "Object");
1299+
isObliviousSubtype(
1300+
"PotentiallyNullableGenericExtensionType<Object>?", "Object");
12981301

1299-
isObliviousSubtype("GenericExtensionType<T>", "Object",
1302+
isObliviousSubtype("PotentiallyNullableGenericExtensionType<T>", "Object",
13001303
typeParameters: "T");
1301-
isObliviousSubtype("GenericExtensionType<T>?", "Object",
1304+
isObliviousSubtype("PotentiallyNullableGenericExtensionType<T>?", "Object",
13021305
typeParameters: "T");
1303-
isSubtype("GenericExtensionType<T>", "Object",
1306+
isSubtype("NonNullableGenericExtensionType<T>", "Object",
13041307
typeParameters: "T extends Object");
1305-
isObliviousSubtype("GenericExtensionType<T>?", "Object",
1308+
isObliviousSubtype("PotentiallyNullableGenericExtensionType<T>?", "Object",
13061309
typeParameters: "T extends Object");
13071310

1308-
isSubtype("GenericExtensionSubType<Object>", "dynamic");
1309-
isSubtype("GenericExtensionSubType<Object>", "void");
1310-
isSubtype("GenericExtensionSubType<Object>", "Object?");
1311-
isSubtype("GenericExtensionSubType<Object>", "FutureOr<dynamic>");
1312-
isSubtype("GenericExtensionSubType<Object>", "Object");
1313-
isObliviousSubtype("GenericExtensionSubType<Object>?", "Object");
1311+
isSubtype("PotentiallyNullableGenericExtensionSubType<Object>", "dynamic");
1312+
isSubtype("PotentiallyNullableGenericExtensionSubType<Object>", "void");
1313+
isSubtype("PotentiallyNullableGenericExtensionSubType<Object>", "Object?");
1314+
isSubtype("PotentiallyNullableGenericExtensionSubType<Object>",
1315+
"FutureOr<dynamic>");
1316+
isSubtype("NonNullableGenericExtensionSubType<Object>", "Object");
1317+
isObliviousSubtype(
1318+
"PotentiallyNullableGenericExtensionSubType<Object>?", "Object");
13141319

13151320
isSubtype("NonNullableGenericExtensionType<Object>", "dynamic");
13161321
isSubtype("NonNullableGenericExtensionType<Object>", "void");
@@ -1333,20 +1338,45 @@ abstract class SubtypeTest<T, E> {
13331338
isSubtype("GenericSubExtensionTypeImplements<Object>", "Object");
13341339
isObliviousSubtype("GenericSubExtensionTypeImplements<Object>?", "Object");
13351340

1336-
isSubtype("NestedGenericExtensionType<Object>", "dynamic");
1337-
isSubtype("NestedGenericExtensionType<Object>", "void");
1338-
isSubtype("NestedGenericExtensionType<Object>", "Object?");
1339-
isSubtype("NestedGenericExtensionType<Object>", "FutureOr<dynamic>");
1340-
isSubtype("NestedGenericExtensionType<Object>", "Object");
1341-
isObliviousSubtype("NestedGenericExtensionType<Object>?", "Object");
1342-
1343-
isObliviousSubtype("NestedGenericExtensionType<T>", "Object",
1341+
isSubtype(
1342+
"PotentiallyNullableNestedGenericExtensionType<Object>", "dynamic");
1343+
isSubtype("NonNullableNestedGenericExtensionType<Object>", "dynamic");
1344+
isSubtype("PotentiallyNullableNestedGenericExtensionType<Object>", "void");
1345+
isSubtype("NonNullableNestedGenericExtensionType<Object>", "void");
1346+
isSubtype(
1347+
"PotentiallyNullableNestedGenericExtensionType<Object>", "Object?");
1348+
isSubtype("NonNullableNestedGenericExtensionType<Object>", "Object?");
1349+
isSubtype("PotentiallyNullableNestedGenericExtensionType<Object>",
1350+
"FutureOr<dynamic>");
1351+
isSubtype(
1352+
"NonNullableNestedGenericExtensionType<Object>", "FutureOr<dynamic>");
1353+
isObliviousSubtype(
1354+
"PotentiallyNullableNestedGenericExtensionType<Object>", "Object");
1355+
isSubtype("NonNullableNestedGenericExtensionType<Object>", "Object");
1356+
isObliviousSubtype(
1357+
"PotentiallyNullableNestedGenericExtensionType<Object>?", "Object");
1358+
isObliviousSubtype(
1359+
"NonNullableNestedGenericExtensionType<Object>?", "Object");
1360+
1361+
isObliviousSubtype(
1362+
"PotentiallyNullableNestedGenericExtensionType<T>", "Object",
13441363
typeParameters: "T");
1345-
isObliviousSubtype("NestedGenericExtensionType<T>?", "Object",
1364+
isSubtype("NonNullableNestedGenericExtensionType<T>", "Object",
1365+
typeParameters: "T extends Object");
1366+
isObliviousSubtype(
1367+
"PotentiallyNullableNestedGenericExtensionType<T>?", "Object",
13461368
typeParameters: "T");
1347-
isSubtype("NestedGenericExtensionType<T>", "Object",
1369+
isObliviousSubtype("NonNullableNestedGenericExtensionType<T>?", "Object",
13481370
typeParameters: "T extends Object");
1349-
isObliviousSubtype("NestedGenericExtensionType<T>?", "Object",
1371+
isObliviousSubtype(
1372+
"PotentiallyNullableNestedGenericExtensionType<T>", "Object",
1373+
typeParameters: "T extends Object");
1374+
isSubtype("NonNullableNestedGenericExtensionType<T>", "Object",
1375+
typeParameters: "T extends Object");
1376+
isObliviousSubtype(
1377+
"PotentiallyNullableNestedGenericExtensionType<T>?", "Object",
1378+
typeParameters: "T extends Object");
1379+
isObliviousSubtype("NonNullableNestedGenericExtensionType<T>?", "Object",
13501380
typeParameters: "T extends Object");
13511381

13521382
isNotSubtype("dynamic", "NullableExtensionType");
@@ -1370,15 +1400,19 @@ abstract class SubtypeTest<T, E> {
13701400
isObliviousSubtype("GenericExtensionTypeImplements<Object>?", "Object");
13711401
isObliviousSubtype("GenericSubExtensionTypeImplements<Object>?", "Object");
13721402

1373-
isSubtype("GenericExtensionType<Object>", "GenericExtensionType<Object>");
1374-
isSubtype("GenericExtensionType<num>", "GenericExtensionType<Object>");
1375-
isNotSubtype("GenericExtensionType<Object>", "GenericExtensionType<num>");
1403+
isSubtype("PotentiallyNullableGenericExtensionType<Object>",
1404+
"PotentiallyNullableGenericExtensionType<Object>");
1405+
isSubtype("PotentiallyNullableGenericExtensionType<num>",
1406+
"PotentiallyNullableGenericExtensionType<Object>");
1407+
isNotSubtype("PotentiallyNullableGenericExtensionType<Object>",
1408+
"PotentiallyNullableGenericExtensionType<num>");
13761409

1377-
isSubtype(
1378-
"GenericExtensionSubType<Object>", "GenericExtensionType<Object>");
1379-
isSubtype("GenericExtensionSubType<num>", "GenericExtensionType<Object>");
1380-
isNotSubtype(
1381-
"GenericExtensionSubType<Object>", "GenericExtensionType<num>");
1410+
isSubtype("PotentiallyNullableGenericExtensionSubType<Object>",
1411+
"PotentiallyNullableGenericExtensionType<Object>");
1412+
isSubtype("PotentiallyNullableGenericExtensionSubType<num>",
1413+
"PotentiallyNullableGenericExtensionType<Object>");
1414+
isNotSubtype("PotentiallyNullableGenericExtensionSubType<Object>",
1415+
"PotentiallyNullableGenericExtensionType<num>");
13821416

13831417
isSubtype("GenericExtensionTypeImplements<Object>", "GenericClass<Object>");
13841418
isSubtype("GenericExtensionTypeImplements<num>", "GenericClass<Object>");
@@ -1404,7 +1438,9 @@ abstract class SubtypeTest<T, E> {
14041438
isNotSubtype(
14051439
"GenericSubExtensionTypeImplements<Object>", "SubGenericClass<num>");
14061440

1407-
isNotSubtype(
1408-
"NestedGenericExtensionType<Object>", "GenericExtensionType<Object>");
1441+
isNotSubtype("PotentiallyNullableNestedGenericExtensionType<Object>",
1442+
"PotentiallyNullableGenericExtensionType<Object>");
1443+
isNotSubtype("NonNullableNestedGenericExtensionType<Object>",
1444+
"NonNullableGenericExtensionType<Object>");
14091445
}
14101446
}

0 commit comments

Comments
 (0)