OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library deferred_load; | 5 library deferred_load; |
6 | 6 |
7 import 'common/backend_api.dart' show | 7 import 'common/backend_api.dart' show |
8 Backend; | 8 Backend; |
9 import 'common/resolution.dart' show | 9 import 'common/resolution.dart' show |
10 Resolution; | 10 Resolution; |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 | 196 |
197 bool isDeferred(Element element) { | 197 bool isDeferred(Element element) { |
198 return outputUnitForElement(element) != mainOutputUnit; | 198 return outputUnitForElement(element) != mainOutputUnit; |
199 } | 199 } |
200 | 200 |
201 /// Returns the unique name for the deferred import of [prefix]. | 201 /// Returns the unique name for the deferred import of [prefix]. |
202 String getImportDeferName(Spannable node, PrefixElement prefix) { | 202 String getImportDeferName(Spannable node, PrefixElement prefix) { |
203 String name = | 203 String name = |
204 _importDeferName[new _DeclaredDeferredImport(prefix.deferredImport)]; | 204 _importDeferName[new _DeclaredDeferredImport(prefix.deferredImport)]; |
205 if (name == null) { | 205 if (name == null) { |
206 compiler.internalError(node, "No deferred name for $prefix."); | 206 reporter.internalError(node, "No deferred name for $prefix."); |
207 } | 207 } |
208 return name; | 208 return name; |
209 } | 209 } |
210 | 210 |
211 /// Returns `true` if element [to] is reachable from element [from] without | 211 /// Returns `true` if element [to] is reachable from element [from] without |
212 /// crossing a deferred import. | 212 /// crossing a deferred import. |
213 /// | 213 /// |
214 /// For example, if we have two deferred libraries `A` and `B` that both | 214 /// For example, if we have two deferred libraries `A` and `B` that both |
215 /// import a library `C`, then even though elements from `A` and `C` end up in | 215 /// import a library `C`, then even though elements from `A` and `C` end up in |
216 /// different output units, there is a non-deferred path between `A` and `C`. | 216 /// different output units, there is a non-deferred path between `A` and `C`. |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 // import "lib.dart" as a; | 709 // import "lib.dart" as a; |
710 // import "lib2.dart" as a; | 710 // import "lib2.dart" as a; |
711 // We must be able to signal error for case 1, 2, 3, but accept case 4. | 711 // We must be able to signal error for case 1, 2, 3, but accept case 4. |
712 | 712 |
713 // The prefixes that have been used by any imports in this library. | 713 // The prefixes that have been used by any imports in this library. |
714 Setlet<String> usedPrefixes = new Setlet<String>(); | 714 Setlet<String> usedPrefixes = new Setlet<String>(); |
715 // The last deferred import we saw with a given prefix (if any). | 715 // The last deferred import we saw with a given prefix (if any). |
716 Map<String, ImportElement> prefixDeferredImport = | 716 Map<String, ImportElement> prefixDeferredImport = |
717 new Map<String, ImportElement>(); | 717 new Map<String, ImportElement>(); |
718 for (LibraryElement library in compiler.libraryLoader.libraries) { | 718 for (LibraryElement library in compiler.libraryLoader.libraries) { |
719 compiler.withCurrentElement(library, () { | 719 reporter.withCurrentElement(library, () { |
720 prefixDeferredImport.clear(); | 720 prefixDeferredImport.clear(); |
721 usedPrefixes.clear(); | 721 usedPrefixes.clear(); |
722 // TODO(sigurdm): Make helper getLibraryImportTags when tags is a List | 722 // TODO(sigurdm): Make helper getLibraryImportTags when tags is a List |
723 // instead of a Link. | 723 // instead of a Link. |
724 for (ImportElement import in library.imports) { | 724 for (ImportElement import in library.imports) { |
725 /// Give an error if the old annotation-based syntax has been used. | 725 /// Give an error if the old annotation-based syntax has been used. |
726 List<MetadataAnnotation> metadataList = import.metadata; | 726 List<MetadataAnnotation> metadataList = import.metadata; |
727 if (metadataList != null) { | 727 if (metadataList != null) { |
728 for (MetadataAnnotation metadata in metadataList) { | 728 for (MetadataAnnotation metadata in metadataList) { |
729 metadata.ensureResolved(compiler.resolution); | 729 metadata.ensureResolved(compiler.resolution); |
730 ConstantValue value = | 730 ConstantValue value = |
731 compiler.constants.getConstantValue(metadata.constant); | 731 compiler.constants.getConstantValue(metadata.constant); |
732 Element element = value.getType(compiler.coreTypes).element; | 732 Element element = value.getType(compiler.coreTypes).element; |
733 if (element == deferredLibraryClass) { | 733 if (element == deferredLibraryClass) { |
734 compiler.reportErrorMessage( | 734 reporter.reportErrorMessage( |
735 import, MessageKind.DEFERRED_OLD_SYNTAX); | 735 import, MessageKind.DEFERRED_OLD_SYNTAX); |
736 } | 736 } |
737 } | 737 } |
738 } | 738 } |
739 | 739 |
740 String prefix = (import.prefix != null) | 740 String prefix = (import.prefix != null) |
741 ? import.prefix.name | 741 ? import.prefix.name |
742 : null; | 742 : null; |
743 // The last import we saw with the same prefix. | 743 // The last import we saw with the same prefix. |
744 ImportElement previousDeferredImport = prefixDeferredImport[prefix]; | 744 ImportElement previousDeferredImport = prefixDeferredImport[prefix]; |
745 if (import.isDeferred) { | 745 if (import.isDeferred) { |
746 _DeferredImport key = new _DeclaredDeferredImport(import); | 746 _DeferredImport key = new _DeclaredDeferredImport(import); |
747 LibraryElement importedLibrary = import.importedLibrary; | 747 LibraryElement importedLibrary = import.importedLibrary; |
748 _allDeferredImports[key] = importedLibrary; | 748 _allDeferredImports[key] = importedLibrary; |
749 | 749 |
750 if (prefix == null) { | 750 if (prefix == null) { |
751 compiler.reportErrorMessage( | 751 reporter.reportErrorMessage( |
752 import, | 752 import, |
753 MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX); | 753 MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX); |
754 } else { | 754 } else { |
755 prefixDeferredImport[prefix] = import; | 755 prefixDeferredImport[prefix] = import; |
756 _deferredImportDescriptions[key] = | 756 _deferredImportDescriptions[key] = |
757 new ImportDescription(import, library, compiler); | 757 new ImportDescription(import, library, compiler); |
758 } | 758 } |
759 isProgramSplit = true; | 759 isProgramSplit = true; |
760 lastDeferred = import; | 760 lastDeferred = import; |
761 } | 761 } |
762 if (prefix != null) { | 762 if (prefix != null) { |
763 if (previousDeferredImport != null || | 763 if (previousDeferredImport != null || |
764 (import.isDeferred && usedPrefixes.contains(prefix))) { | 764 (import.isDeferred && usedPrefixes.contains(prefix))) { |
765 ImportElement failingImport = (previousDeferredImport != null) | 765 ImportElement failingImport = (previousDeferredImport != null) |
766 ? previousDeferredImport | 766 ? previousDeferredImport |
767 : import; | 767 : import; |
768 compiler.reportErrorMessage( | 768 reporter.reportErrorMessage( |
769 failingImport.prefix, | 769 failingImport.prefix, |
770 MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX); | 770 MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX); |
771 } | 771 } |
772 usedPrefixes.add(prefix); | 772 usedPrefixes.add(prefix); |
773 } | 773 } |
774 } | 774 } |
775 }); | 775 }); |
776 } | 776 } |
777 if (isProgramSplit) { | 777 if (isProgramSplit) { |
778 isProgramSplit = compiler.backend.enableDeferredLoadingIfSupported( | 778 isProgramSplit = compiler.backend.enableDeferredLoadingIfSupported( |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 return result; | 940 return result; |
941 } | 941 } |
942 | 942 |
943 bool operator ==(other) { | 943 bool operator ==(other) { |
944 if (other is! _DeclaredDeferredImport) return false; | 944 if (other is! _DeclaredDeferredImport) return false; |
945 return declaration == other.declaration; | 945 return declaration == other.declaration; |
946 } | 946 } |
947 | 947 |
948 int get hashCode => declaration.hashCode * 17; | 948 int get hashCode => declaration.hashCode * 17; |
949 } | 949 } |
OLD | NEW |