| Index: pkg/compiler/lib/src/deferred_load.dart
|
| diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
|
| index 81ffd698f5932b4bb88cab922196cc2e2fa61491..0d377aa41d10f8fdd4b0a386d0c80a959d420870 100644
|
| --- a/pkg/compiler/lib/src/deferred_load.dart
|
| +++ b/pkg/compiler/lib/src/deferred_load.dart
|
| @@ -5,63 +5,52 @@
|
| library deferred_load;
|
|
|
| import 'common.dart';
|
| -import 'common/backend_api.dart' show
|
| - Backend;
|
| -import 'common/tasks.dart' show
|
| - CompilerTask;
|
| -import 'compiler.dart' show
|
| - Compiler;
|
| -import 'constants/values.dart' show
|
| - ConstantValue,
|
| - ConstructedConstantValue,
|
| - DeferredConstantValue,
|
| - StringConstantValue;
|
| +import 'common/backend_api.dart' show Backend;
|
| +import 'common/tasks.dart' show CompilerTask;
|
| +import 'compiler.dart' show Compiler;
|
| +import 'constants/values.dart'
|
| + show
|
| + ConstantValue,
|
| + ConstructedConstantValue,
|
| + DeferredConstantValue,
|
| + StringConstantValue;
|
| import 'dart_types.dart';
|
| -import 'elements/elements.dart' show
|
| - AccessorElement,
|
| - AstElement,
|
| - ClassElement,
|
| - Element,
|
| - ElementKind,
|
| - Elements,
|
| - ExportElement,
|
| - FunctionElement,
|
| - ImportElement,
|
| - LibraryElement,
|
| - LocalFunctionElement,
|
| - MetadataAnnotation,
|
| - PrefixElement,
|
| - ScopeContainerElement,
|
| - TypedefElement;
|
| -import 'js_backend/js_backend.dart' show
|
| - JavaScriptBackend;
|
| -import 'resolution/resolution.dart' show
|
| - AnalyzableElementX;
|
| -import 'resolution/tree_elements.dart' show
|
| - TreeElements;
|
| +import 'elements/elements.dart'
|
| + show
|
| + AccessorElement,
|
| + AstElement,
|
| + ClassElement,
|
| + Element,
|
| + ElementKind,
|
| + Elements,
|
| + ExportElement,
|
| + FunctionElement,
|
| + ImportElement,
|
| + LibraryElement,
|
| + LocalFunctionElement,
|
| + MetadataAnnotation,
|
| + PrefixElement,
|
| + ScopeContainerElement,
|
| + TypedefElement;
|
| +import 'js_backend/js_backend.dart' show JavaScriptBackend;
|
| +import 'resolution/resolution.dart' show AnalyzableElementX;
|
| +import 'resolution/tree_elements.dart' show TreeElements;
|
| import 'tree/tree.dart' as ast;
|
| -import 'tree/tree.dart' show
|
| - Import,
|
| - LibraryTag,
|
| - LibraryDependency,
|
| - LiteralDartString,
|
| - LiteralString,
|
| - NewExpression,
|
| - Node;
|
| -import 'universe/use.dart' show
|
| - DynamicUse,
|
| - StaticUse,
|
| - TypeUse,
|
| - TypeUseKind;
|
| -import 'universe/world_impact.dart' show
|
| - ImpactUseCase,
|
| - WorldImpact,
|
| - WorldImpactVisitorImpl;
|
| -import 'util/setlet.dart' show
|
| - Setlet;
|
| +import 'tree/tree.dart'
|
| + show
|
| + Import,
|
| + LibraryTag,
|
| + LibraryDependency,
|
| + LiteralDartString,
|
| + LiteralString,
|
| + NewExpression,
|
| + Node;
|
| +import 'universe/use.dart' show DynamicUse, StaticUse, TypeUse, TypeUseKind;
|
| +import 'universe/world_impact.dart'
|
| + show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
|
| +import 'util/setlet.dart' show Setlet;
|
| import 'util/uri_extras.dart' as uri_extras;
|
| -import 'util/util.dart' show
|
| - Link, makeUnique;
|
| +import 'util/util.dart' show Link, makeUnique;
|
|
|
| /// A "hunk" of the program that will be loaded whenever one of its [imports]
|
| /// are loaded.
|
| @@ -88,7 +77,7 @@ class OutputUnit {
|
|
|
| String toString() => "OutputUnit($name)";
|
|
|
| - bool operator==(OutputUnit other) {
|
| + bool operator ==(OutputUnit other) {
|
| return imports.length == other.imports.length &&
|
| imports.containsAll(other.imports);
|
| }
|
| @@ -96,7 +85,7 @@ class OutputUnit {
|
| int get hashCode {
|
| int sum = 0;
|
| for (_DeferredImport import in imports) {
|
| - sum = (sum + import.hashCode) & 0x3FFFFFFF; // Stay in 30 bit range.
|
| + sum = (sum + import.hashCode) & 0x3FFFFFFF; // Stay in 30 bit range.
|
| }
|
| return sum;
|
| }
|
| @@ -229,8 +218,8 @@ class DeferredLoadTask extends CompilerTask {
|
| return outputUnitTo.imports.containsAll(outputUnitFrom.imports);
|
| }
|
|
|
| - void registerConstantDeferredUse(DeferredConstantValue constant,
|
| - PrefixElement prefix) {
|
| + void registerConstantDeferredUse(
|
| + DeferredConstantValue constant, PrefixElement prefix) {
|
| OutputUnit outputUnit = new OutputUnit();
|
| outputUnit.imports.add(new _DeclaredDeferredImport(prefix.deferredImport));
|
| _constantToOutputUnit[constant] = outputUnit;
|
| @@ -265,12 +254,8 @@ class DeferredLoadTask extends CompilerTask {
|
| /// (not the transitive closure.)
|
| ///
|
| /// Adds the results to [elements] and [constants].
|
| - void _collectAllElementsAndConstantsResolvedFrom(
|
| - Element element,
|
| - Set<Element> elements,
|
| - Set<ConstantValue> constants,
|
| - isMirrorUsage) {
|
| -
|
| + void _collectAllElementsAndConstantsResolvedFrom(Element element,
|
| + Set<Element> elements, Set<ConstantValue> constants, isMirrorUsage) {
|
| if (element.isMalformed) {
|
| // Malformed elements are ignored.
|
| return;
|
| @@ -327,32 +312,30 @@ class DeferredLoadTask extends CompilerTask {
|
| compiler.impactStrategy.visitImpact(
|
| analyzableElement,
|
| worldImpact,
|
| - new WorldImpactVisitorImpl(
|
| - visitStaticUse: (StaticUse staticUse) {
|
| - elements.add(staticUse.element);
|
| - },
|
| - visitTypeUse: (TypeUse typeUse) {
|
| - DartType type = typeUse.type;
|
| - switch (typeUse.kind) {
|
| - case TypeUseKind.TYPE_LITERAL:
|
| - if (type.isTypedef || type.isInterfaceType) {
|
| - elements.add(type.element);
|
| - }
|
| - break;
|
| - case TypeUseKind.INSTANTIATION:
|
| - case TypeUseKind.IS_CHECK:
|
| - case TypeUseKind.AS_CAST:
|
| - case TypeUseKind.CATCH_TYPE:
|
| - collectTypeDependencies(type);
|
| - break;
|
| - case TypeUseKind.CHECKED_MODE_CHECK:
|
| - if (compiler.options.enableTypeAssertions) {
|
| - collectTypeDependencies(type);
|
| - }
|
| - break;
|
| + new WorldImpactVisitorImpl(visitStaticUse: (StaticUse staticUse) {
|
| + elements.add(staticUse.element);
|
| + }, visitTypeUse: (TypeUse typeUse) {
|
| + DartType type = typeUse.type;
|
| + switch (typeUse.kind) {
|
| + case TypeUseKind.TYPE_LITERAL:
|
| + if (type.isTypedef || type.isInterfaceType) {
|
| + elements.add(type.element);
|
| + }
|
| + break;
|
| + case TypeUseKind.INSTANTIATION:
|
| + case TypeUseKind.IS_CHECK:
|
| + case TypeUseKind.AS_CAST:
|
| + case TypeUseKind.CATCH_TYPE:
|
| + collectTypeDependencies(type);
|
| + break;
|
| + case TypeUseKind.CHECKED_MODE_CHECK:
|
| + if (compiler.options.enableTypeAssertions) {
|
| + collectTypeDependencies(type);
|
| }
|
| - }),
|
| - IMPACT_USE);
|
| + break;
|
| + }
|
| + }),
|
| + IMPACT_USE);
|
|
|
| TreeElements treeElements = analyzableElement.resolvedAst.elements;
|
| assert(treeElements != null);
|
| @@ -403,8 +386,7 @@ class DeferredLoadTask extends CompilerTask {
|
| elements.add(type.element.implementation);
|
| }
|
| elements.add(cls.implementation);
|
| - } else if (Elements.isStaticOrTopLevel(element) ||
|
| - element.isConstructor) {
|
| + } else if (Elements.isStaticOrTopLevel(element) || element.isConstructor) {
|
| elements.add(element);
|
| collectDependencies(element);
|
| }
|
| @@ -412,8 +394,7 @@ class DeferredLoadTask extends CompilerTask {
|
| // When instantiating a class, we record a reference to the
|
| // constructor, not the class itself. We must add all the
|
| // instance members of the constructor's class.
|
| - ClassElement implementation =
|
| - element.enclosingClass.implementation;
|
| + ClassElement implementation = element.enclosingClass.implementation;
|
| _collectAllElementsAndConstantsResolvedFrom(
|
| implementation, elements, constants, isMirrorUsage);
|
| }
|
| @@ -457,10 +438,10 @@ class DeferredLoadTask extends CompilerTask {
|
| }
|
|
|
| /// Add all dependencies of [constant] to the mapping of [import].
|
| - void _mapConstantDependencies(ConstantValue constant,
|
| - _DeferredImport import) {
|
| - Set<ConstantValue> constants = _constantsDeferredBy.putIfAbsent(import,
|
| - () => new Set<ConstantValue>());
|
| + void _mapConstantDependencies(
|
| + ConstantValue constant, _DeferredImport import) {
|
| + Set<ConstantValue> constants = _constantsDeferredBy.putIfAbsent(
|
| + import, () => new Set<ConstantValue>());
|
| if (constants.contains(constant)) return;
|
| constants.add(constant);
|
| if (constant is ConstructedConstantValue) {
|
| @@ -475,13 +456,10 @@ class DeferredLoadTask extends CompilerTask {
|
| /// or [constant], mapping deferred imports to each dependency it needs in the
|
| /// sets [_importedDeferredBy] and [_constantsDeferredBy].
|
| /// Only one of [element] and [constant] should be given.
|
| - void _mapDependencies({Element element,
|
| - _DeferredImport import,
|
| - isMirrorUsage: false}) {
|
| -
|
| - Set<Element> elements = _importedDeferredBy.putIfAbsent(import,
|
| - () => new Set<Element>());
|
| -
|
| + void _mapDependencies(
|
| + {Element element, _DeferredImport import, isMirrorUsage: false}) {
|
| + Set<Element> elements =
|
| + _importedDeferredBy.putIfAbsent(import, () => new Set<Element>());
|
|
|
| Set<Element> dependentElements = new Set<Element>();
|
| Set<ConstantValue> dependentConstants = new Set<ConstantValue>();
|
| @@ -497,7 +475,6 @@ class DeferredLoadTask extends CompilerTask {
|
| if (import != _fakeMainImport && _mainElements.contains(element)) return;
|
| elements.add(element);
|
|
|
| -
|
| // This call can modify [dependentElements] and [dependentConstants].
|
| _collectAllElementsAndConstantsResolvedFrom(
|
| element, dependentElements, dependentConstants, isMirrorUsage);
|
| @@ -508,7 +485,8 @@ class DeferredLoadTask extends CompilerTask {
|
| for (Element dependency in dependentElements) {
|
| if (_isExplicitlyDeferred(dependency, library)) {
|
| for (ImportElement deferredImport in _getImports(dependency, library)) {
|
| - _mapDependencies(element: dependency,
|
| + _mapDependencies(
|
| + element: dependency,
|
| import: new _DeclaredDeferredImport(deferredImport));
|
| }
|
| } else {
|
| @@ -530,8 +508,8 @@ class DeferredLoadTask extends CompilerTask {
|
| ///
|
| /// The elements are added with [_mapDependencies].
|
| void _addMirrorElements() {
|
| - void mapDependenciesIfResolved(Element element,
|
| - _DeferredImport deferredImport) {
|
| + void mapDependenciesIfResolved(
|
| + Element element, _DeferredImport deferredImport) {
|
| // If an element is the target of a MirrorsUsed annotation but never used
|
| // It will not be resolved, and we should not call isNeededForReflection.
|
| // TODO(sigurdm): Unresolved elements should just answer false when
|
| @@ -568,8 +546,8 @@ class DeferredLoadTask extends CompilerTask {
|
|
|
| for (_DeferredImport deferredImport in _allDeferredImports.keys) {
|
| LibraryElement deferredLibrary = _allDeferredImports[deferredImport];
|
| - for (LibraryElement library in
|
| - _nonDeferredReachableLibraries(deferredLibrary)) {
|
| + for (LibraryElement library
|
| + in _nonDeferredReachableLibraries(deferredLibrary)) {
|
| handleLibrary(library, deferredImport);
|
| }
|
| }
|
| @@ -642,7 +620,6 @@ class DeferredLoadTask extends CompilerTask {
|
| _importedDeferredBy[_fakeMainImport] = _mainElements;
|
|
|
| measureElement(mainLibrary, () {
|
| -
|
| // Starting from main, traverse the program and find all dependencies.
|
| _mapDependencies(element: compiler.mainFunction, import: _fakeMainImport);
|
|
|
| @@ -676,7 +653,8 @@ class DeferredLoadTask extends CompilerTask {
|
| } else {
|
| elementToOutputUnitBuilder
|
| .putIfAbsent(element, () => new OutputUnit())
|
| - .imports.add(import);
|
| + .imports
|
| + .add(import);
|
| }
|
| }
|
| }
|
| @@ -689,7 +667,8 @@ class DeferredLoadTask extends CompilerTask {
|
| } else {
|
| constantToOutputUnitBuilder
|
| .putIfAbsent(constant, () => new OutputUnit())
|
| - .imports.add(import);
|
| + .imports
|
| + .add(import);
|
| }
|
| }
|
| }
|
| @@ -700,8 +679,8 @@ class DeferredLoadTask extends CompilerTask {
|
|
|
| // Find all the output units elements/constants have been mapped to, and
|
| // canonicalize them.
|
| - elementToOutputUnitBuilder.forEach(
|
| - (Element element, OutputUnit outputUnit) {
|
| + elementToOutputUnitBuilder
|
| + .forEach((Element element, OutputUnit outputUnit) {
|
| OutputUnit representative = allOutputUnits.lookup(outputUnit);
|
| if (representative == null) {
|
| representative = outputUnit;
|
| @@ -709,8 +688,8 @@ class DeferredLoadTask extends CompilerTask {
|
| }
|
| _elementToOutputUnit[element] = representative;
|
| });
|
| - constantToOutputUnitBuilder.forEach(
|
| - (ConstantValue constant, OutputUnit outputUnit) {
|
| + constantToOutputUnitBuilder
|
| + .forEach((ConstantValue constant, OutputUnit outputUnit) {
|
| OutputUnit representative = allOutputUnits.lookup(outputUnit);
|
| if (representative == null) {
|
| representative = outputUnit;
|
| @@ -768,15 +747,13 @@ class DeferredLoadTask extends CompilerTask {
|
| compiler.constants.getConstantValue(metadata.constant);
|
| Element element = value.getType(compiler.coreTypes).element;
|
| if (element == deferredLibraryClass) {
|
| - reporter.reportErrorMessage(
|
| - import, MessageKind.DEFERRED_OLD_SYNTAX);
|
| + reporter.reportErrorMessage(
|
| + import, MessageKind.DEFERRED_OLD_SYNTAX);
|
| }
|
| }
|
| }
|
|
|
| - String prefix = (import.prefix != null)
|
| - ? import.prefix.name
|
| - : null;
|
| + String prefix = (import.prefix != null) ? import.prefix.name : null;
|
| // The last import we saw with the same prefix.
|
| ImportElement previousDeferredImport = prefixDeferredImport[prefix];
|
| if (import.isDeferred) {
|
| @@ -786,8 +763,7 @@ class DeferredLoadTask extends CompilerTask {
|
|
|
| if (prefix == null) {
|
| reporter.reportErrorMessage(
|
| - import,
|
| - MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX);
|
| + import, MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX);
|
| } else {
|
| prefixDeferredImport[prefix] = import;
|
| _deferredImportDescriptions[key] =
|
| @@ -802,8 +778,7 @@ class DeferredLoadTask extends CompilerTask {
|
| ImportElement failingImport = (previousDeferredImport != null)
|
| ? previousDeferredImport
|
| : import;
|
| - reporter.reportErrorMessage(
|
| - failingImport.prefix,
|
| + reporter.reportErrorMessage(failingImport.prefix,
|
| MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX);
|
| }
|
| usedPrefixes.add(prefix);
|
| @@ -813,7 +788,7 @@ class DeferredLoadTask extends CompilerTask {
|
| }
|
| if (isProgramSplit) {
|
| isProgramSplit = compiler.backend.enableDeferredLoadingIfSupported(
|
| - lastDeferred, compiler.globalDependencies);
|
| + lastDeferred, compiler.globalDependencies);
|
| }
|
| }
|
|
|
| @@ -893,15 +868,17 @@ class DeferredLoadTask extends CompilerTask {
|
| _deferredImportDescriptions.keys.forEach((_DeferredImport import) {
|
| List<OutputUnit> outputUnits = hunksToLoad[importDeferName[import]];
|
| ImportDescription description = _deferredImportDescriptions[import];
|
| - Map<String, dynamic> libraryMap =
|
| - mapping.putIfAbsent(description.importingUri,
|
| - () => <String, dynamic>{"name": description.importingLibraryName,
|
| - "imports": <String, List<String>>{}});
|
| -
|
| - libraryMap["imports"][importDeferName[import]] = outputUnits.map(
|
| - (OutputUnit outputUnit) {
|
| - return backend.deferredPartFileName(outputUnit.name);
|
| - }).toList();
|
| + Map<String, dynamic> libraryMap = mapping.putIfAbsent(
|
| + description.importingUri,
|
| + () => <String, dynamic>{
|
| + "name": description.importingLibraryName,
|
| + "imports": <String, List<String>>{}
|
| + });
|
| +
|
| + libraryMap["imports"][importDeferName[import]] =
|
| + outputUnits.map((OutputUnit outputUnit) {
|
| + return backend.deferredPartFileName(outputUnit.name);
|
| + }).toList();
|
| });
|
| return mapping;
|
| }
|
| @@ -909,13 +886,13 @@ class DeferredLoadTask extends CompilerTask {
|
| /// Creates a textual representation of the output unit content.
|
| String dump() {
|
| Map<OutputUnit, List<String>> elementMap = <OutputUnit, List<String>>{};
|
| - Map<OutputUnit, List<String>> constantMap =
|
| - <OutputUnit, List<String>>{};
|
| + Map<OutputUnit, List<String>> constantMap = <OutputUnit, List<String>>{};
|
| _elementToOutputUnit.forEach((Element element, OutputUnit output) {
|
| elementMap.putIfAbsent(output, () => <String>[]).add('$element');
|
| });
|
| _constantToOutputUnit.forEach((ConstantValue value, OutputUnit output) {
|
| - constantMap.putIfAbsent(output, () => <String>[])
|
| + constantMap
|
| + .putIfAbsent(output, () => <String>[])
|
| .add(value.toStructuredString());
|
| });
|
|
|
| @@ -939,28 +916,27 @@ class DeferredLoadTask extends CompilerTask {
|
| }
|
| return sb.toString();
|
| }
|
| -
|
| }
|
|
|
| class ImportDescription {
|
| /// Relative uri to the importing library.
|
| final String importingUri;
|
| +
|
| /// The prefix this import is imported as.
|
| final String prefix;
|
| final LibraryElement _importingLibrary;
|
|
|
| - ImportDescription(ImportElement import,
|
| - LibraryElement importingLibrary,
|
| - Compiler compiler)
|
| - : importingUri = uri_extras.relativize(
|
| - compiler.mainApp.canonicalUri,
|
| - importingLibrary.canonicalUri, false),
|
| + ImportDescription(
|
| + ImportElement import, LibraryElement importingLibrary, Compiler compiler)
|
| + : importingUri = uri_extras.relativize(compiler.mainApp.canonicalUri,
|
| + importingLibrary.canonicalUri, false),
|
| prefix = import.prefix.name,
|
| _importingLibrary = importingLibrary;
|
|
|
| String get importingLibraryName {
|
| return _importingLibrary.hasLibraryName
|
| - ? _importingLibrary.libraryName : "<unnamed>";
|
| + ? _importingLibrary.libraryName
|
| + : "<unnamed>";
|
| }
|
| }
|
|
|
|
|