Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(702)

Unified Diff: pkg/compiler/lib/src/types/type_mask.dart

Issue 2363773005: Move closed world reasoning methods from ClassWorld to ClosedWorld. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/types/type_mask.dart
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index 578dbacbb4697dac5834df86f81f33a95435707d..cd92ed968ebeddcffdcbf6330f76df086d32fed4 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -12,7 +12,7 @@ class IncreasingTypeMaskSet extends UniverseSelectorConstraints {
Set<TypeMask> _masks;
@override
- bool applies(Element element, Selector selector, ClassWorld world) {
+ bool applies(Element element, Selector selector, ClosedWorld world) {
if (isAll) return true;
if (_masks == null) return false;
for (TypeMask mask in _masks) {
@@ -22,7 +22,7 @@ class IncreasingTypeMaskSet extends UniverseSelectorConstraints {
}
@override
- bool needsNoSuchMethodHandling(Selector selector, ClassWorld world) {
+ bool needsNoSuchMethodHandling(Selector selector, ClosedWorld world) {
if (isAll) {
TypeMask mask =
new TypeMask.subclass(world.coreClasses.objectClass, world);
@@ -77,102 +77,102 @@ class TypeMaskStrategy implements SelectorConstraintsStrategy {
*/
abstract class TypeMask implements ReceiverConstraint, AbstractValue {
factory TypeMask(
- ClassElement base, int kind, bool isNullable, ClassWorld classWorld) {
+ ClassElement base, int kind, bool isNullable, ClosedWorld closedWorld) {
return new FlatTypeMask.normalized(
- base, (kind << 1) | (isNullable ? 1 : 0), classWorld);
+ base, (kind << 1) | (isNullable ? 1 : 0), closedWorld);
}
const factory TypeMask.empty() = FlatTypeMask.empty;
- factory TypeMask.exact(ClassElement base, ClassWorld classWorld) {
- assert(invariant(base, classWorld.isInstantiated(base),
+ factory TypeMask.exact(ClassElement base, ClosedWorld closedWorld) {
+ assert(invariant(base, closedWorld.isInstantiated(base),
message: () => "Cannot create exact type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
+ "class $base.\n${closedWorld.dump(base)}"));
return new FlatTypeMask.exact(base);
}
- factory TypeMask.exactOrEmpty(ClassElement base, ClassWorld classWorld) {
- if (classWorld.isInstantiated(base)) return new FlatTypeMask.exact(base);
+ factory TypeMask.exactOrEmpty(ClassElement base, ClosedWorld closedWorld) {
+ if (closedWorld.isInstantiated(base)) return new FlatTypeMask.exact(base);
return const TypeMask.empty();
}
- factory TypeMask.subclass(ClassElement base, ClassWorld classWorld) {
- assert(invariant(base, classWorld.isInstantiated(base),
+ factory TypeMask.subclass(ClassElement base, ClosedWorld closedWorld) {
+ assert(invariant(base, closedWorld.isInstantiated(base),
message: () => "Cannot create subclass type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
- ClassElement topmost = classWorld.getLubOfInstantiatedSubclasses(base);
+ "class $base.\n${closedWorld.dump(base)}"));
+ ClassElement topmost = closedWorld.getLubOfInstantiatedSubclasses(base);
if (topmost == null) {
return new TypeMask.empty();
- } else if (classWorld.hasAnyStrictSubclass(topmost)) {
+ } else if (closedWorld.hasAnyStrictSubclass(topmost)) {
return new FlatTypeMask.subclass(topmost);
} else {
- return new TypeMask.exact(topmost, classWorld);
+ return new TypeMask.exact(topmost, closedWorld);
}
}
- factory TypeMask.subtype(ClassElement base, ClassWorld classWorld) {
- ClassElement topmost = classWorld.getLubOfInstantiatedSubtypes(base);
+ factory TypeMask.subtype(ClassElement base, ClosedWorld closedWorld) {
+ ClassElement topmost = closedWorld.getLubOfInstantiatedSubtypes(base);
if (topmost == null) {
return new TypeMask.empty();
}
- if (classWorld.hasOnlySubclasses(topmost)) {
- return new TypeMask.subclass(topmost, classWorld);
+ if (closedWorld.hasOnlySubclasses(topmost)) {
+ return new TypeMask.subclass(topmost, closedWorld);
}
- if (classWorld.hasAnyStrictSubtype(topmost)) {
+ if (closedWorld.hasAnyStrictSubtype(topmost)) {
return new FlatTypeMask.subtype(topmost);
} else {
- return new TypeMask.exact(topmost, classWorld);
+ return new TypeMask.exact(topmost, closedWorld);
}
}
const factory TypeMask.nonNullEmpty() = FlatTypeMask.nonNullEmpty;
- factory TypeMask.nonNullExact(ClassElement base, ClassWorld classWorld) {
- assert(invariant(base, classWorld.isInstantiated(base),
+ factory TypeMask.nonNullExact(ClassElement base, ClosedWorld closedWorld) {
+ assert(invariant(base, closedWorld.isInstantiated(base),
message: () => "Cannot create exact type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
+ "class $base.\n${closedWorld.dump(base)}"));
return new FlatTypeMask.nonNullExact(base);
}
factory TypeMask.nonNullExactOrEmpty(
- ClassElement base, ClassWorld classWorld) {
- if (classWorld.isInstantiated(base)) {
+ ClassElement base, ClosedWorld closedWorld) {
+ if (closedWorld.isInstantiated(base)) {
return new FlatTypeMask.nonNullExact(base);
}
return const TypeMask.nonNullEmpty();
}
- factory TypeMask.nonNullSubclass(ClassElement base, ClassWorld classWorld) {
- assert(invariant(base, classWorld.isInstantiated(base),
+ factory TypeMask.nonNullSubclass(ClassElement base, ClosedWorld closedWorld) {
+ assert(invariant(base, closedWorld.isInstantiated(base),
message: () => "Cannot create subclass type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
- ClassElement topmost = classWorld.getLubOfInstantiatedSubclasses(base);
+ "class $base.\n${closedWorld.dump(base)}"));
+ ClassElement topmost = closedWorld.getLubOfInstantiatedSubclasses(base);
if (topmost == null) {
return new TypeMask.nonNullEmpty();
- } else if (classWorld.hasAnyStrictSubclass(topmost)) {
+ } else if (closedWorld.hasAnyStrictSubclass(topmost)) {
return new FlatTypeMask.nonNullSubclass(topmost);
} else {
- return new TypeMask.nonNullExact(topmost, classWorld);
+ return new TypeMask.nonNullExact(topmost, closedWorld);
}
}
- factory TypeMask.nonNullSubtype(ClassElement base, ClassWorld classWorld) {
- ClassElement topmost = classWorld.getLubOfInstantiatedSubtypes(base);
+ factory TypeMask.nonNullSubtype(ClassElement base, ClosedWorld closedWorld) {
+ ClassElement topmost = closedWorld.getLubOfInstantiatedSubtypes(base);
if (topmost == null) {
return new TypeMask.nonNullEmpty();
}
- if (classWorld.hasOnlySubclasses(topmost)) {
- return new TypeMask.nonNullSubclass(topmost, classWorld);
+ if (closedWorld.hasOnlySubclasses(topmost)) {
+ return new TypeMask.nonNullSubclass(topmost, closedWorld);
}
- if (classWorld.hasAnyStrictSubtype(topmost)) {
+ if (closedWorld.hasAnyStrictSubtype(topmost)) {
return new FlatTypeMask.nonNullSubtype(topmost);
} else {
- return new TypeMask.nonNullExact(topmost, classWorld);
+ return new TypeMask.nonNullExact(topmost, closedWorld);
}
}
- factory TypeMask.unionOf(Iterable<TypeMask> masks, ClassWorld classWorld) {
- return UnionTypeMask.unionOf(masks, classWorld);
+ factory TypeMask.unionOf(Iterable<TypeMask> masks, ClosedWorld closedWorld) {
+ return UnionTypeMask.unionOf(masks, closedWorld);
}
/**
@@ -193,39 +193,39 @@ abstract class TypeMask implements ReceiverConstraint, AbstractValue {
* subclasses exist. We also normalize exact to empty if the corresponding
* baseclass was never instantiated.
*/
- static bool assertIsNormalized(TypeMask mask, ClassWorld classWorld) {
- String reason = getNotNormalizedReason(mask, classWorld);
+ static bool assertIsNormalized(TypeMask mask, ClosedWorld closedWorld) {
+ String reason = getNotNormalizedReason(mask, closedWorld);
return invariant(NO_LOCATION_SPANNABLE, reason == null,
message: () => '$mask is not normalized: $reason');
}
- static String getNotNormalizedReason(TypeMask mask, ClassWorld classWorld) {
+ static String getNotNormalizedReason(TypeMask mask, ClosedWorld closedWorld) {
mask = nonForwardingMask(mask);
if (mask is FlatTypeMask) {
if (mask.isEmptyOrNull) return null;
if (mask.isExact) {
- if (!classWorld.isInstantiated(mask.base)) {
+ if (!closedWorld.isInstantiated(mask.base)) {
return 'Exact ${mask.base} is not instantiated.';
}
return null;
}
if (mask.isSubclass) {
- if (!classWorld.hasAnyStrictSubclass(mask.base)) {
+ if (!closedWorld.hasAnyStrictSubclass(mask.base)) {
return 'Subclass ${mask.base} does not have any subclasses.';
}
return null;
}
assert(mask.isSubtype);
- if (!classWorld.hasAnyStrictSubtype(mask.base)) {
+ if (!closedWorld.hasAnyStrictSubtype(mask.base)) {
return 'Subtype ${mask.base} does not have any subclasses.';
}
- if (classWorld.hasOnlySubclasses(mask.base)) {
+ if (closedWorld.hasOnlySubclasses(mask.base)) {
return 'Subtype ${mask.base} only has subclasses.';
}
return null;
} else if (mask is UnionTypeMask) {
for (TypeMask submask in mask.disjointMasks) {
- String submaskReason = getNotNormalizedReason(submask, classWorld);
+ String submaskReason = getNotNormalizedReason(submask, closedWorld);
if (submaskReason != null) {
return 'Submask $submask in $mask: $submaskReason.';
}
@@ -282,11 +282,11 @@ abstract class TypeMask implements ReceiverConstraint, AbstractValue {
/// Returns `true` if this mask holds encodes an exact value within a type.
bool get isValue;
- bool containsOnlyInt(ClassWorld classWorld);
- bool containsOnlyDouble(ClassWorld classWorld);
- bool containsOnlyNum(ClassWorld classWorld);
- bool containsOnlyBool(ClassWorld classWorld);
- bool containsOnlyString(ClassWorld classWorld);
+ bool containsOnlyInt(ClosedWorld closedWorld);
+ bool containsOnlyDouble(ClosedWorld closedWorld);
+ bool containsOnlyNum(ClosedWorld closedWorld);
+ bool containsOnlyBool(ClosedWorld closedWorld);
+ bool containsOnlyString(ClosedWorld closedWorld);
bool containsOnly(ClassElement element);
/**
@@ -303,7 +303,7 @@ abstract class TypeMask implements ReceiverConstraint, AbstractValue {
* Enable [UnionTypeMask.PERFORM_EXTRA_CONTAINS_CHECK] to be notified of
* false negatives.
*/
- bool isInMask(TypeMask other, ClassWorld classWorld);
+ bool isInMask(TypeMask other, ClosedWorld closedWorld);
/**
* If this returns `true`, [other] is guaranteed to be a subtype of this mask,
@@ -311,48 +311,48 @@ abstract class TypeMask implements ReceiverConstraint, AbstractValue {
* Enable [UnionTypeMask.PERFORM_EXTRA_CONTAINS_CHECK] to be notified of
* false negatives.
*/
- bool containsMask(TypeMask other, ClassWorld classWorld);
+ bool containsMask(TypeMask other, ClosedWorld closedWorld);
/**
* Returns whether this type mask is an instance of [cls].
*/
- bool satisfies(ClassElement cls, ClassWorld classWorld);
+ bool satisfies(ClassElement cls, ClosedWorld closedWorld);
/**
* Returns whether or not this type mask contains the given type.
*/
- bool contains(ClassElement type, ClassWorld classWorld);
+ bool contains(ClassElement type, ClosedWorld closedWorld);
/**
* Returns whether or not this type mask contains all types.
*/
- bool containsAll(ClassWorld classWorld);
+ bool containsAll(ClosedWorld closedWorld);
/**
* Returns the [ClassElement] if this type represents a single class,
* otherwise returns `null`. This method is conservative.
*/
- ClassElement singleClass(ClassWorld classWorld);
+ ClassElement singleClass(ClosedWorld closedWorld);
/**
* Returns a type mask representing the union of [this] and [other].
*/
- TypeMask union(TypeMask other, ClassWorld classWorld);
+ TypeMask union(TypeMask other, ClosedWorld closedWorld);
/// Returns whether the intersection of this and [other] is empty.
- bool isDisjoint(TypeMask other, ClassWorld classWorld);
+ bool isDisjoint(TypeMask other, ClosedWorld closedWorld);
/**
* Returns a type mask representing the intersection of [this] and [other].
*/
- TypeMask intersection(TypeMask other, ClassWorld classWorld);
+ TypeMask intersection(TypeMask other, ClosedWorld closedWorld);
/**
* Returns whether [element] is a potential target when being
* invoked on this type mask. [selector] is used to ensure library
* privacy is taken into account.
*/
- bool canHit(Element element, Selector selector, ClassWorld classWorld);
+ bool canHit(Element element, Selector selector, ClosedWorld closedWorld);
/**
* Returns the [element] that is known to always be hit at runtime

Powered by Google App Engine
This is Rietveld 408576698