| 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
|
| deleted file mode 100644
|
| index bb97a15392d72c02e6d26fb6e9254c586fcb1c81..0000000000000000000000000000000000000000
|
| --- a/pkg/compiler/lib/src/types/type_mask.dart
|
| +++ /dev/null
|
| @@ -1,264 +0,0 @@
|
| -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -part of types;
|
| -
|
| -/**
|
| - * A type mask represents a set of contained classes, but the
|
| - * operations on it are not guaranteed to be precise and they may
|
| - * yield conservative answers that contain too many classes.
|
| - */
|
| -abstract class TypeMask {
|
| - factory TypeMask(ClassElement base,
|
| - int kind,
|
| - bool isNullable,
|
| - ClassWorld classWorld) {
|
| - return new FlatTypeMask.normalized(
|
| - base, (kind << 1) | (isNullable ? 1 : 0), classWorld);
|
| - }
|
| -
|
| - const factory TypeMask.empty() = FlatTypeMask.empty;
|
| -
|
| - factory TypeMask.exact(ClassElement base, ClassWorld classWorld) {
|
| - assert(invariant(base, classWorld.isInstantiated(base),
|
| - message: "Cannot create extact type mask for uninstantiated class"));
|
| - return new FlatTypeMask.exact(base);
|
| - }
|
| -
|
| - factory TypeMask.exactOrEmpty(ClassElement base, ClassWorld classWorld) {
|
| - if (classWorld.isInstantiated(base)) return new FlatTypeMask.exact(base);
|
| - return const TypeMask.empty();
|
| - }
|
| -
|
| - factory TypeMask.subclass(ClassElement base, ClassWorld classWorld) {
|
| - if (classWorld.hasAnySubclass(base)) {
|
| - return new FlatTypeMask.subclass(base);
|
| - } else {
|
| - return new TypeMask.exactOrEmpty(base, classWorld);
|
| - }
|
| - }
|
| -
|
| - factory TypeMask.subtype(ClassElement base, ClassWorld classWorld) {
|
| - if (classWorld.hasOnlySubclasses(base)) {
|
| - return new TypeMask.subclass(base, classWorld);
|
| - }
|
| - if (classWorld.hasAnySubtype(base)) {
|
| - return new FlatTypeMask.subtype(base);
|
| - } else {
|
| - return new TypeMask.exactOrEmpty(base, classWorld);
|
| - }
|
| - }
|
| -
|
| - const factory TypeMask.nonNullEmpty() = FlatTypeMask.nonNullEmpty;
|
| -
|
| - factory TypeMask.nonNullExact(ClassElement base, ClassWorld classWorld) {
|
| - assert(invariant(base, classWorld.isInstantiated(base),
|
| - message: "Cannot create extact type mask for uninstantiated class"));
|
| - return new FlatTypeMask.nonNullExact(base);
|
| - }
|
| -
|
| - factory TypeMask.nonNullExactOrEmpty(ClassElement base,
|
| - ClassWorld classWorld) {
|
| - if (classWorld.isInstantiated(base)) {
|
| - return new FlatTypeMask.nonNullExact(base);
|
| - }
|
| - return const TypeMask.nonNullEmpty();
|
| - }
|
| -
|
| - factory TypeMask.nonNullSubclass(ClassElement base, ClassWorld classWorld) {
|
| - if (classWorld.hasAnySubclass(base)) {
|
| - return new FlatTypeMask.nonNullSubclass(base);
|
| - } else {
|
| - return new TypeMask.nonNullExactOrEmpty(base, classWorld);
|
| - }
|
| - }
|
| -
|
| - factory TypeMask.nonNullSubtype(ClassElement base, ClassWorld classWorld) {
|
| - if (classWorld.hasOnlySubclasses(base)) {
|
| - return new TypeMask.nonNullSubclass(base, classWorld);
|
| - }
|
| - if (classWorld.hasAnySubtype(base)) {
|
| - return new FlatTypeMask.nonNullSubtype(base);
|
| - } else {
|
| - return new TypeMask.nonNullExactOrEmpty(base, classWorld);
|
| - }
|
| - }
|
| -
|
| - factory TypeMask.unionOf(Iterable<TypeMask> masks, ClassWorld classWorld) {
|
| - return UnionTypeMask.unionOf(masks, classWorld);
|
| - }
|
| -
|
| - /**
|
| - * If [mask] is forwarding, returns the first non-forwarding [TypeMask] in
|
| - * [mask]'s forwarding chain.
|
| - */
|
| - static TypeMask nonForwardingMask(mask) {
|
| - while (mask.isForwarding) {
|
| - mask = mask.forwardTo;
|
| - }
|
| - return mask;
|
| - }
|
| -
|
| - /**
|
| - * Asserts that this mask uses the smallest possible representation for
|
| - * its types. Currently, we normalize subtype and subclass to exact if no
|
| - * subtypes or subclasses are present and subtype to subclass if only
|
| - * 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);
|
| - return invariant(NO_LOCATION_SPANNABLE, reason == null,
|
| - message: () => '$mask is not normalized: $reason');
|
| - }
|
| -
|
| - static String getNotNormalizedReason(TypeMask mask, ClassWorld classWorld) {
|
| - mask = nonForwardingMask(mask);
|
| - if (mask is FlatTypeMask) {
|
| - if (mask.isEmpty) return null;
|
| - if (mask.isExact) {
|
| - if (!classWorld.isInstantiated(mask.base)) {
|
| - return 'Exact ${mask.base} is not instantiated.';
|
| - }
|
| - return null;
|
| - }
|
| - if (mask.isSubclass) {
|
| - if (!classWorld.hasAnySubclass(mask.base)) {
|
| - return 'Subclass ${mask.base} does not have any subclasses.';
|
| - }
|
| - return null;
|
| - }
|
| - assert(mask.isSubtype);
|
| - if (!classWorld.hasAnySubtype(mask.base)) {
|
| - return 'Subtype ${mask.base} does not have any subclasses.';
|
| - }
|
| - if (classWorld.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);
|
| - if (submaskReason != null) {
|
| - return 'Submask $submask in $mask: $submaskReason.';
|
| - }
|
| - }
|
| - return null;
|
| - }
|
| - return 'Unknown type mask $mask.';
|
| - }
|
| -
|
| - /**
|
| - * Returns a nullable variant of [this] type mask.
|
| - */
|
| - TypeMask nullable();
|
| -
|
| - /**
|
| - * Returns a non-nullable variant of [this] type mask.
|
| - */
|
| - TypeMask nonNullable();
|
| -
|
| - bool get isEmpty;
|
| - bool get isNullable;
|
| - bool get isExact;
|
| -
|
| - /// Returns true if this mask is a union type.
|
| - bool get isUnion;
|
| -
|
| - /// Returns `true` if this mask is a [ContainerTypeMask].
|
| - bool get isContainer;
|
| -
|
| - /// Returns `true` if this mask is a [MapTypeMask].
|
| - bool get isMap;
|
| -
|
| - /// Returns `true` if this mask is a [MapTypeMask] in dictionary mode, i.e.,
|
| - /// all keys are known string values and we have specific type information for
|
| - /// corresponding values.
|
| - bool get isDictionary;
|
| -
|
| - /// Returns `true` if this mask is wrapping another mask for the purpose of
|
| - /// tracing.
|
| - bool get isForwarding;
|
| -
|
| - /// 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 containsOnly(ClassElement element);
|
| -
|
| - /**
|
| - * Compares two [TypeMask] objects for structural equality.
|
| - *
|
| - * Note: This may differ from semantic equality in the set containment sense.
|
| - * Use [containsMask] and [isInMask] for that, instead.
|
| - */
|
| - bool operator==(other);
|
| -
|
| - /**
|
| - * Returns `true` if [other] is a supertype of this mask, i.e., if
|
| - * this mask is in [other].
|
| - */
|
| - bool isInMask(TypeMask other, ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns `true` if [other] is a subtype of this mask, i.e., if
|
| - * this mask contains [other].
|
| - */
|
| - bool containsMask(TypeMask other, ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns whether this type mask is an instance of [cls].
|
| - */
|
| - bool satisfies(ClassElement cls, ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns whether or not this type mask contains the given type.
|
| - */
|
| - bool contains(ClassElement type, ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns whether or not this type mask contains all types.
|
| - */
|
| - bool containsAll(ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns the [ClassElement] if this type represents a single class,
|
| - * otherwise returns `null`. This method is conservative.
|
| - */
|
| - ClassElement singleClass(ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns a type mask representing the union of [this] and [other].
|
| - */
|
| - TypeMask union(TypeMask other, ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns a type mask representing the intersection of [this] and [other].
|
| - */
|
| - TypeMask intersection(TypeMask other, ClassWorld classWorld);
|
| -
|
| - /**
|
| - * Returns whether this [TypeMask] applied to [selector] can hit a
|
| - * [noSuchMethod].
|
| - */
|
| - bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld);
|
| -
|
| - /**
|
| - * 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);
|
| -
|
| - /**
|
| - * Returns the [element] that is known to always be hit at runtime
|
| - * on this mask. Returns null if there is none.
|
| - */
|
| - // TODO(johnniwinther): Move this method to [World].
|
| - Element locateSingleElement(Selector selector, Compiler compiler);
|
| -}
|
|
|