Chromium Code Reviews| Index: pkg/compiler/lib/src/js_emitter/program_builder/registry.dart |
| diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart b/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart |
| index 6c860d9b0e1f2ce0cc7b650232c9f50adcf63a12..b13895566f34fee926454c2cac1ed5244821fe52 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart |
| @@ -4,20 +4,25 @@ |
| part of dart2js.js_emitter.program_builder; |
| -/// Maps [LibraryElement]s to their [Element]s. |
| +class LibraryMapping { |
|
Siggi Cherem (dart-lang)
2017/04/27 21:24:18
nit: rename? (because "mapping" below is used to r
Johnni Winther
2017/04/28 07:48:57
LibraryContents it is.
|
| + final List<ClassEntity> classes = <ClassEntity>[]; |
| + final List<MemberEntity> members = <MemberEntity>[]; |
| +} |
| + |
| +/// Maps [LibraryEntity]s to their [ClassEntity]s and [MemberEntity]s. |
| /// |
| /// Fundamentally, this class nicely encapsulates a |
| -/// `Map<LibraryElement, List<Element>>`. |
| +/// `Map<LibraryElement, Pair<List<ClassElement>, List<MemberElement>>>`. |
| /// |
| /// There exists exactly one instance per [OutputUnit]. |
| class LibrariesMap { |
| - final Map<LibraryElement, List<Element>> _mapping = |
| - <LibraryElement, List<Element>>{}; |
| + final Map<LibraryEntity, LibraryMapping> _mapping = |
| + <LibraryEntity, LibraryMapping>{}; |
| // It is very common to access the same library multiple times in a row, so |
| // we cache the last access. |
| - LibraryElement _lastLibrary; |
| - List<Element> _lastElements; |
| + LibraryEntity _lastLibrary; |
| + LibraryMapping _lastMapping; |
| /// A unique name representing this instance. |
| final String name; |
| @@ -29,18 +34,30 @@ class LibrariesMap { |
| assert(name != ""); |
| } |
| - void add(LibraryElement library, Element element) { |
| + LibraryMapping _getMapping(LibraryEntity library) { |
| if (_lastLibrary != library) { |
| _lastLibrary = library; |
| - _lastElements = _mapping.putIfAbsent(library, () => <Element>[]); |
| + _lastMapping = _mapping.putIfAbsent(library, () => new LibraryMapping()); |
| } |
| - _lastElements.add(element); |
| + return _lastMapping; |
| + } |
| + |
| + void addClass(LibraryEntity library, ClassEntity element) { |
| + _getMapping(library).classes.add(element); |
| + } |
| + |
| + void addMember(LibraryEntity library, MemberEntity element) { |
| + _getMapping(library).members.add(element); |
| } |
| int get length => _mapping.length; |
| - void forEach(void f(LibraryElement library, List<Element> elements)) { |
| - _mapping.forEach(f); |
| + void forEach( |
| + void f(LibraryEntity library, List<ClassEntity> classes, |
| + List<MemberEntity> members)) { |
| + _mapping.forEach((LibraryEntity library, LibraryMapping mapping) { |
| + f(library, mapping.classes, mapping.members); |
| + }); |
| } |
| } |
| @@ -52,6 +69,7 @@ class LibrariesMap { |
| /// Registered holders are assigned a name. |
| class Registry { |
| final DeferredLoadTask _deferredLoadTask; |
| + final Sorter _sorter; |
| final Map<String, Holder> _holdersMap = <String, Holder>{}; |
| final Map<OutputUnit, LibrariesMap> _deferredLibrariesMap = |
| <OutputUnit, LibrariesMap>{}; |
| @@ -69,7 +87,7 @@ class Registry { |
| LibrariesMap mainLibrariesMap; |
| - Registry(this._deferredLoadTask); |
| + Registry(this._deferredLoadTask, this._sorter); |
| OutputUnit get _mainOutputUnit => _deferredLoadTask.mainOutputUnit; |
| @@ -101,10 +119,19 @@ class Registry { |
| /// Adds all elements to their respective libraries in the correct |
| /// libraries map. |
| - void registerElements(OutputUnit outputUnit, Iterable<Element> elements) { |
| + void registerClasses(OutputUnit outputUnit, Iterable<ClassEntity> elements) { |
| + LibrariesMap targetLibrariesMap = _mapUnitToLibrariesMap(outputUnit); |
| + for (ClassEntity element in _sorter.sortClasses(elements)) { |
| + targetLibrariesMap.addClass(element.library, element); |
| + } |
| + } |
| + |
| + /// Adds all elements to their respective libraries in the correct |
| + /// libraries map. |
| + void registerMembers(OutputUnit outputUnit, Iterable<MemberEntity> elements) { |
| LibrariesMap targetLibrariesMap = _mapUnitToLibrariesMap(outputUnit); |
| - for (Element element in Elements.sortedByPosition(elements)) { |
| - targetLibrariesMap.add(element.library, element); |
| + for (MemberEntity element in _sorter.sortMembers(elements)) { |
| + targetLibrariesMap.addMember(element.library, element); |
| } |
| } |