Index: pkg/compiler/lib/src/types/flat_type_mask.dart |
diff --git a/pkg/compiler/lib/src/types/flat_type_mask.dart b/pkg/compiler/lib/src/types/flat_type_mask.dart |
index 0244f8451a6a27cfd41635e40c06c7c0fce65690..1055af23b80a98a6790cf764f688e0d683595d94 100644 |
--- a/pkg/compiler/lib/src/types/flat_type_mask.dart |
+++ b/pkg/compiler/lib/src/types/flat_type_mask.dart |
@@ -49,7 +49,7 @@ class FlatTypeMask implements TypeMask { |
* [TypeMask.assertIsNormalized] with the factory's result returns `true`. |
*/ |
factory FlatTypeMask.normalized( |
- ClassElement base, int flags, ClassWorld world) { |
+ ClassElement base, int flags, ClosedWorld world) { |
if ((flags >> 1) == EMPTY || ((flags >> 1) == EXACT)) { |
return new FlatTypeMask.internal(base, flags); |
} |
@@ -98,7 +98,7 @@ class FlatTypeMask implements TypeMask { |
return isNullable ? new FlatTypeMask.internal(base, flags & ~1) : this; |
} |
- bool contains(ClassElement type, ClassWorld classWorld) { |
+ bool contains(ClassElement type, ClosedWorld closedWorld) { |
assert(type.isDeclaration); |
if (isEmptyOrNull) { |
return false; |
@@ -107,43 +107,43 @@ class FlatTypeMask implements TypeMask { |
} else if (isExact) { |
return false; |
} else if (isSubclass) { |
- return classWorld.isSubclassOf(type, base); |
+ return closedWorld.isSubclassOf(type, base); |
} else { |
assert(isSubtype); |
- return classWorld.isSubtypeOf(type, base); |
+ return closedWorld.isSubtypeOf(type, base); |
} |
} |
- bool isSingleImplementationOf(ClassElement cls, ClassWorld classWorld) { |
+ bool isSingleImplementationOf(ClassElement cls, ClosedWorld closedWorld) { |
// Special case basic types so that, for example, JSString is the |
// single implementation of String. |
// The general optimization is to realize there is only one class that |
// implements [base] and [base] is not instantiated. We however do |
// not track correctly the list of truly instantiated classes. |
- Backend backend = classWorld.backend; |
- if (containsOnlyString(classWorld)) { |
- return cls == classWorld.coreClasses.stringClass || |
+ Backend backend = closedWorld.backend; |
+ if (containsOnlyString(closedWorld)) { |
+ return cls == closedWorld.coreClasses.stringClass || |
cls == backend.stringImplementation; |
} |
- if (containsOnlyBool(classWorld)) { |
- return cls == classWorld.coreClasses.boolClass || |
+ if (containsOnlyBool(closedWorld)) { |
+ return cls == closedWorld.coreClasses.boolClass || |
cls == backend.boolImplementation; |
} |
- if (containsOnlyInt(classWorld)) { |
- return cls == classWorld.coreClasses.intClass || |
+ if (containsOnlyInt(closedWorld)) { |
+ return cls == closedWorld.coreClasses.intClass || |
cls == backend.intImplementation || |
cls == backend.positiveIntImplementation || |
cls == backend.uint32Implementation || |
cls == backend.uint31Implementation; |
} |
- if (containsOnlyDouble(classWorld)) { |
- return cls == classWorld.coreClasses.doubleClass || |
+ if (containsOnlyDouble(closedWorld)) { |
+ return cls == closedWorld.coreClasses.doubleClass || |
cls == backend.doubleImplementation; |
} |
return false; |
} |
- bool isInMask(TypeMask other, ClassWorld classWorld) { |
+ bool isInMask(TypeMask other, ClosedWorld closedWorld) { |
if (isEmptyOrNull) return isNullable ? other.isNullable : true; |
// The empty type contains no classes. |
if (other.isEmptyOrNull) return false; |
@@ -151,7 +151,7 @@ class FlatTypeMask implements TypeMask { |
if (isNullable && !other.isNullable) return false; |
other = TypeMask.nonForwardingMask(other); |
// If other is union, delegate to UnionTypeMask.containsMask. |
- if (other is! FlatTypeMask) return other.containsMask(this, classWorld); |
+ if (other is! FlatTypeMask) return other.containsMask(this, closedWorld); |
// The other must be flat, so compare base and flags. |
FlatTypeMask flatOther = other; |
ClassElement otherBase = flatOther.base; |
@@ -159,7 +159,7 @@ class FlatTypeMask implements TypeMask { |
// TODO(herhut): Get rid of isSingleImplementationOf. |
if (flatOther.isExact) { |
return (isExact && base == otherBase) || |
- isSingleImplementationOf(otherBase, classWorld); |
+ isSingleImplementationOf(otherBase, closedWorld); |
} |
// If other is subclass, this has to be subclass, as well. Unless |
// flatOther.base covers all subtypes of this. Currently, we only |
@@ -167,50 +167,50 @@ class FlatTypeMask implements TypeMask { |
// TODO(herhut): Add check whether flatOther.base is superclass of |
// all subclasses of this.base. |
if (flatOther.isSubclass) { |
- if (isSubtype) return (otherBase == classWorld.coreClasses.objectClass); |
- return classWorld.isSubclassOf(base, otherBase); |
+ if (isSubtype) return (otherBase == closedWorld.coreClasses.objectClass); |
+ return closedWorld.isSubclassOf(base, otherBase); |
} |
assert(flatOther.isSubtype); |
// Check whether this TypeMask satisfies otherBase's interface. |
- return satisfies(otherBase, classWorld); |
+ return satisfies(otherBase, closedWorld); |
} |
- bool containsMask(TypeMask other, ClassWorld classWorld) { |
- return other.isInMask(this, classWorld); |
+ bool containsMask(TypeMask other, ClosedWorld closedWorld) { |
+ return other.isInMask(this, closedWorld); |
} |
- bool containsOnlyInt(ClassWorld classWorld) { |
- Backend backend = classWorld.backend; |
- return base == classWorld.coreClasses.intClass || |
+ bool containsOnlyInt(ClosedWorld closedWorld) { |
+ Backend backend = closedWorld.backend; |
+ return base == closedWorld.coreClasses.intClass || |
base == backend.intImplementation || |
base == backend.positiveIntImplementation || |
base == backend.uint31Implementation || |
base == backend.uint32Implementation; |
} |
- bool containsOnlyDouble(ClassWorld classWorld) { |
- Backend backend = classWorld.backend; |
- return base == classWorld.coreClasses.doubleClass || |
+ bool containsOnlyDouble(ClosedWorld closedWorld) { |
+ Backend backend = closedWorld.backend; |
+ return base == closedWorld.coreClasses.doubleClass || |
base == backend.doubleImplementation; |
} |
- bool containsOnlyNum(ClassWorld classWorld) { |
- Backend backend = classWorld.backend; |
- return containsOnlyInt(classWorld) || |
- containsOnlyDouble(classWorld) || |
- base == classWorld.coreClasses.numClass || |
+ bool containsOnlyNum(ClosedWorld closedWorld) { |
+ Backend backend = closedWorld.backend; |
+ return containsOnlyInt(closedWorld) || |
+ containsOnlyDouble(closedWorld) || |
+ base == closedWorld.coreClasses.numClass || |
base == backend.numImplementation; |
} |
- bool containsOnlyBool(ClassWorld classWorld) { |
- Backend backend = classWorld.backend; |
- return base == classWorld.coreClasses.boolClass || |
+ bool containsOnlyBool(ClosedWorld closedWorld) { |
+ Backend backend = closedWorld.backend; |
+ return base == closedWorld.coreClasses.boolClass || |
base == backend.boolImplementation; |
} |
- bool containsOnlyString(ClassWorld classWorld) { |
- Backend backend = classWorld.backend; |
- return base == classWorld.coreClasses.stringClass || |
+ bool containsOnlyString(ClosedWorld closedWorld) { |
+ Backend backend = closedWorld.backend; |
+ return base == closedWorld.coreClasses.stringClass || |
base == backend.stringImplementation; |
} |
@@ -219,10 +219,10 @@ class FlatTypeMask implements TypeMask { |
return base == cls; |
} |
- bool satisfies(ClassElement cls, ClassWorld classWorld) { |
+ bool satisfies(ClassElement cls, ClosedWorld closedWorld) { |
assert(cls.isDeclaration); |
if (isEmptyOrNull) return false; |
- if (classWorld.isSubtypeOf(base, cls)) return true; |
+ if (closedWorld.isSubtypeOf(base, cls)) return true; |
return false; |
} |
@@ -230,13 +230,13 @@ class FlatTypeMask implements TypeMask { |
* 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) { |
if (isEmptyOrNull) return null; |
if (isNullable) return null; // It is Null and some other class. |
if (isExact) { |
return base; |
} else if (isSubclass) { |
- return classWorld.hasAnyStrictSubclass(base) ? null : base; |
+ return closedWorld.hasAnyStrictSubclass(base) ? null : base; |
} else { |
assert(isSubtype); |
return null; |
@@ -246,40 +246,40 @@ class FlatTypeMask implements TypeMask { |
/** |
* Returns whether or not this type mask contains all types. |
*/ |
- bool containsAll(ClassWorld classWorld) { |
+ bool containsAll(ClosedWorld closedWorld) { |
if (isEmptyOrNull || isExact) return false; |
- return identical(base, classWorld.coreClasses.objectClass); |
+ return identical(base, closedWorld.coreClasses.objectClass); |
} |
- TypeMask union(TypeMask other, ClassWorld classWorld) { |
+ TypeMask union(TypeMask other, ClosedWorld closedWorld) { |
assert(other != null); |
- assert(TypeMask.assertIsNormalized(this, classWorld)); |
- assert(TypeMask.assertIsNormalized(other, classWorld)); |
- if (other is! FlatTypeMask) return other.union(this, classWorld); |
+ assert(TypeMask.assertIsNormalized(this, closedWorld)); |
+ assert(TypeMask.assertIsNormalized(other, closedWorld)); |
+ if (other is! FlatTypeMask) return other.union(this, closedWorld); |
FlatTypeMask flatOther = other; |
if (isEmptyOrNull) { |
return isNullable ? flatOther.nullable() : flatOther; |
} else if (flatOther.isEmptyOrNull) { |
return flatOther.isNullable ? nullable() : this; |
} else if (base == flatOther.base) { |
- return unionSame(flatOther, classWorld); |
- } else if (classWorld.isSubclassOf(flatOther.base, base)) { |
- return unionStrictSubclass(flatOther, classWorld); |
- } else if (classWorld.isSubclassOf(base, flatOther.base)) { |
- return flatOther.unionStrictSubclass(this, classWorld); |
- } else if (classWorld.isSubtypeOf(flatOther.base, base)) { |
- return unionStrictSubtype(flatOther, classWorld); |
- } else if (classWorld.isSubtypeOf(base, flatOther.base)) { |
- return flatOther.unionStrictSubtype(this, classWorld); |
+ return unionSame(flatOther, closedWorld); |
+ } else if (closedWorld.isSubclassOf(flatOther.base, base)) { |
+ return unionStrictSubclass(flatOther, closedWorld); |
+ } else if (closedWorld.isSubclassOf(base, flatOther.base)) { |
+ return flatOther.unionStrictSubclass(this, closedWorld); |
+ } else if (closedWorld.isSubtypeOf(flatOther.base, base)) { |
+ return unionStrictSubtype(flatOther, closedWorld); |
+ } else if (closedWorld.isSubtypeOf(base, flatOther.base)) { |
+ return flatOther.unionStrictSubtype(this, closedWorld); |
} else { |
return new UnionTypeMask._internal(<FlatTypeMask>[this, flatOther]); |
} |
} |
- TypeMask unionSame(FlatTypeMask other, ClassWorld classWorld) { |
+ TypeMask unionSame(FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base == other.base); |
- assert(TypeMask.assertIsNormalized(this, classWorld)); |
- assert(TypeMask.assertIsNormalized(other, classWorld)); |
+ assert(TypeMask.assertIsNormalized(this, closedWorld)); |
+ assert(TypeMask.assertIsNormalized(other, closedWorld)); |
// The two masks share the base type, so we must chose the least |
// constraining kind (the highest) of the two. If either one of |
// the masks are nullable the result should be nullable too. |
@@ -292,18 +292,18 @@ class FlatTypeMask implements TypeMask { |
} else if (other.flags == combined) { |
return other; |
} else { |
- return new FlatTypeMask.normalized(base, combined, classWorld); |
+ return new FlatTypeMask.normalized(base, combined, closedWorld); |
} |
} |
- TypeMask unionStrictSubclass(FlatTypeMask other, ClassWorld classWorld) { |
+ TypeMask unionStrictSubclass(FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base != other.base); |
- assert(classWorld.isSubclassOf(other.base, base)); |
- assert(TypeMask.assertIsNormalized(this, classWorld)); |
- assert(TypeMask.assertIsNormalized(other, classWorld)); |
+ assert(closedWorld.isSubclassOf(other.base, base)); |
+ assert(TypeMask.assertIsNormalized(this, closedWorld)); |
+ assert(TypeMask.assertIsNormalized(other, closedWorld)); |
int combined; |
if ((isExact && other.isExact) || |
- base == classWorld.coreClasses.objectClass) { |
+ base == closedWorld.coreClasses.objectClass) { |
// Since the other mask is a subclass of this mask, we need the |
// resulting union to be a subclass too. If either one of the |
// masks are nullable the result should be nullable too. |
@@ -319,16 +319,16 @@ class FlatTypeMask implements TypeMask { |
// If we weaken the constraint on this type, we have to make sure that |
// the result is normalized. |
return (flags != combined) |
- ? new FlatTypeMask.normalized(base, combined, classWorld) |
+ ? new FlatTypeMask.normalized(base, combined, closedWorld) |
: this; |
} |
- TypeMask unionStrictSubtype(FlatTypeMask other, ClassWorld classWorld) { |
+ TypeMask unionStrictSubtype(FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base != other.base); |
- assert(!classWorld.isSubclassOf(other.base, base)); |
- assert(classWorld.isSubtypeOf(other.base, base)); |
- assert(TypeMask.assertIsNormalized(this, classWorld)); |
- assert(TypeMask.assertIsNormalized(other, classWorld)); |
+ assert(!closedWorld.isSubclassOf(other.base, base)); |
+ assert(closedWorld.isSubtypeOf(other.base, base)); |
+ assert(TypeMask.assertIsNormalized(this, closedWorld)); |
+ assert(TypeMask.assertIsNormalized(other, closedWorld)); |
// Since the other mask is a subtype of this mask, we need the |
// resulting union to be a subtype too. If either one of the masks |
// are nullable the result should be nullable too. |
@@ -336,37 +336,37 @@ class FlatTypeMask implements TypeMask { |
// We know there is at least one subtype, [other.base], so no need |
// to normalize. |
return (flags != combined) |
- ? new FlatTypeMask.normalized(base, combined, classWorld) |
+ ? new FlatTypeMask.normalized(base, combined, closedWorld) |
: this; |
} |
- TypeMask intersection(TypeMask other, ClassWorld classWorld) { |
+ TypeMask intersection(TypeMask other, ClosedWorld closedWorld) { |
assert(other != null); |
- if (other is! FlatTypeMask) return other.intersection(this, classWorld); |
- assert(TypeMask.assertIsNormalized(this, classWorld)); |
- assert(TypeMask.assertIsNormalized(other, classWorld)); |
+ if (other is! FlatTypeMask) return other.intersection(this, closedWorld); |
+ assert(TypeMask.assertIsNormalized(this, closedWorld)); |
+ assert(TypeMask.assertIsNormalized(other, closedWorld)); |
FlatTypeMask flatOther = other; |
if (isEmptyOrNull) { |
return flatOther.isNullable ? this : nonNullable(); |
} else if (flatOther.isEmptyOrNull) { |
return isNullable ? flatOther : other.nonNullable(); |
} else if (base == flatOther.base) { |
- return intersectionSame(flatOther, classWorld); |
- } else if (classWorld.isSubclassOf(flatOther.base, base)) { |
- return intersectionStrictSubclass(flatOther, classWorld); |
- } else if (classWorld.isSubclassOf(base, flatOther.base)) { |
- return flatOther.intersectionStrictSubclass(this, classWorld); |
- } else if (classWorld.isSubtypeOf(flatOther.base, base)) { |
- return intersectionStrictSubtype(flatOther, classWorld); |
- } else if (classWorld.isSubtypeOf(base, flatOther.base)) { |
- return flatOther.intersectionStrictSubtype(this, classWorld); |
+ return intersectionSame(flatOther, closedWorld); |
+ } else if (closedWorld.isSubclassOf(flatOther.base, base)) { |
+ return intersectionStrictSubclass(flatOther, closedWorld); |
+ } else if (closedWorld.isSubclassOf(base, flatOther.base)) { |
+ return flatOther.intersectionStrictSubclass(this, closedWorld); |
+ } else if (closedWorld.isSubtypeOf(flatOther.base, base)) { |
+ return intersectionStrictSubtype(flatOther, closedWorld); |
+ } else if (closedWorld.isSubtypeOf(base, flatOther.base)) { |
+ return flatOther.intersectionStrictSubtype(this, closedWorld); |
} else { |
- return intersectionDisjoint(flatOther, classWorld); |
+ return intersectionDisjoint(flatOther, closedWorld); |
} |
} |
- bool isDisjoint(TypeMask other, ClassWorld classWorld) { |
- if (other is! FlatTypeMask) return other.isDisjoint(this, classWorld); |
+ bool isDisjoint(TypeMask other, ClosedWorld closedWorld) { |
+ if (other is! FlatTypeMask) return other.isDisjoint(this, closedWorld); |
FlatTypeMask flatOther = other; |
if (isNullable && flatOther.isNullable) return false; |
@@ -374,39 +374,39 @@ class FlatTypeMask implements TypeMask { |
if (base == flatOther.base) return false; |
if (isExact && flatOther.isExact) return true; |
- if (isExact) return !flatOther.contains(base, classWorld); |
- if (flatOther.isExact) return !contains(flatOther.base, classWorld); |
+ if (isExact) return !flatOther.contains(base, closedWorld); |
+ if (flatOther.isExact) return !contains(flatOther.base, closedWorld); |
// Normalization guarantees that isExact === !isSubclass && !isSubtype. |
// Both are subclass or subtype masks, so if there is a subclass |
// relationship, they are not disjoint. |
- if (classWorld.isSubclassOf(flatOther.base, base)) return false; |
- if (classWorld.isSubclassOf(base, flatOther.base)) return false; |
+ if (closedWorld.isSubclassOf(flatOther.base, base)) return false; |
+ if (closedWorld.isSubclassOf(base, flatOther.base)) return false; |
// Two different base classes have no common subclass unless one is a |
// subclass of the other (checked above). |
if (isSubclass && flatOther.isSubclass) return true; |
- return _isDisjointHelper(this, flatOther, classWorld); |
+ return _isDisjointHelper(this, flatOther, closedWorld); |
} |
static bool _isDisjointHelper( |
- FlatTypeMask a, FlatTypeMask b, ClassWorld classWorld) { |
+ FlatTypeMask a, FlatTypeMask b, ClosedWorld closedWorld) { |
if (!a.isSubclass && b.isSubclass) { |
- return _isDisjointHelper(b, a, classWorld); |
+ return _isDisjointHelper(b, a, closedWorld); |
} |
assert(a.isSubclass || a.isSubtype); |
assert(b.isSubtype); |
var elements = a.isSubclass |
- ? classWorld.strictSubclassesOf(a.base) |
- : classWorld.strictSubtypesOf(a.base); |
+ ? closedWorld.strictSubclassesOf(a.base) |
+ : closedWorld.strictSubtypesOf(a.base); |
for (var element in elements) { |
- if (classWorld.isSubtypeOf(element, b.base)) return false; |
+ if (closedWorld.isSubtypeOf(element, b.base)) return false; |
} |
return true; |
} |
- TypeMask intersectionSame(FlatTypeMask other, ClassWorld classWorld) { |
+ TypeMask intersectionSame(FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base == other.base); |
// The two masks share the base type, so we must chose the most |
// constraining kind (the lowest) of the two. Only if both masks |
@@ -420,14 +420,14 @@ class FlatTypeMask implements TypeMask { |
} else if (other.flags == combined) { |
return other; |
} else { |
- return new FlatTypeMask.normalized(base, combined, classWorld); |
+ return new FlatTypeMask.normalized(base, combined, closedWorld); |
} |
} |
TypeMask intersectionStrictSubclass( |
- FlatTypeMask other, ClassWorld classWorld) { |
+ FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base != other.base); |
- assert(classWorld.isSubclassOf(other.base, base)); |
+ assert(closedWorld.isSubclassOf(other.base, base)); |
// If this mask isn't at least a subclass mask, then the |
// intersection with the other mask is empty. |
if (isExact) return intersectionEmpty(other); |
@@ -440,15 +440,15 @@ class FlatTypeMask implements TypeMask { |
if (other.flags == combined) { |
return other; |
} else { |
- return new FlatTypeMask.normalized(other.base, combined, classWorld); |
+ return new FlatTypeMask.normalized(other.base, combined, closedWorld); |
} |
} |
TypeMask intersectionStrictSubtype( |
- FlatTypeMask other, ClassWorld classWorld) { |
+ FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base != other.base); |
- assert(classWorld.isSubtypeOf(other.base, base)); |
- if (!isSubtype) return intersectionHelper(other, classWorld); |
+ assert(closedWorld.isSubtypeOf(other.base, base)); |
+ if (!isSubtype) return intersectionHelper(other, closedWorld); |
// Only the other mask puts constraints on the intersection mask, |
// so base the combined flags on the other mask. Only if both |
// masks are nullable, will the result be nullable too. |
@@ -458,21 +458,21 @@ class FlatTypeMask implements TypeMask { |
if (other.flags == combined) { |
return other; |
} else { |
- return new FlatTypeMask.normalized(other.base, combined, classWorld); |
+ return new FlatTypeMask.normalized(other.base, combined, closedWorld); |
} |
} |
- TypeMask intersectionDisjoint(FlatTypeMask other, ClassWorld classWorld) { |
+ TypeMask intersectionDisjoint(FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base != other.base); |
- assert(!classWorld.isSubtypeOf(base, other.base)); |
- assert(!classWorld.isSubtypeOf(other.base, base)); |
- return intersectionHelper(other, classWorld); |
+ assert(!closedWorld.isSubtypeOf(base, other.base)); |
+ assert(!closedWorld.isSubtypeOf(other.base, base)); |
+ return intersectionHelper(other, closedWorld); |
} |
- TypeMask intersectionHelper(FlatTypeMask other, ClassWorld classWorld) { |
+ TypeMask intersectionHelper(FlatTypeMask other, ClosedWorld closedWorld) { |
assert(base != other.base); |
- assert(!classWorld.isSubclassOf(base, other.base)); |
- assert(!classWorld.isSubclassOf(other.base, base)); |
+ assert(!closedWorld.isSubclassOf(base, other.base)); |
+ assert(!closedWorld.isSubclassOf(other.base, base)); |
// If one of the masks are exact or if both of them are subclass |
// masks, then the intersection is empty. |
if (isExact || other.isExact) return intersectionEmpty(other); |
@@ -480,7 +480,7 @@ class FlatTypeMask implements TypeMask { |
assert(isSubtype || other.isSubtype); |
int kind = (isSubclass || other.isSubclass) ? SUBCLASS : SUBTYPE; |
// Compute the set of classes that are contained in both type masks. |
- Set<ClassElement> common = commonContainedClasses(this, other, classWorld); |
+ Set<ClassElement> common = commonContainedClasses(this, other, closedWorld); |
if (common == null || common.isEmpty) return intersectionEmpty(other); |
// Narrow down the candidates by only looking at common classes |
// that do not have a superclass or supertype that will be a |
@@ -505,9 +505,9 @@ class FlatTypeMask implements TypeMask { |
// to normalize here, as we generate types based on new base classes. |
int combined = (kind << 1) | (flags & other.flags & 1); |
Iterable<TypeMask> masks = candidates.map((ClassElement cls) { |
- return new FlatTypeMask.normalized(cls, combined, classWorld); |
+ return new FlatTypeMask.normalized(cls, combined, closedWorld); |
}); |
- return UnionTypeMask.unionOf(masks, classWorld); |
+ return UnionTypeMask.unionOf(masks, closedWorld); |
} |
TypeMask intersectionEmpty(FlatTypeMask other) { |
@@ -542,8 +542,8 @@ class FlatTypeMask implements TypeMask { |
* invoked on this type mask. [selector] is used to ensure library |
* privacy is taken into account. |
*/ |
- bool canHit(Element element, Selector selector, ClassWorld classWorld) { |
- Backend backend = classWorld.backend; |
+ bool canHit(Element element, Selector selector, ClosedWorld closedWorld) { |
+ Backend backend = closedWorld.backend; |
assert(element.name == selector.name); |
if (isEmpty) return false; |
if (isNull) { |
@@ -565,25 +565,25 @@ class FlatTypeMask implements TypeMask { |
} else if (isExact) { |
return hasElementIn(self, selector, element); |
} else if (isSubclass) { |
- assert(classWorld.isClosed); |
+ assert(closedWorld.isClosed); |
return hasElementIn(self, selector, element) || |
other.isSubclassOf(self) || |
- classWorld.hasAnySubclassThatMixes(self, other); |
+ closedWorld.hasAnySubclassThatMixes(self, other); |
} else { |
assert(isSubtype); |
- assert(classWorld.isClosed); |
+ assert(closedWorld.isClosed); |
bool result = hasElementIn(self, selector, element) || |
other.implementsInterface(self) || |
- classWorld.hasAnySubclassThatImplements(other, base) || |
- classWorld.hasAnySubclassOfMixinUseThatImplements(other, base); |
+ closedWorld.hasAnySubclassThatImplements(other, base) || |
+ closedWorld.hasAnySubclassOfMixinUseThatImplements(other, base); |
if (result) return true; |
// If the class is used as a mixin, we have to check if the element |
// can be hit from any of the mixin applications. |
- Iterable<ClassElement> mixinUses = classWorld.mixinUsesOf(self); |
+ Iterable<ClassElement> mixinUses = closedWorld.mixinUsesOf(self); |
return mixinUses.any((mixinApplication) => |
hasElementIn(mixinApplication, selector, element) || |
other.isSubclassOf(mixinApplication) || |
- classWorld.hasAnySubclassThatMixes(mixinApplication, other)); |
+ closedWorld.hasAnySubclassThatMixes(mixinApplication, other)); |
} |
} |
@@ -592,7 +592,7 @@ class FlatTypeMask implements TypeMask { |
* will hit a method at runtime, and not go through [noSuchMethod]. |
*/ |
static bool hasConcreteMatch( |
- ClassElement cls, Selector selector, ClassWorld world) { |
+ ClassElement cls, Selector selector, ClosedWorld world) { |
assert(invariant(cls, world.isInstantiated(cls), |
message: '$cls has not been instantiated.')); |
Element element = findMatchIn(cls, selector); |
@@ -605,7 +605,7 @@ class FlatTypeMask implements TypeMask { |
return selector.appliesUntyped(element, world.backend); |
} |
- bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) { |
+ bool needsNoSuchMethodHandling(Selector selector, ClosedWorld closedWorld) { |
// A call on an empty type mask is either dead code, or a call on |
// `null`. |
if (isEmptyOrNull) return false; |
@@ -658,14 +658,14 @@ class FlatTypeMask implements TypeMask { |
bool needsNoSuchMethod(ClassElement cls) { |
// We can skip uninstantiated subclasses. |
// TODO(johnniwinther): Put filtering into the (Class)World. |
- if (!classWorld.isInstantiated(cls)) { |
+ if (!closedWorld.isInstantiated(cls)) { |
return false; |
} |
// We can just skip abstract classes because we know no |
// instance of them will be created at runtime, and |
// therefore there is no instance that will require |
// [noSuchMethod] handling. |
- return !cls.isAbstract && !hasConcreteMatch(cls, selector, classWorld); |
+ return !cls.isAbstract && !hasConcreteMatch(cls, selector, closedWorld); |
} |
bool baseNeedsNoSuchMethod = needsNoSuchMethod(base); |
@@ -675,10 +675,10 @@ class FlatTypeMask implements TypeMask { |
Iterable<ClassElement> subclassesToCheck; |
if (isSubtype) { |
- subclassesToCheck = classWorld.strictSubtypesOf(base); |
+ subclassesToCheck = closedWorld.strictSubtypesOf(base); |
} else { |
assert(isSubclass); |
- subclassesToCheck = classWorld.strictSubclassesOf(base); |
+ subclassesToCheck = closedWorld.strictSubclassesOf(base); |
} |
return subclassesToCheck != null && |
@@ -696,17 +696,17 @@ class FlatTypeMask implements TypeMask { |
// all classes in the receiver type [this]. It could be found only in a |
// subclass or in an inheritance-wise unrelated class in case of subtype |
// selectors. |
- ClassWorld classWorld = compiler.closedWorld; |
+ ClosedWorld closedWorld = compiler.closedWorld; |
if (isSubtype) { |
- // if (classWorld.isUsedAsMixin(enclosing)) { |
- if (classWorld.everySubtypeIsSubclassOfOrMixinUseOf(base, enclosing)) { |
+ // if (closedWorld.isUsedAsMixin(enclosing)) { |
+ if (closedWorld.everySubtypeIsSubclassOfOrMixinUseOf(base, enclosing)) { |
return result; |
} |
//} |
return null; |
} else { |
if (base.isSubclassOf(enclosing)) return result; |
- if (classWorld.isSubclassOfMixinUseOf(base, enclosing)) return result; |
+ if (closedWorld.isSubclassOfMixinUseOf(base, enclosing)) return result; |
} |
return null; |
} |
@@ -734,24 +734,24 @@ class FlatTypeMask implements TypeMask { |
} |
static Set<ClassElement> commonContainedClasses( |
- FlatTypeMask x, FlatTypeMask y, ClassWorld classWorld) { |
- Iterable<ClassElement> xSubset = containedSubset(x, classWorld); |
+ FlatTypeMask x, FlatTypeMask y, ClosedWorld closedWorld) { |
+ Iterable<ClassElement> xSubset = containedSubset(x, closedWorld); |
if (xSubset == null) return null; |
- Iterable<ClassElement> ySubset = containedSubset(y, classWorld); |
+ Iterable<ClassElement> ySubset = containedSubset(y, closedWorld); |
if (ySubset == null) return null; |
return xSubset.toSet().intersection(ySubset.toSet()); |
} |
static Iterable<ClassElement> containedSubset( |
- FlatTypeMask x, ClassWorld classWorld) { |
+ FlatTypeMask x, ClosedWorld closedWorld) { |
ClassElement element = x.base; |
if (x.isExact) { |
return null; |
} else if (x.isSubclass) { |
- return classWorld.strictSubclassesOf(element); |
+ return closedWorld.strictSubclassesOf(element); |
} else { |
assert(x.isSubtype); |
- return classWorld.strictSubtypesOf(element); |
+ return closedWorld.strictSubtypesOf(element); |
} |
} |
} |