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 part of dart_backend; | 5 part of dart_backend; |
6 | 6 |
7 typedef bool IsSafeToRemoveTypeDeclarations( | 7 typedef bool IsSafeToRemoveTypeDeclarations( |
8 Map<ClassElement, Iterable<Element>> classMembers); | 8 Map<ClassElement, Iterable<Element>> classMembers); |
9 typedef void ElementCallback<E>(E element); | 9 typedef void ElementCallback<E>(E element); |
10 typedef void ElementPostProcessFunction( | 10 typedef void ElementPostProcessFunction( |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 /// referenced in the program. | 48 /// referenced in the program. |
49 /// | 49 /// |
50 /// [instantiatedClasses] is the set of classes that are potentially | 50 /// [instantiatedClasses] is the set of classes that are potentially |
51 /// instantiated in the program. | 51 /// instantiated in the program. |
52 /// | 52 /// |
53 /// [resolvedElements] is the set of methods, constructors, and fields that | 53 /// [resolvedElements] is the set of methods, constructors, and fields that |
54 /// are potentially accessed/called in the program. | 54 /// are potentially accessed/called in the program. |
55 /// | 55 /// |
56 /// The [sortElements] function is used to sort [instantiatedClasses] and | 56 /// The [sortElements] function is used to sort [instantiatedClasses] and |
57 /// [resolvedElements] in the generated output. | 57 /// [resolvedElements] in the generated output. |
58 String assembleProgram({ | 58 /// |
| 59 /// Returns the total size of the generated code. |
| 60 int assembleProgram({ |
59 MirrorRenamer mirrorRenamer: const MirrorRenamer(), | 61 MirrorRenamer mirrorRenamer: const MirrorRenamer(), |
60 Iterable<LibraryElement> libraries, | 62 Iterable<LibraryElement> libraries, |
61 Iterable<Element> instantiatedClasses, | 63 Iterable<Element> instantiatedClasses, |
62 Iterable<Element> resolvedElements, | 64 Iterable<Element> resolvedElements, |
63 Iterable<ClassElement> usedTypeLiterals: const <ClassElement>[], | 65 Iterable<ClassElement> usedTypeLiterals: const <ClassElement>[], |
64 FunctionElement mainFunction, | 66 FunctionElement mainFunction, |
65 Uri outputUri, | 67 Uri outputUri, |
66 ElementPostProcessFunction postProcessElementAst, | 68 ElementPostProcessFunction postProcessElementAst, |
67 ComputeElementAstFunction computeElementAst, | 69 ComputeElementAstFunction computeElementAst, |
68 ElementFilter shouldOutput, | 70 ElementFilter shouldOutput, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 elementInfo); | 115 elementInfo); |
114 | 116 |
115 renamer = createRenamer( | 117 renamer = createRenamer( |
116 collector, | 118 collector, |
117 libraryInfo, | 119 libraryInfo, |
118 elementInfo, | 120 elementInfo, |
119 enableMinification: enableMinification, | 121 enableMinification: enableMinification, |
120 forceStripTypes: forceStripTypes, | 122 forceStripTypes: forceStripTypes, |
121 isSafeToRemoveTypeDeclarations: isSafeToRemoveTypeDeclarations); | 123 isSafeToRemoveTypeDeclarations: isSafeToRemoveTypeDeclarations); |
122 | 124 |
123 String assembledCode; | |
124 if (outputAst) { | 125 if (outputAst) { |
125 assembledCode = astOutput(listener, elementInfo); | 126 String code = astOutput(listener, elementInfo); |
| 127 outputProvider("", "dart") |
| 128 ..add(code) |
| 129 ..close(); |
| 130 return code.length; |
126 } else { | 131 } else { |
127 output = new MainOutputGenerator(); | 132 output = new MainOutputGenerator(); |
128 assembledCode = output.generateCode( | 133 return output.generateCode( |
129 libraryInfo, | 134 libraryInfo, |
130 elementInfo, | 135 elementInfo, |
131 collector, | 136 collector, |
132 renamer, | 137 renamer, |
133 mainFunction, | 138 mainFunction, |
134 outputUri, | 139 outputUri, |
135 outputProvider, | 140 outputProvider, |
136 mirrorRenamer, | 141 mirrorRenamer, |
137 multiFile: multiFile, | 142 multiFile: multiFile, |
138 forceStripTypes: forceStripTypes, | 143 forceStripTypes: forceStripTypes, |
139 enableMinification: enableMinification); | 144 enableMinification: enableMinification); |
140 } | 145 } |
141 return assembledCode; | |
142 } | 146 } |
143 | 147 |
144 static PlaceholderCollector collectPlaceholders( | 148 static PlaceholderCollector collectPlaceholders( |
145 DiagnosticListener listener, | 149 DiagnosticListener listener, |
146 MirrorRenamer mirrorRenamer, | 150 MirrorRenamer mirrorRenamer, |
147 FunctionElement mainFunction, | 151 FunctionElement mainFunction, |
148 LibraryInfo libraryInfo, | 152 LibraryInfo libraryInfo, |
149 ElementInfo elementInfo) { | 153 ElementInfo elementInfo) { |
150 // Create all necessary placeholders. | 154 // Create all necessary placeholders. |
151 PlaceholderCollector collector = new PlaceholderCollector( | 155 PlaceholderCollector collector = new PlaceholderCollector( |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 } | 428 } |
425 } | 429 } |
426 | 430 |
427 /// Main output generator for [DartOutputter] that emits dart code through a | 431 /// Main output generator for [DartOutputter] that emits dart code through a |
428 /// [CompilerOutputProvider]. | 432 /// [CompilerOutputProvider]. |
429 class MainOutputGenerator { | 433 class MainOutputGenerator { |
430 final Map<ClassNode, List<Node>> memberNodes = | 434 final Map<ClassNode, List<Node>> memberNodes = |
431 new Map<ClassNode, List<Node>>(); | 435 new Map<ClassNode, List<Node>>(); |
432 final List<Node> topLevelNodes = <Node>[]; | 436 final List<Node> topLevelNodes = <Node>[]; |
433 | 437 |
434 String generateCode( | 438 /// Generates the code and returns the total size. |
| 439 int generateCode( |
435 LibraryInfo libraryInfo, | 440 LibraryInfo libraryInfo, |
436 ElementInfo elementInfo, | 441 ElementInfo elementInfo, |
437 PlaceholderCollector collector, | 442 PlaceholderCollector collector, |
438 PlaceholderRenamer placeholderRenamer, | 443 PlaceholderRenamer placeholderRenamer, |
439 FunctionElement mainFunction, | 444 FunctionElement mainFunction, |
440 Uri outputUri, | 445 Uri outputUri, |
441 CompilerOutputProvider outputProvider, | 446 CompilerOutputProvider outputProvider, |
442 MirrorRenamer mirrorRenamer, | 447 MirrorRenamer mirrorRenamer, |
443 {bool multiFile: false, | 448 {bool multiFile: false, |
444 bool forceStripTypes: false, | 449 bool forceStripTypes: false, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 if (node is ClassNode) { | 537 if (node is ClassNode) { |
533 // TODO(smok): Filter out default constructors here. | 538 // TODO(smok): Filter out default constructors here. |
534 unparser.unparseClassWithBody(node, memberNodes[node]); | 539 unparser.unparseClassWithBody(node, memberNodes[node]); |
535 } else { | 540 } else { |
536 unparser.unparse(node); | 541 unparser.unparse(node); |
537 } | 542 } |
538 unparser.newline(); | 543 unparser.newline(); |
539 } | 544 } |
540 | 545 |
541 int totalSize = 0; | 546 int totalSize = 0; |
542 String assembledCode; | |
543 if (multiFile) { | 547 if (multiFile) { |
544 for(LibraryElement outputLibrary in libraryInfo.userLibraries) { | 548 for(LibraryElement outputLibrary in libraryInfo.userLibraries) { |
545 // TODO(sigurdm): Make the unparser output directly into the buffer | 549 // TODO(sigurdm): Make the unparser output directly into the buffer |
546 // instead of caching in `.result`. | 550 // instead of caching in `.result`. |
547 String code = unparsers[outputLibrary].result; | 551 String code = unparsers[outputLibrary].result; |
548 totalSize += code.length; | 552 totalSize += code.length; |
549 outputProvider(outputPaths[outputLibrary], "dart") | 553 outputProvider(outputPaths[outputLibrary], "dart") |
550 ..add(code) | 554 ..add(code) |
551 ..close(); | 555 ..close(); |
552 } | 556 } |
553 // TODO(sigurdm): We should get rid of compiler.assembledCode. | |
554 assembledCode = unparsers[mainFunction.library].result; | |
555 } else { | 557 } else { |
556 assembledCode = mainUnparser.result; | 558 String code = mainUnparser.result; |
557 outputProvider("", "dart") | 559 outputProvider("", "dart") |
558 ..add(assembledCode) | 560 ..add(code) |
559 ..close(); | 561 ..close(); |
560 | 562 |
561 totalSize = assembledCode.length; | 563 totalSize = code.length; |
562 } | 564 } |
563 | 565 |
564 return assembledCode; | 566 return totalSize; |
565 } | 567 } |
566 } | 568 } |
OLD | NEW |