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

Unified Diff: pkg/compiler/lib/src/universe/universe.dart

Issue 2381793003: Rename Universe to WorldBuilder. (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/universe/universe.dart
diff --git a/pkg/compiler/lib/src/universe/universe.dart b/pkg/compiler/lib/src/universe/universe.dart
deleted file mode 100644
index 03fc3c1d213e936a5099b4a4ccb5dfb9a1b027c8..0000000000000000000000000000000000000000
--- a/pkg/compiler/lib/src/universe/universe.dart
+++ /dev/null
@@ -1,665 +0,0 @@
-// Copyright (c) 2012, 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.
-
-library universe;
-
-import 'dart:collection';
-
-import '../common.dart';
-import '../compiler.dart' show Compiler;
-import '../dart_types.dart';
-import '../elements/elements.dart';
-import '../util/util.dart';
-import '../world.dart' show World, ClosedWorld, OpenWorld;
-import 'selector.dart' show Selector;
-import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
-
-/// The known constraint on receiver for a dynamic call site.
-///
-/// This can for instance be used to constrain this dynamic call to `foo` to
-/// 'receivers of the exact instance `Bar`':
-///
-/// class Bar {
-/// void foo() {}
-/// }
-/// main() => new Bar().foo();
-///
-abstract class ReceiverConstraint {
- /// Returns whether [element] is a potential target when being
- /// invoked on a receiver with this constraint. [selector] is used to ensure
- /// library privacy is taken into account.
- bool canHit(Element element, Selector selector, World world);
-
- /// Returns whether this [TypeMask] applied to [selector] can hit a
- /// [noSuchMethod].
- bool needsNoSuchMethodHandling(Selector selector, World world);
-}
-
-/// The combined constraints on receivers all the dynamic call sites of the same
-/// selector.
-///
-/// For instance for these calls
-///
-/// class A {
-/// foo(a, b) {}
-/// }
-/// class B {
-/// foo(a, b) {}
-/// }
-/// class C {
-/// foo(a, b) {}
-/// }
-/// new A().foo(a, b);
-/// new B().foo(0, 42);
-///
-/// the selector constraints for dynamic calls to 'foo' with two positional
-/// arguments could be 'receiver of exact instance `A` or `B`'.
-abstract class SelectorConstraints {
- /// Returns `true` if [selector] applies to [element] under these constraints
- /// given the closed [world].
- ///
- /// Consider for instance in this world:
- ///
- /// class A {
- /// foo(a, b) {}
- /// }
- /// class B {
- /// foo(a, b) {}
- /// }
- /// new A().foo(a, b);
- ///
- /// Ideally the selector constraints for calls `foo` with two positional
- /// arguments apply to `A.foo` but `B.foo`.
- bool applies(Element element, Selector selector, World world);
-
- /// Returns `true` if at least one of the receivers matching these constraints
- /// in the closed [world] have no implementation matching [selector].
- ///
- /// For instance for this code snippet
- ///
- /// class A {}
- /// class B { foo() {} }
- /// m(b) => (b ? new A() : new B()).foo();
- ///
- /// the potential receiver `new A()` has no implementation of `foo` and thus
- /// needs to handle the call through its `noSuchMethod` handler.
- bool needsNoSuchMethodHandling(Selector selector, World world);
-}
-
-/// A mutable [SelectorConstraints] used in [Universe].
-abstract class UniverseSelectorConstraints extends SelectorConstraints {
- /// Adds [constraint] to these selector constraints. Return `true` if the set
- /// of potential receivers expanded due to the new constraint.
- bool addReceiverConstraint(ReceiverConstraint constraint);
-}
-
-/// Strategy for computing the constraints on potential receivers of dynamic
-/// call sites.
-abstract class SelectorConstraintsStrategy {
- /// Create a [UniverseSelectorConstraints] to represent the global receiver
- /// constraints for dynamic call sites with [selector].
- UniverseSelectorConstraints createSelectorConstraints(Selector selector);
-}
-
-/// The [Universe] is an auxiliary class used in the process of computing the
-/// [ClosedWorld]. The concepts here and in [ClosedWorld] are very similar -- in
-/// the same way that the "universe expands" you can think of this as a mutable
-/// world that is expanding as we visit and discover parts of the program.
-// TODO(sigmund): rename to "growing/expanding/mutable world"?
-// TODO(johnniwinther): Move common implementation to a [UniverseBase] when
-// universes and worlds have been unified.
-abstract class Universe {
- /// All directly instantiated classes, that is, classes with a generative
- /// constructor that has been called directly and not only through a
- /// super-call.
- // TODO(johnniwinther): Improve semantic precision.
- Iterable<ClassElement> get directlyInstantiatedClasses;
-
- /// All types that are checked either through is, as or checked mode checks.
- Iterable<DartType> get isChecks;
-
- /// Registers that [type] is checked in this universe. The unaliased type is
- /// returned.
- DartType registerIsCheck(DartType type, Compiler compiler);
-
- /// All directly instantiated types, that is, the types of the directly
- /// instantiated classes.
- // TODO(johnniwinther): Improve semantic precision.
- Iterable<DartType> get instantiatedTypes;
-
- /// Returns `true` if [member] is invoked as a setter.
- bool hasInvokedSetter(Element member, World world);
-}
-
-abstract class ResolutionUniverse implements Universe {
- /// Set of (live) local functions (closures) whose signatures reference type
- /// variables.
- ///
- /// A live function is one whose enclosing member function has been enqueued.
- Set<Element> get closuresWithFreeTypeVariables;
-
- /// Set of (live) `call` methods whose signatures reference type variables.
- ///
- /// A live `call` method is one whose enclosing class has been instantiated.
- Iterable<Element> get callMethodsWithFreeTypeVariables;
-
- /// Set of all closures in the program. Used by the mirror tracking system
- /// to find all live closure instances.
- Iterable<LocalFunctionElement> get allClosures;
-
- /// Set of methods in instantiated classes that are potentially closurized.
- Iterable<Element> get closurizedMembers;
-
- /// Returns `true` if [cls] is considered to be implemented by an
- /// instantiated class, either directly, through subclasses or through
- /// subtypes. The latter case only contains spurious information from
- /// instantiations through factory constructors and mixins.
- bool isImplemented(ClassElement cls);
-
- /// Set of all fields that are statically known to be written to.
- Iterable<Element> get fieldSetters;
-}
-
-class ResolutionUniverseImpl implements ResolutionUniverse {
- /// The set of all directly instantiated classes, that is, classes with a
- /// generative constructor that has been called directly and not only through
- /// a super-call.
- ///
- /// Invariant: Elements are declaration elements.
- // TODO(johnniwinther): [_directlyInstantiatedClasses] and
- // [_instantiatedTypes] sets should be merged.
- final Set<ClassElement> _directlyInstantiatedClasses =
- new Set<ClassElement>();
-
- /// The set of all directly instantiated types, that is, the types of the
- /// directly instantiated classes.
- ///
- /// See [_directlyInstantiatedClasses].
- final Set<DartType> _instantiatedTypes = new Set<DartType>();
-
- /// Classes implemented by directly instantiated classes.
- final Set<ClassElement> _implementedClasses = new Set<ClassElement>();
-
- /// The set of all referenced static fields.
- ///
- /// Invariant: Elements are declaration elements.
- final Set<FieldElement> allReferencedStaticFields = new Set<FieldElement>();
-
- /**
- * Documentation wanted -- johnniwinther
- *
- * Invariant: Elements are declaration elements.
- */
- final Set<FunctionElement> methodsNeedingSuperGetter =
- new Set<FunctionElement>();
- final Map<String, Map<Selector, SelectorConstraints>> _invokedNames =
- <String, Map<Selector, SelectorConstraints>>{};
- final Map<String, Map<Selector, SelectorConstraints>> _invokedGetters =
- <String, Map<Selector, SelectorConstraints>>{};
- final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
- <String, Map<Selector, SelectorConstraints>>{};
-
- /// Fields set.
- final Set<Element> fieldSetters = new Set<Element>();
- final Set<DartType> isChecks = new Set<DartType>();
-
- /**
- * Set of (live) [:call:] methods whose signatures reference type variables.
- *
- * A live [:call:] method is one whose enclosing class has been instantiated.
- */
- final Set<Element> callMethodsWithFreeTypeVariables = new Set<Element>();
-
- /**
- * Set of (live) local functions (closures) whose signatures reference type
- * variables.
- *
- * A live function is one whose enclosing member function has been enqueued.
- */
- final Set<Element> closuresWithFreeTypeVariables = new Set<Element>();
-
- /**
- * Set of all closures in the program. Used by the mirror tracking system
- * to find all live closure instances.
- */
- final Set<LocalFunctionElement> allClosures = new Set<LocalFunctionElement>();
-
- /**
- * Set of methods in instantiated classes that are potentially
- * closurized.
- */
- final Set<Element> closurizedMembers = new Set<Element>();
-
- final SelectorConstraintsStrategy selectorConstraintsStrategy;
-
- ResolutionUniverseImpl(this.selectorConstraintsStrategy);
-
- /// All directly instantiated classes, that is, classes with a generative
- /// constructor that has been called directly and not only through a
- /// super-call.
- // TODO(johnniwinther): Improve semantic precision.
- Iterable<ClassElement> get directlyInstantiatedClasses {
- return _directlyInstantiatedClasses;
- }
-
- /// All directly instantiated types, that is, the types of the directly
- /// instantiated classes.
- ///
- /// See [directlyInstantiatedClasses].
- // TODO(johnniwinther): Improve semantic precision.
- Iterable<DartType> get instantiatedTypes => _instantiatedTypes;
-
- /// Returns `true` if [cls] is considered to be implemented by an
- /// instantiated class, either directly, through subclasses or through
- /// subtypes. The latter case only contains spurious information from
- /// instantiations through factory constructors and mixins.
- // TODO(johnniwinther): Improve semantic precision.
- bool isImplemented(ClassElement cls) {
- return _implementedClasses.contains(cls.declaration);
- }
-
- /// Register [type] as (directly) instantiated.
- ///
- /// If [byMirrors] is `true`, the instantiation is through mirrors.
- // TODO(johnniwinther): Fully enforce the separation between exact, through
- // subclass and through subtype instantiated types/classes.
- // TODO(johnniwinther): Support unknown type arguments for generic types.
- void registerTypeInstantiation(InterfaceType type,
- {bool byMirrors: false,
- bool isNative: false,
- void onImplemented(ClassElement cls)}) {
- _instantiatedTypes.add(type);
- ClassElement cls = type.element;
- if (!cls.isAbstract
- // We can't use the closed-world assumption with native abstract
- // classes; a native abstract class may have non-abstract subclasses
- // not declared to the program. Instances of these classes are
- // indistinguishable from the abstract class.
- ||
- isNative
- // Likewise, if this registration comes from the mirror system,
- // all bets are off.
- // TODO(herhut): Track classes required by mirrors seperately.
- ||
- byMirrors) {
- _directlyInstantiatedClasses.add(cls);
- }
-
- // TODO(johnniwinther): Replace this by separate more specific mappings that
- // include the type arguments.
- if (_implementedClasses.add(cls)) {
- onImplemented(cls);
- cls.allSupertypes.forEach((InterfaceType supertype) {
- if (_implementedClasses.add(supertype.element)) {
- onImplemented(supertype.element);
- }
- });
- }
- }
-
- bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
- Element member, OpenWorld world) {
- if (selectors == null) return false;
- for (Selector selector in selectors.keys) {
- if (selector.appliesUnnamed(member)) {
- SelectorConstraints masks = selectors[selector];
- if (masks.applies(member, selector, world)) {
- return true;
- }
- }
- }
- return false;
- }
-
- bool hasInvocation(Element member, OpenWorld world) {
- return _hasMatchingSelector(_invokedNames[member.name], member, world);
- }
-
- bool hasInvokedGetter(Element member, OpenWorld world) {
- return _hasMatchingSelector(_invokedGetters[member.name], member, world) ||
- member.isFunction && methodsNeedingSuperGetter.contains(member);
- }
-
- bool hasInvokedSetter(Element member, OpenWorld world) {
- return _hasMatchingSelector(_invokedSetters[member.name], member, world);
- }
-
- bool registerDynamicUse(DynamicUse dynamicUse) {
- switch (dynamicUse.kind) {
- case DynamicUseKind.INVOKE:
- return _registerNewSelector(dynamicUse, _invokedNames);
- case DynamicUseKind.GET:
- return _registerNewSelector(dynamicUse, _invokedGetters);
- case DynamicUseKind.SET:
- return _registerNewSelector(dynamicUse, _invokedSetters);
- }
- }
-
- bool _registerNewSelector(DynamicUse dynamicUse,
- Map<String, Map<Selector, SelectorConstraints>> selectorMap) {
- Selector selector = dynamicUse.selector;
- String name = selector.name;
- ReceiverConstraint mask = dynamicUse.mask;
- Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
- name, () => new Maplet<Selector, SelectorConstraints>());
- UniverseSelectorConstraints constraints =
- selectors.putIfAbsent(selector, () {
- return selectorConstraintsStrategy.createSelectorConstraints(selector);
- });
- return constraints.addReceiverConstraint(mask);
- }
-
- DartType registerIsCheck(DartType type, Compiler compiler) {
- type.computeUnaliased(compiler.resolution);
- type = type.unaliased;
- // Even in checked mode, type annotations for return type and argument
- // types do not imply type checks, so there should never be a check
- // against the type variable of a typedef.
- isChecks.add(type);
- return type;
- }
-
- void registerStaticUse(StaticUse staticUse) {
- Element element = staticUse.element;
- if (Elements.isStaticOrTopLevel(element) && element.isField) {
- allReferencedStaticFields.add(element);
- }
- switch (staticUse.kind) {
- case StaticUseKind.SUPER_FIELD_SET:
- case StaticUseKind.FIELD_SET:
- fieldSetters.add(element);
- break;
- case StaticUseKind.SUPER_TEAR_OFF:
- methodsNeedingSuperGetter.add(element);
- break;
- case StaticUseKind.GENERAL:
- case StaticUseKind.STATIC_TEAR_OFF:
- case StaticUseKind.FIELD_GET:
- break;
- case StaticUseKind.CLOSURE:
- allClosures.add(element);
- break;
- }
- }
-
- void forgetElement(Element element, Compiler compiler) {
- allClosures.remove(element);
- slowDirectlyNestedClosures(element).forEach(compiler.forgetElement);
- closurizedMembers.remove(element);
- fieldSetters.remove(element);
- _directlyInstantiatedClasses.remove(element);
- if (element is ClassElement) {
- assert(invariant(element, element.thisType.isRaw,
- message: 'Generic classes not supported (${element.thisType}).'));
- _instantiatedTypes..remove(element.rawType)..remove(element.thisType);
- }
- }
-
- // TODO(ahe): Replace this method with something that is O(1), for example,
- // by using a map.
- List<LocalFunctionElement> slowDirectlyNestedClosures(Element element) {
- // Return new list to guard against concurrent modifications.
- return new List<LocalFunctionElement>.from(
- allClosures.where((LocalFunctionElement closure) {
- return closure.executableContext == element;
- }));
- }
-}
-
-/// Universe specific to codegen.
-///
-/// This adds additional access to liveness of selectors and elements.
-abstract class CodegenUniverse implements Universe {
- void forEachInvokedName(
- f(String name, Map<Selector, SelectorConstraints> selectors));
-
- void forEachInvokedGetter(
- f(String name, Map<Selector, SelectorConstraints> selectors));
-
- void forEachInvokedSetter(
- f(String name, Map<Selector, SelectorConstraints> selectors));
-
- bool hasInvokedGetter(Element member, ClosedWorld world);
-
- Map<Selector, SelectorConstraints> invocationsByName(String name);
-
- Map<Selector, SelectorConstraints> getterInvocationsByName(String name);
-
- Map<Selector, SelectorConstraints> setterInvocationsByName(String name);
-
- Iterable<FunctionElement> get staticFunctionsNeedingGetter;
- Iterable<FunctionElement> get methodsNeedingSuperGetter;
-
- /// The set of all referenced static fields.
- ///
- /// Invariant: Elements are declaration elements.
- Iterable<FieldElement> get allReferencedStaticFields;
-}
-
-class CodegenUniverseImpl implements CodegenUniverse {
- /// The set of all directly instantiated classes, that is, classes with a
- /// generative constructor that has been called directly and not only through
- /// a super-call.
- ///
- /// Invariant: Elements are declaration elements.
- // TODO(johnniwinther): [_directlyInstantiatedClasses] and
- // [_instantiatedTypes] sets should be merged.
- final Set<ClassElement> _directlyInstantiatedClasses =
- new Set<ClassElement>();
-
- /// The set of all directly instantiated types, that is, the types of the
- /// directly instantiated classes.
- ///
- /// See [_directlyInstantiatedClasses].
- final Set<DartType> _instantiatedTypes = new Set<DartType>();
-
- /// Classes implemented by directly instantiated classes.
- final Set<ClassElement> _implementedClasses = new Set<ClassElement>();
-
- /// The set of all referenced static fields.
- ///
- /// Invariant: Elements are declaration elements.
- final Set<FieldElement> allReferencedStaticFields = new Set<FieldElement>();
-
- /**
- * Documentation wanted -- johnniwinther
- *
- * Invariant: Elements are declaration elements.
- */
- final Set<FunctionElement> staticFunctionsNeedingGetter =
- new Set<FunctionElement>();
- final Set<FunctionElement> methodsNeedingSuperGetter =
- new Set<FunctionElement>();
- final Map<String, Map<Selector, SelectorConstraints>> _invokedNames =
- <String, Map<Selector, SelectorConstraints>>{};
- final Map<String, Map<Selector, SelectorConstraints>> _invokedGetters =
- <String, Map<Selector, SelectorConstraints>>{};
- final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
- <String, Map<Selector, SelectorConstraints>>{};
-
- final Set<DartType> isChecks = new Set<DartType>();
-
- final SelectorConstraintsStrategy selectorConstraintsStrategy;
-
- CodegenUniverseImpl(this.selectorConstraintsStrategy);
-
- /// All directly instantiated classes, that is, classes with a generative
- /// constructor that has been called directly and not only through a
- /// super-call.
- // TODO(johnniwinther): Improve semantic precision.
- Iterable<ClassElement> get directlyInstantiatedClasses {
- return _directlyInstantiatedClasses;
- }
-
- /// All directly instantiated types, that is, the types of the directly
- /// instantiated classes.
- ///
- /// See [directlyInstantiatedClasses].
- // TODO(johnniwinther): Improve semantic precision.
- Iterable<DartType> get instantiatedTypes => _instantiatedTypes;
-
- /// Register [type] as (directly) instantiated.
- ///
- /// If [byMirrors] is `true`, the instantiation is through mirrors.
- // TODO(johnniwinther): Fully enforce the separation between exact, through
- // subclass and through subtype instantiated types/classes.
- // TODO(johnniwinther): Support unknown type arguments for generic types.
- void registerTypeInstantiation(InterfaceType type,
- {bool byMirrors: false,
- bool isNative: false,
- void onImplemented(ClassElement cls)}) {
- _instantiatedTypes.add(type);
- ClassElement cls = type.element;
- if (!cls.isAbstract
- // We can't use the closed-world assumption with native abstract
- // classes; a native abstract class may have non-abstract subclasses
- // not declared to the program. Instances of these classes are
- // indistinguishable from the abstract class.
- ||
- isNative
- // Likewise, if this registration comes from the mirror system,
- // all bets are off.
- // TODO(herhut): Track classes required by mirrors seperately.
- ||
- byMirrors) {
- _directlyInstantiatedClasses.add(cls);
- }
-
- // TODO(johnniwinther): Replace this by separate more specific mappings that
- // include the type arguments.
- if (_implementedClasses.add(cls)) {
- onImplemented(cls);
- cls.allSupertypes.forEach((InterfaceType supertype) {
- if (_implementedClasses.add(supertype.element)) {
- onImplemented(supertype.element);
- }
- });
- }
- }
-
- bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
- Element member, ClosedWorld world) {
- if (selectors == null) return false;
- for (Selector selector in selectors.keys) {
- if (selector.appliesUnnamed(member)) {
- SelectorConstraints masks = selectors[selector];
- if (masks.applies(member, selector, world)) {
- return true;
- }
- }
- }
- return false;
- }
-
- bool hasInvocation(Element member, ClosedWorld world) {
- return _hasMatchingSelector(_invokedNames[member.name], member, world);
- }
-
- bool hasInvokedGetter(Element member, ClosedWorld world) {
- return _hasMatchingSelector(_invokedGetters[member.name], member, world) ||
- member.isFunction && methodsNeedingSuperGetter.contains(member);
- }
-
- bool hasInvokedSetter(Element member, ClosedWorld world) {
- return _hasMatchingSelector(_invokedSetters[member.name], member, world);
- }
-
- bool registerDynamicUse(DynamicUse dynamicUse) {
- switch (dynamicUse.kind) {
- case DynamicUseKind.INVOKE:
- return _registerNewSelector(dynamicUse, _invokedNames);
- case DynamicUseKind.GET:
- return _registerNewSelector(dynamicUse, _invokedGetters);
- case DynamicUseKind.SET:
- return _registerNewSelector(dynamicUse, _invokedSetters);
- }
- }
-
- bool _registerNewSelector(DynamicUse dynamicUse,
- Map<String, Map<Selector, SelectorConstraints>> selectorMap) {
- Selector selector = dynamicUse.selector;
- String name = selector.name;
- ReceiverConstraint mask = dynamicUse.mask;
- Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
- name, () => new Maplet<Selector, SelectorConstraints>());
- UniverseSelectorConstraints constraints =
- selectors.putIfAbsent(selector, () {
- return selectorConstraintsStrategy.createSelectorConstraints(selector);
- });
- return constraints.addReceiverConstraint(mask);
- }
-
- Map<Selector, SelectorConstraints> _asUnmodifiable(
- Map<Selector, SelectorConstraints> map) {
- if (map == null) return null;
- return new UnmodifiableMapView(map);
- }
-
- Map<Selector, SelectorConstraints> invocationsByName(String name) {
- return _asUnmodifiable(_invokedNames[name]);
- }
-
- Map<Selector, SelectorConstraints> getterInvocationsByName(String name) {
- return _asUnmodifiable(_invokedGetters[name]);
- }
-
- Map<Selector, SelectorConstraints> setterInvocationsByName(String name) {
- return _asUnmodifiable(_invokedSetters[name]);
- }
-
- void forEachInvokedName(
- f(String name, Map<Selector, SelectorConstraints> selectors)) {
- _invokedNames.forEach(f);
- }
-
- void forEachInvokedGetter(
- f(String name, Map<Selector, SelectorConstraints> selectors)) {
- _invokedGetters.forEach(f);
- }
-
- void forEachInvokedSetter(
- f(String name, Map<Selector, SelectorConstraints> selectors)) {
- _invokedSetters.forEach(f);
- }
-
- DartType registerIsCheck(DartType type, Compiler compiler) {
- type.computeUnaliased(compiler.resolution);
- type = type.unaliased;
- // Even in checked mode, type annotations for return type and argument
- // types do not imply type checks, so there should never be a check
- // against the type variable of a typedef.
- isChecks.add(type);
- return type;
- }
-
- void registerStaticUse(StaticUse staticUse) {
- Element element = staticUse.element;
- if (Elements.isStaticOrTopLevel(element) && element.isField) {
- allReferencedStaticFields.add(element);
- }
- switch (staticUse.kind) {
- case StaticUseKind.STATIC_TEAR_OFF:
- staticFunctionsNeedingGetter.add(element);
- break;
- case StaticUseKind.SUPER_TEAR_OFF:
- methodsNeedingSuperGetter.add(element);
- break;
- case StaticUseKind.SUPER_FIELD_SET:
- case StaticUseKind.FIELD_SET:
- case StaticUseKind.GENERAL:
- case StaticUseKind.CLOSURE:
- case StaticUseKind.FIELD_GET:
- break;
- }
- }
-
- void forgetElement(Element element, Compiler compiler) {
- _directlyInstantiatedClasses.remove(element);
- if (element is ClassElement) {
- assert(invariant(element, element.thisType.isRaw,
- message: 'Generic classes not supported (${element.thisType}).'));
- _instantiatedTypes..remove(element.rawType)..remove(element.thisType);
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698