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 library dump_info; | 5 library dump_info; |
6 | 6 |
7 import 'dart:convert' show | 7 import 'dart:convert' show |
8 HtmlEscape, | 8 HtmlEscape, |
9 JsonEncoder, | 9 JsonEncoder, |
10 StringConversionSink, | 10 StringConversionSink, |
(...skipping 13 matching lines...) Expand all Loading... |
24 import 'js/js.dart' as jsAst; | 24 import 'js/js.dart' as jsAst; |
25 import 'universe/universe.dart' show Selector; | 25 import 'universe/universe.dart' show Selector; |
26 import 'util/util.dart' show NO_LOCATION_SPANNABLE; | 26 import 'util/util.dart' show NO_LOCATION_SPANNABLE; |
27 | 27 |
28 /// Maps objects to an id. Supports lookups in | 28 /// Maps objects to an id. Supports lookups in |
29 /// both directions. | 29 /// both directions. |
30 class IdMapper<T>{ | 30 class IdMapper<T>{ |
31 Map<int, T> _idToElement = {}; | 31 Map<int, T> _idToElement = {}; |
32 Map<T, int> _elementToId = {}; | 32 Map<T, int> _elementToId = {}; |
33 int _idCounter = 0; | 33 int _idCounter = 0; |
34 String name; | 34 final String name; |
35 | 35 |
36 IdMapper(this.name); | 36 IdMapper(this.name); |
37 | 37 |
38 Iterable<T> get elements => _elementToId.keys; | 38 Iterable<T> get elements => _elementToId.keys; |
39 | 39 |
40 String add(T e) { | 40 String add(T e) { |
41 if (_elementToId.containsKey(e)) { | 41 if (_elementToId.containsKey(e)) { |
42 return name + "/${_elementToId[e]}"; | 42 return name + "/${_elementToId[e]}"; |
43 } | 43 } |
44 | 44 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 89 |
90 String dart2jsVersion; | 90 String dart2jsVersion; |
91 | 91 |
92 ElementToJsonVisitor(this.compiler); | 92 ElementToJsonVisitor(this.compiler); |
93 | 93 |
94 void run() { | 94 void run() { |
95 Backend backend = compiler.backend; | 95 Backend backend = compiler.backend; |
96 | 96 |
97 dart2jsVersion = compiler.hasBuildId ? compiler.buildId : null; | 97 dart2jsVersion = compiler.hasBuildId ? compiler.buildId : null; |
98 | 98 |
99 for (var library in compiler.libraryLoader.libraries.toList()) { | 99 for (LibraryElement library in compiler.libraryLoader.libraries.toList()) { |
100 visit(library); | 100 visit(library); |
101 } | 101 } |
102 } | 102 } |
103 | 103 |
104 Map<String, dynamic> visit(Element e, [_]) => e.accept(this, null); | 104 Map<String, dynamic> visit(Element e, [_]) => e.accept(this, null); |
105 | 105 |
106 // If keeping the element is in question (like if a function has a size | 106 // If keeping the element is in question (like if a function has a size |
107 // of zero), only keep it if it holds dependencies to elsewhere. | 107 // of zero), only keep it if it holds dependencies to elsewhere. |
108 bool shouldKeep(Element element) { | 108 bool shouldKeep(Element element) { |
109 return compiler.dumpInfoTask.selectorsFromElement.containsKey(element) | 109 return compiler.dumpInfoTask.selectorsFromElement.containsKey(element) |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 | 158 |
159 if (children.length == 0 && !shouldKeep(element)) { | 159 if (children.length == 0 && !shouldKeep(element)) { |
160 return null; | 160 return null; |
161 } | 161 } |
162 | 162 |
163 return { | 163 return { |
164 'kind': 'library', | 164 'kind': 'library', |
165 'name': libname, | 165 'name': libname, |
166 'size': size, | 166 'size': size, |
167 'id': id, | 167 'id': id, |
168 'children': children | 168 'children': children, |
| 169 'canonicalUri': element.canonicalUri.toString() |
169 }; | 170 }; |
170 } | 171 } |
171 | 172 |
172 Map<String, dynamic> visitTypedefElement(TypedefElement element, _) { | 173 Map<String, dynamic> visitTypedefElement(TypedefElement element, _) { |
173 String id = mapper._typedef.add(element); | 174 String id = mapper._typedef.add(element); |
174 return element.alias == null | 175 return element.alias == null |
175 ? null | 176 ? null |
176 : { | 177 : { |
177 'id': id, | 178 'id': id, |
178 'type': element.alias.toString(), | 179 'type': element.alias.toString(), |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 class Selection { | 393 class Selection { |
393 final Element selectedElement; | 394 final Element selectedElement; |
394 final Selector selector; | 395 final Selector selector; |
395 Selection(this.selectedElement, this.selector); | 396 Selection(this.selectedElement, this.selector); |
396 } | 397 } |
397 | 398 |
398 class DumpInfoTask extends CompilerTask { | 399 class DumpInfoTask extends CompilerTask { |
399 DumpInfoTask(Compiler compiler) | 400 DumpInfoTask(Compiler compiler) |
400 : super(compiler); | 401 : super(compiler); |
401 | 402 |
402 String name = "Dump Info"; | 403 String get name => "Dump Info"; |
403 | 404 |
404 ElementToJsonVisitor infoCollector; | 405 ElementToJsonVisitor infoCollector; |
405 | 406 |
406 /// The size of the generated output. | 407 /// The size of the generated output. |
407 int _programSize; | 408 int _programSize; |
408 | 409 |
409 // A set of javascript AST nodes that we care about the size of. | 410 // A set of javascript AST nodes that we care about the size of. |
410 // This set is automatically populated when registerElementAst() | 411 // This set is automatically populated when registerElementAst() |
411 // is called. | 412 // is called. |
412 final Set<jsAst.Node> _tracking = new Set<jsAst.Node>(); | 413 final Set<jsAst.Node> _tracking = new Set<jsAst.Node>(); |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 } | 618 } |
618 | 619 |
619 Map<String, dynamic> outJson = { | 620 Map<String, dynamic> outJson = { |
620 'elements': infoCollector.toJson(), | 621 'elements': infoCollector.toJson(), |
621 'holding': holding, | 622 'holding': holding, |
622 'outputUnits': outputUnits, | 623 'outputUnits': outputUnits, |
623 'dump_version': 3, | 624 'dump_version': 3, |
624 'deferredFiles': compiler.deferredLoadTask.computeDeferredMap(), | 625 'deferredFiles': compiler.deferredLoadTask.computeDeferredMap(), |
625 // This increases when new information is added to the map, but the viewer | 626 // This increases when new information is added to the map, but the viewer |
626 // still is compatible. | 627 // still is compatible. |
627 'dump_minor_version': '1' | 628 'dump_minor_version': '2' |
628 }; | 629 }; |
629 | 630 |
630 Duration toJsonDuration = new DateTime.now().difference(startToJsonTime); | 631 Duration toJsonDuration = new DateTime.now().difference(startToJsonTime); |
631 | 632 |
632 Map<String, dynamic> generalProgramInfo = <String, dynamic> { | 633 Map<String, dynamic> generalProgramInfo = <String, dynamic> { |
633 'size': _programSize, | 634 'size': _programSize, |
634 'dart2jsVersion': infoCollector.dart2jsVersion, | 635 'dart2jsVersion': infoCollector.dart2jsVersion, |
635 'compilationMoment': new DateTime.now().toString(), | 636 'compilationMoment': new DateTime.now().toString(), |
636 'compilationDuration': compiler.totalCompileTime.elapsed.toString(), | 637 'compilationDuration': compiler.totalCompileTime.elapsed.toString(), |
637 'toJsonDuration': 0, | 638 'toJsonDuration': 0, |
638 'dumpInfoDuration': this.timing.toString(), | 639 'dumpInfoDuration': this.timing.toString(), |
639 'noSuchMethodEnabled': backend.enabledNoSuchMethod | 640 'noSuchMethodEnabled': backend.enabledNoSuchMethod, |
| 641 'minified': compiler.enableMinification |
640 }; | 642 }; |
641 | 643 |
642 outJson['program'] = generalProgramInfo; | 644 outJson['program'] = generalProgramInfo; |
643 | 645 |
644 ChunkedConversionSink<Object> sink = | 646 ChunkedConversionSink<Object> sink = |
645 encoder.startChunkedConversion( | 647 encoder.startChunkedConversion( |
646 new StringConversionSink.fromStringSink(buffer)); | 648 new StringConversionSink.fromStringSink(buffer)); |
647 sink.add(outJson); | 649 sink.add(outJson); |
648 compiler.reportInfo(NO_LOCATION_SPANNABLE, | 650 compiler.reportInfo(NO_LOCATION_SPANNABLE, |
649 const MessageKind( | 651 const MessageKind( |
650 "View the dumped .info.json file at " | 652 "View the dumped .info.json file at " |
651 "https://dart-lang.github.io/dump-info-visualizer")); | 653 "https://dart-lang.github.io/dump-info-visualizer")); |
652 } | 654 } |
653 } | 655 } |
OLD | NEW |