Skip to content

Commit 0ddba91

Browse files
fishythefishCommit Queue
authored and
Commit Queue
committed
[dart2js] Convert SubclassResult to a sealed class hierarchy.
Change-Id: I151c2f6f72dcecaff6a6976f058940b9ddf97f47 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/371461 Reviewed-by: Nate Biggs <[email protected]> Commit-Queue: Mayank Patke <[email protected]>
1 parent cc073a0 commit 0ddba91

File tree

4 files changed

+156
-158
lines changed

4 files changed

+156
-158
lines changed

pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -462,52 +462,51 @@ class FlatTypeMask extends TypeMask {
462462
SubclassResult result = domain._closedWorld.classHierarchy.commonSubclasses(
463463
base!, _classQuery, otherBase!, flatOther._classQuery);
464464

465-
switch (result.kind) {
466-
case SubclassResultKind.EMPTY:
465+
switch (result) {
466+
case SimpleSubclassResult.empty:
467467
return includeNull
468468
? TypeMask.empty(hasLateSentinel: includeLateSentinel)
469469
: TypeMask.nonNullEmpty(hasLateSentinel: includeLateSentinel);
470-
case SubclassResultKind.EXACT1:
470+
case SimpleSubclassResult.exact1:
471471
assert(isExact);
472472
return withFlags(
473473
isNullable: includeNull, hasLateSentinel: includeLateSentinel);
474-
case SubclassResultKind.EXACT2:
474+
case SimpleSubclassResult.exact2:
475475
assert(other.isExact);
476476
return other.withFlags(
477477
isNullable: includeNull, hasLateSentinel: includeLateSentinel);
478-
case SubclassResultKind.SUBCLASS1:
478+
case SimpleSubclassResult.subclass1:
479479
assert(isSubclass);
480480
return withFlags(
481481
isNullable: includeNull, hasLateSentinel: includeLateSentinel);
482-
case SubclassResultKind.SUBCLASS2:
482+
case SimpleSubclassResult.subclass2:
483483
assert(flatOther.isSubclass);
484484
return other.withFlags(
485485
isNullable: includeNull, hasLateSentinel: includeLateSentinel);
486-
case SubclassResultKind.SUBTYPE1:
486+
case SimpleSubclassResult.subtype1:
487487
assert(isSubtype);
488488
return withFlags(
489489
isNullable: includeNull, hasLateSentinel: includeLateSentinel);
490-
case SubclassResultKind.SUBTYPE2:
490+
case SimpleSubclassResult.subtype2:
491491
assert(flatOther.isSubtype);
492492
return other.withFlags(
493493
isNullable: includeNull, hasLateSentinel: includeLateSentinel);
494-
case SubclassResultKind.SET:
495-
if (result.classes.isEmpty) {
494+
case SetSubclassResult(:final classes):
495+
if (classes.isEmpty) {
496496
return includeNull
497497
? TypeMask.empty(hasLateSentinel: includeLateSentinel)
498498
: TypeMask.nonNullEmpty(hasLateSentinel: includeLateSentinel);
499-
} else if (result.classes.length == 1) {
500-
ClassEntity cls = result.classes.first;
499+
} else if (classes.length == 1) {
500+
ClassEntity cls = classes.first;
501501
return includeNull
502502
? TypeMask.subclass(cls, domain._closedWorld,
503503
hasLateSentinel: includeLateSentinel)
504504
: TypeMask.nonNullSubclass(cls, domain._closedWorld,
505505
hasLateSentinel: includeLateSentinel);
506506
}
507507

508-
List<FlatTypeMask> masks = List.from(result.classes.map(
509-
(ClassEntity cls) =>
510-
TypeMask.nonNullSubclass(cls, domain._closedWorld)));
508+
List<FlatTypeMask> masks = List.from(classes.map((ClassEntity cls) =>
509+
TypeMask.nonNullSubclass(cls, domain._closedWorld)));
511510
if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
512511
return UnionTypeMask.flatten(masks, domain,
513512
includeNull: includeNull,

pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,21 +1271,21 @@ class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder {
12711271
SubclassResult result = closedWorld.classHierarchy
12721272
.commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
12731273
argumentClass, ClassQuery.SUBTYPE);
1274-
switch (result.kind) {
1275-
case SubclassResultKind.EMPTY:
1274+
switch (result) {
1275+
case SimpleSubclassResult.empty:
12761276
break;
1277-
case SubclassResultKind.EXACT1:
1278-
case SubclassResultKind.SUBCLASS1:
1279-
case SubclassResultKind.SUBTYPE1:
1277+
case SimpleSubclassResult.exact1:
1278+
case SimpleSubclassResult.subclass1:
1279+
case SimpleSubclassResult.subtype1:
12801280
addClass(receiverClass);
12811281
break;
1282-
case SubclassResultKind.EXACT2:
1283-
case SubclassResultKind.SUBCLASS2:
1284-
case SubclassResultKind.SUBTYPE2:
1282+
case SimpleSubclassResult.exact2:
1283+
case SimpleSubclassResult.subclass2:
1284+
case SimpleSubclassResult.subtype2:
12851285
addClass(argumentClass);
12861286
break;
1287-
case SubclassResultKind.SET:
1288-
for (ClassEntity cls in result.classes) {
1287+
case SetSubclassResult(:final classes):
1288+
for (ClassEntity cls in classes) {
12891289
addClass(cls);
12901290
if (neededOnAll) break;
12911291
}

pkg/compiler/lib/src/universe/class_hierarchy.dart

Lines changed: 37 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -402,61 +402,61 @@ class ClassHierarchyImpl implements ClassHierarchy {
402402
// Exact classes [cls1] and [cls2] must be identical to have any classes
403403
// in common.
404404
if (cls1 != cls2) {
405-
return SubclassResult.EMPTY;
405+
return SimpleSubclassResult.empty;
406406
}
407-
return SubclassResult.EXACT1;
407+
return SimpleSubclassResult.exact1;
408408
} else if (query1 == ClassQuery.EXACT) {
409409
if (query2 == ClassQuery.SUBCLASS) {
410410
// Exact [cls1] must be a subclass of [cls2] to have any classes in
411411
// common.
412412
if (isSubclassOf(cls1, cls2)) {
413-
return SubclassResult.EXACT1;
413+
return SimpleSubclassResult.exact1;
414414
}
415415
} else if (query2 == ClassQuery.SUBTYPE) {
416416
// Exact [cls1] must be a subtype of [cls2] to have any classes in
417417
// common.
418418
if (isSubtypeOf(cls1, cls2)) {
419-
return SubclassResult.EXACT1;
419+
return SimpleSubclassResult.exact1;
420420
}
421421
}
422-
return SubclassResult.EMPTY;
422+
return SimpleSubclassResult.empty;
423423
} else if (query2 == ClassQuery.EXACT) {
424424
if (query1 == ClassQuery.SUBCLASS) {
425425
// Exact [cls2] must be a subclass of [cls1] to have any classes in
426426
// common.
427427
if (isSubclassOf(cls2, cls1)) {
428-
return SubclassResult.EXACT2;
428+
return SimpleSubclassResult.exact2;
429429
}
430430
} else if (query1 == ClassQuery.SUBTYPE) {
431431
// Exact [cls2] must be a subtype of [cls1] to have any classes in
432432
// common.
433433
if (isSubtypeOf(cls2, cls1)) {
434-
return SubclassResult.EXACT2;
434+
return SimpleSubclassResult.exact2;
435435
}
436436
}
437-
return SubclassResult.EMPTY;
437+
return SimpleSubclassResult.empty;
438438
} else if (query1 == ClassQuery.SUBCLASS && query2 == ClassQuery.SUBCLASS) {
439439
// [cls1] must be a subclass of [cls2] or vice versa to have any classes
440440
// in common.
441441
if (cls1 == cls2 || isSubclassOf(cls1, cls2)) {
442442
// The subclasses of [cls1] are contained within the subclasses of
443443
// [cls2].
444-
return SubclassResult.SUBCLASS1;
444+
return SimpleSubclassResult.subclass1;
445445
} else if (isSubclassOf(cls2, cls1)) {
446446
// The subclasses of [cls2] are contained within the subclasses of
447447
// [cls1].
448-
return SubclassResult.SUBCLASS2;
448+
return SimpleSubclassResult.subclass2;
449449
}
450-
return SubclassResult.EMPTY;
450+
return SimpleSubclassResult.empty;
451451
} else if (query1 == ClassQuery.SUBCLASS) {
452452
if (isSubtypeOf(cls1, cls2)) {
453453
// The subclasses of [cls1] are all subtypes of [cls2].
454-
return SubclassResult.SUBCLASS1;
454+
return SimpleSubclassResult.subclass1;
455455
}
456456
if (cls1 == _commonElements.objectClass) {
457457
// Since [cls1] is `Object` all subtypes of [cls2] are contained within
458458
// the subclasses of [cls1].
459-
return SubclassResult.SUBTYPE2;
459+
return SimpleSubclassResult.subtype2;
460460
}
461461
// Find all the root subclasses of [cls1] of that implement [cls2].
462462
//
@@ -481,16 +481,16 @@ class ClassHierarchyImpl implements ClassHierarchy {
481481
}
482482
return IterationStep.CONTINUE;
483483
});
484-
return SubclassResult(classes);
484+
return SetSubclassResult(classes);
485485
} else if (query2 == ClassQuery.SUBCLASS) {
486486
if (isSubtypeOf(cls2, cls1)) {
487487
// The subclasses of [cls2] are all subtypes of [cls1].
488-
return SubclassResult.SUBCLASS2;
488+
return SimpleSubclassResult.subclass2;
489489
}
490490
if (cls2 == _commonElements.objectClass) {
491491
// Since [cls2] is `Object` all subtypes of [cls1] are contained within
492492
// the subclasses of [cls2].
493-
return SubclassResult.SUBTYPE1;
493+
return SimpleSubclassResult.subtype1;
494494
}
495495
// Find all the root subclasses of [cls2] of that implement [cls1].
496496
List<ClassEntity> classes = [];
@@ -503,14 +503,14 @@ class ClassHierarchyImpl implements ClassHierarchy {
503503
}
504504
return IterationStep.CONTINUE;
505505
});
506-
return SubclassResult(classes);
506+
return SetSubclassResult(classes);
507507
} else {
508508
if (cls1 == cls2 || isSubtypeOf(cls1, cls2)) {
509509
// The subtypes of [cls1] are contained within the subtypes of [cls2].
510-
return SubclassResult.SUBTYPE1;
510+
return SimpleSubclassResult.subtype1;
511511
} else if (isSubtypeOf(cls2, cls1)) {
512512
// The subtypes of [cls2] are contained within the subtypes of [cls1].
513-
return SubclassResult.SUBTYPE2;
513+
return SimpleSubclassResult.subtype2;
514514
}
515515
// Find all the root subclasses of [cls1] of that implement [cls2].
516516
//
@@ -537,7 +537,7 @@ class ClassHierarchyImpl implements ClassHierarchy {
537537
}
538538
return IterationStep.CONTINUE;
539539
});
540-
return SubclassResult(classes);
540+
return SetSubclassResult(classes);
541541
}
542542
}
543543

@@ -935,59 +935,38 @@ enum ClassQuery {
935935
SUBTYPE,
936936
}
937937

938-
/// Result kind for [ClassHierarchy.commonSubclasses].
939-
enum SubclassResultKind {
938+
/// Result computed in [ClassHierarchy.commonSubclasses].
939+
sealed class SubclassResult {}
940+
941+
enum SimpleSubclassResult implements SubclassResult {
940942
/// No common subclasses.
941-
EMPTY,
943+
empty,
942944

943945
/// Exactly the first class in common.
944-
EXACT1,
946+
exact1,
945947

946948
/// Exactly the second class in common.
947-
EXACT2,
949+
exact2,
948950

949951
/// Subclasses of the first class in common.
950-
SUBCLASS1,
952+
subclass1,
951953

952954
/// Subclasses of the second class in common.
953-
SUBCLASS2,
955+
subclass2,
954956

955957
/// Subtypes of the first class in common.
956-
SUBTYPE1,
958+
subtype1,
957959

958960
/// Subtypes of the second class in common.
959-
SUBTYPE2,
960-
961-
/// Subclasses of a set of classes in common.
962-
SET
961+
subtype2,
963962
}
964963

965-
/// Result computed in [ClassHierarchy.commonSubclasses].
966-
class SubclassResult {
967-
final SubclassResultKind kind;
968-
final List<ClassEntity>? _classes;
969-
970-
List<ClassEntity> get classes => _classes!;
971-
972-
SubclassResult(this._classes) : kind = SubclassResultKind.SET;
973-
974-
const SubclassResult.internal(this.kind) : _classes = null;
975-
976-
static const SubclassResult EMPTY =
977-
SubclassResult.internal(SubclassResultKind.EMPTY);
978-
static const SubclassResult EXACT1 =
979-
SubclassResult.internal(SubclassResultKind.EXACT1);
980-
static const SubclassResult EXACT2 =
981-
SubclassResult.internal(SubclassResultKind.EXACT2);
982-
static const SubclassResult SUBCLASS1 =
983-
SubclassResult.internal(SubclassResultKind.SUBCLASS1);
984-
static const SubclassResult SUBCLASS2 =
985-
SubclassResult.internal(SubclassResultKind.SUBCLASS2);
986-
static const SubclassResult SUBTYPE1 =
987-
SubclassResult.internal(SubclassResultKind.SUBTYPE1);
988-
static const SubclassResult SUBTYPE2 =
989-
SubclassResult.internal(SubclassResultKind.SUBTYPE2);
964+
/// Subclasses of a set of classes in common.
965+
class SetSubclassResult implements SubclassResult {
966+
final List<ClassEntity> classes;
967+
968+
SetSubclassResult(this.classes);
990969

991970
@override
992-
String toString() => 'SubclassResult($kind,classes=$_classes)';
971+
String toString() => 'SetSubclassResult(classes=$classes)';
993972
}

0 commit comments

Comments
 (0)