| Index: pkg/compiler/lib/src/enqueue.dart
|
| diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
|
| index 6d71d732d8992e8e5f5da11e092beae0165bd250..212218df4d94697e8b4708ccfcdcd1752f06d0d5 100644
|
| --- a/pkg/compiler/lib/src/enqueue.dart
|
| +++ b/pkg/compiler/lib/src/enqueue.dart
|
| @@ -112,9 +112,15 @@ class WorldImpact {
|
|
|
| // TODO(johnniwinther): Collect checked types for checked mode separately to
|
| // support serialization.
|
| - Iterable<DartType> get checkedTypes => const <DartType>[];
|
| + Iterable<DartType> get isChecks => const <DartType>[];
|
| +
|
| + Iterable<DartType> get checkedModeChecks => const <DartType>[];
|
| +
|
| + Iterable<DartType> get asCasts => const <DartType>[];
|
|
|
| Iterable<MethodElement> get closurizedFunctions => const <MethodElement>[];
|
| +
|
| + Iterable<LocalFunctionElement> get closures => const <LocalFunctionElement>[];
|
| }
|
|
|
| abstract class Enqueuer {
|
| @@ -161,6 +167,10 @@ abstract class Enqueuer {
|
| /// Returns [:true:] if [member] has been processed by this enqueuer.
|
| bool isProcessed(Element member);
|
|
|
| + bool isClassProcessed(ClassElement cls) => _processedClasses.contains(cls);
|
| +
|
| + Iterable<ClassElement> get processedClasses => _processedClasses;
|
| +
|
| /**
|
| * Documentation wanted -- johnniwinther
|
| *
|
| @@ -190,10 +200,14 @@ abstract class Enqueuer {
|
| worldImpact.dynamicGetters.forEach(registerDynamicGetter);
|
| worldImpact.dynamicSetters.forEach(registerDynamicSetter);
|
| worldImpact.staticUses.forEach(registerStaticUse);
|
| - // TODO(johnniwinther): Register [worldImpact.instantiatedTypes] when it
|
| - // doesn't require a [Registry].
|
| - worldImpact.checkedTypes.forEach(registerIsCheck);
|
| + worldImpact.instantiatedTypes.forEach(registerInstantiatedType);
|
| + worldImpact.isChecks.forEach(registerIsCheck);
|
| + worldImpact.asCasts.forEach(registerIsCheck);
|
| + if (compiler.enableTypeAssertions) {
|
| + worldImpact.checkedModeChecks.forEach(registerIsCheck);
|
| + }
|
| worldImpact.closurizedFunctions.forEach(registerGetOfStaticFunction);
|
| + worldImpact.closures.forEach(registerClosure);
|
| }
|
|
|
| // TODO(johnniwinther): Remove the need for passing the [registry].
|
| @@ -334,6 +348,15 @@ abstract class Enqueuer {
|
|
|
| void processClass(ClassElement superclass) {
|
| if (_processedClasses.contains(superclass)) return;
|
| + // TODO(johnniwinther): Re-insert this invariant when unittests don't
|
| + // fail. There is already a similar invariant on the members.
|
| + /*if (!isResolutionQueue) {
|
| + assert(invariant(superclass,
|
| + superclass.isClosure ||
|
| + compiler.enqueuer.resolution.isClassProcessed(superclass),
|
| + message: "Class $superclass has not been "
|
| + "processed in resolution."));
|
| + }*/
|
|
|
| _processedClasses.add(superclass);
|
| recentClasses.add(superclass);
|
| @@ -767,7 +790,7 @@ class ResolutionEnqueuer extends Enqueuer {
|
| *
|
| * Invariant: Key elements are declaration elements.
|
| */
|
| - final Set<AstElement> resolvedElements;
|
| + final Set<AstElement> processedElements;
|
|
|
| final Queue<ResolutionWorkItem> queue;
|
|
|
| @@ -784,22 +807,22 @@ class ResolutionEnqueuer extends Enqueuer {
|
| compiler,
|
| itemCompilationContextCreator,
|
| strategy),
|
| - resolvedElements = new Set<AstElement>(),
|
| + processedElements = new Set<AstElement>(),
|
| queue = new Queue<ResolutionWorkItem>(),
|
| deferredTaskQueue = new Queue<DeferredTask>();
|
|
|
| bool get isResolutionQueue => true;
|
|
|
| - bool isProcessed(Element member) => resolvedElements.contains(member);
|
| + bool isProcessed(Element member) => processedElements.contains(member);
|
|
|
| /// Returns `true` if [element] has been processed by the resolution enqueuer.
|
| - bool hasBeenResolved(Element element) {
|
| - return resolvedElements.contains(element.analyzableElement.declaration);
|
| + bool hasBeenProcessed(Element element) {
|
| + return processedElements.contains(element.analyzableElement.declaration);
|
| }
|
|
|
| - /// Registers [element] as resolved for the resolution enqueuer.
|
| - void registerResolvedElement(AstElement element) {
|
| - resolvedElements.add(element);
|
| + /// Registers [element] as processed by the resolution enqueuer.
|
| + void registerProcessedElement(AstElement element) {
|
| + processedElements.add(element);
|
| }
|
|
|
| /**
|
| @@ -820,7 +843,7 @@ class ResolutionEnqueuer extends Enqueuer {
|
|
|
| assert(invariant(element, element is AnalyzableElement,
|
| message: 'Element $element is not analyzable.'));
|
| - if (hasBeenResolved(element)) return false;
|
| + if (hasBeenProcessed(element)) return false;
|
| if (queueIsClosed) {
|
| throw new SpannableAssertionFailure(element,
|
| "Resolution work list is closed. Trying to add $element.");
|
| @@ -912,12 +935,12 @@ class ResolutionEnqueuer extends Enqueuer {
|
| }
|
|
|
| void _logSpecificSummary(log(message)) {
|
| - log('Resolved ${resolvedElements.length} elements.');
|
| + log('Resolved ${processedElements.length} elements.');
|
| }
|
|
|
| void forgetElement(Element element) {
|
| super.forgetElement(element);
|
| - resolvedElements.remove(element);
|
| + processedElements.remove(element);
|
| }
|
| }
|
|
|
|
|