OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 /// Transfomer that combines multiple dart script tags into a single one. | 5 /// Transfomer that combines multiple dart script tags into a single one. |
6 library polymer.src.build.script_compactor; | 6 library polymer.src.build.script_compactor; |
7 | 7 |
8 import 'dart:async'; | 8 import 'dart:async'; |
9 import 'dart:convert'; | 9 import 'dart:convert'; |
10 | 10 |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 new _HtmlExtractor(logger, generator, publishedAttributes, | 242 new _HtmlExtractor(logger, generator, publishedAttributes, |
243 expressionVisitor).visit(document); | 243 expressionVisitor).visit(document); |
244 | 244 |
245 // Create a recorder that uses analyzer data to feed data to [generator]. | 245 // Create a recorder that uses analyzer data to feed data to [generator]. |
246 var recorder = new Recorder(generator, | 246 var recorder = new Recorder(generator, |
247 (lib) => resolver.getImportUri(lib, from: bootstrapId).toString()); | 247 (lib) => resolver.getImportUri(lib, from: bootstrapId).toString()); |
248 | 248 |
249 // Process all classes and top-level functions to include initializers, | 249 // Process all classes and top-level functions to include initializers, |
250 // register custom elements, and include special fields and methods in | 250 // register custom elements, and include special fields and methods in |
251 // custom element classes. | 251 // custom element classes. |
| 252 var functionsSeen = new Set<FunctionElement>(); |
| 253 var classesSeen = new Set<ClassElement>(); |
252 for (var id in entryLibraries) { | 254 for (var id in entryLibraries) { |
253 var lib = resolver.getLibrary(id); | 255 var lib = resolver.getLibrary(id); |
254 for (var fun in _visibleTopLevelMethodsOf(lib)) { | 256 for (var fun in _visibleTopLevelMethodsOf(lib)) { |
| 257 if (functionsSeen.contains(fun)) continue; |
| 258 functionsSeen.add(fun); |
255 _processFunction(fun, id); | 259 _processFunction(fun, id); |
256 } | 260 } |
257 | 261 |
258 for (var cls in _visibleClassesOf(lib)) { | 262 for (var cls in _visibleClassesOf(lib)) { |
| 263 if (classesSeen.contains(cls)) continue; |
| 264 classesSeen.add(cls); |
259 _processClass(cls, id, recorder); | 265 _processClass(cls, id, recorder); |
260 } | 266 } |
261 } | 267 } |
262 } | 268 } |
263 | 269 |
264 /// Process a class ([cls]). If it contains an appropriate [CustomTag] | 270 /// Process a class ([cls]). If it contains an appropriate [CustomTag] |
265 /// annotation, we include an initializer to register this class, and make | 271 /// annotation, we include an initializer to register this class, and make |
266 /// sure to include everything that might be accessed or queried from them | 272 /// sure to include everything that might be accessed or queried from them |
267 /// using the smoke package. In particular, polymer uses smoke for the | 273 /// using the smoke package. In particular, polymer uses smoke for the |
268 /// following: | 274 /// following: |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 } | 823 } |
818 return result; | 824 return result; |
819 } | 825 } |
820 | 826 |
821 /// Retrieves all top-level methods that are visible if you were to import | 827 /// Retrieves all top-level methods that are visible if you were to import |
822 /// [lib]. This includes exported methods from other libraries too. | 828 /// [lib]. This includes exported methods from other libraries too. |
823 List<FunctionElement> _visibleTopLevelMethodsOf(LibraryElement lib) { | 829 List<FunctionElement> _visibleTopLevelMethodsOf(LibraryElement lib) { |
824 var result = []; | 830 var result = []; |
825 result.addAll(lib.units.expand((u) => u.functions)); | 831 result.addAll(lib.units.expand((u) => u.functions)); |
826 for (var e in lib.exports) { | 832 for (var e in lib.exports) { |
827 var exported = e.exportedLibrary.units | 833 var exported = e.exportedLibrary.units.expand((u) => u.functions).toList(); |
828 .expand((u) => u.functions).toList(); | |
829 _filter(exported, e.combinators); | 834 _filter(exported, e.combinators); |
830 result.addAll(exported); | 835 result.addAll(exported); |
831 } | 836 } |
832 return result; | 837 return result; |
833 } | 838 } |
834 | 839 |
835 /// Filters [elements] that come from an export, according to its show/hide | 840 /// Filters [elements] that come from an export, according to its show/hide |
836 /// combinators. This modifies [elements] in place. | 841 /// combinators. This modifies [elements] in place. |
837 void _filter(List<analyzer.Element> elements, | 842 void _filter(List<analyzer.Element> elements, |
838 List<NamespaceCombinator> combinators) { | 843 List<NamespaceCombinator> combinators) { |
839 for (var c in combinators) { | 844 for (var c in combinators) { |
840 if (c is ShowElementCombinator) { | 845 if (c is ShowElementCombinator) { |
841 var show = c.shownNames.toSet(); | 846 var show = c.shownNames.toSet(); |
842 elements.retainWhere((e) => show.contains(e.displayName)); | 847 elements.retainWhere((e) => show.contains(e.displayName)); |
843 } else if (c is HideElementCombinator) { | 848 } else if (c is HideElementCombinator) { |
844 var hide = c.hiddenNames.toSet(); | 849 var hide = c.hiddenNames.toSet(); |
845 elements.removeWhere((e) => hide.contains(e.displayName)); | 850 elements.removeWhere((e) => hide.contains(e.displayName)); |
846 } | 851 } |
847 } | 852 } |
848 } | 853 } |
OLD | NEW |