OLD | NEW |
1 import 'dart:io'; | 1 import 'dart:io'; |
2 | 2 |
3 import 'package:analyzer/dart/ast/ast.dart'; | |
4 import 'package:analyzer/dart/element/element.dart'; | |
5 import 'package:analyzer/src/generated/engine.dart'; | |
6 import 'package:analyzer/src/generated/java_io.dart'; | |
7 import 'package:analyzer/src/generated/sdk.dart'; | |
8 import 'package:analyzer/src/generated/sdk_io.dart'; | 3 import 'package:analyzer/src/generated/sdk_io.dart'; |
9 import 'package:analyzer/src/generated/source.dart'; | |
10 import 'package:analyzer/src/summary/flat_buffers.dart' as fb; | 4 import 'package:analyzer/src/summary/flat_buffers.dart' as fb; |
11 import 'package:analyzer/src/summary/index_unit.dart'; | 5 import 'package:analyzer/src/summary/summary_file_builder.dart'; |
12 import 'package:analyzer/src/summary/summarize_elements.dart'; | |
13 import 'package:path/path.dart'; | |
14 | 6 |
15 main(List<String> args) { | 7 main(List<String> args) { |
16 if (args.length < 1) { | 8 if (args.length < 1) { |
17 _printUsage(); | 9 _printUsage(); |
18 exitCode = 1; | 10 exitCode = 1; |
19 return; | 11 return; |
20 } | 12 } |
21 String command = args[0]; | 13 String command = args[0]; |
22 if ((command == 'multiple-outputs' || command == 'strong-outputs') && | 14 if ((command == 'multiple-outputs' || command == 'strong-outputs') && |
23 args.length >= 2 && | 15 args.length >= 2 && |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 // | 109 // |
118 if (sdkPath != null) { | 110 if (sdkPath != null) { |
119 if (!FileSystemEntity.isDirectorySync('$sdkPath/lib')) { | 111 if (!FileSystemEntity.isDirectorySync('$sdkPath/lib')) { |
120 print("'$sdkPath/lib' does not exist."); | 112 print("'$sdkPath/lib' does not exist."); |
121 _printUsage(); | 113 _printUsage(); |
122 return null; | 114 return null; |
123 } | 115 } |
124 } else { | 116 } else { |
125 sdkPath = DirectoryBasedDartSdk.defaultSdkDirectory.getAbsolutePath(); | 117 sdkPath = DirectoryBasedDartSdk.defaultSdkDirectory.getAbsolutePath(); |
126 } | 118 } |
| 119 |
127 // | 120 // |
128 // Build spec and strong outputs. | 121 // Build spec and strong outputs. |
129 // | 122 // |
130 _BuilderOutput spec = | 123 BuilderOutput spec = includeSpec ? _buildOutput(sdkPath, false) : null; |
131 includeSpec ? new _Builder(sdkPath, false).build() : null; | 124 BuilderOutput strong = _buildOutput(sdkPath, true); |
132 _BuilderOutput strong = new _Builder(sdkPath, true).build(); | |
133 return new _Output(spec, strong); | 125 return new _Output(spec, strong); |
134 } | 126 } |
135 | 127 |
| 128 BuilderOutput _buildOutput(String sdkPath, bool strongMode) { |
| 129 String modeName = strongMode ? 'strong' : 'spec'; |
| 130 print('Generating $modeName mode summary and index.'); |
| 131 Stopwatch sw = new Stopwatch()..start(); |
| 132 BuilderOutput output = new SummaryBuilder.forSdk(sdkPath, strongMode).build(); |
| 133 print('\tDone in ${sw.elapsedMilliseconds} ms.'); |
| 134 return output; |
| 135 } |
| 136 |
136 /** | 137 /** |
137 * Open the flat buffer in [inputPath] and extract the byte array in the [field] | 138 * Open the flat buffer in [inputPath] and extract the byte array in the [field] |
138 * into the [outputPath] file. | 139 * into the [outputPath] file. |
139 */ | 140 */ |
140 void _extractSingleOutput(String inputPath, int field, String outputPath) { | 141 void _extractSingleOutput(String inputPath, int field, String outputPath) { |
141 List<int> bytes = new File(inputPath).readAsBytesSync(); | 142 List<int> bytes = new File(inputPath).readAsBytesSync(); |
142 fb.BufferContext root = new fb.BufferContext.fromBytes(bytes); | 143 fb.BufferContext root = new fb.BufferContext.fromBytes(bytes); |
143 int tableOffset = root.derefObject(0); | 144 int tableOffset = root.derefObject(0); |
144 List<int> fieldBytes = | 145 List<int> fieldBytes = |
145 const fb.Uint8ListReader().vTableGet(root, tableOffset, field); | 146 const fb.Uint8ListReader().vTableGet(root, tableOffset, field); |
(...skipping 16 matching lines...) Expand all Loading... |
162 print(' extract-spec-sum input_file output_file'); | 163 print(' extract-spec-sum input_file output_file'); |
163 print(' Extract the spec-mode summary file.'); | 164 print(' Extract the spec-mode summary file.'); |
164 print(' extract-strong-sum input_file output_file'); | 165 print(' extract-strong-sum input_file output_file'); |
165 print(' Extract the strong-mode summary file.'); | 166 print(' Extract the strong-mode summary file.'); |
166 print(' extract-spec-index input_file output_file'); | 167 print(' extract-spec-index input_file output_file'); |
167 print(' Extract the spec-mode index file.'); | 168 print(' Extract the spec-mode index file.'); |
168 print(' extract-strong-index input_file output_file'); | 169 print(' extract-strong-index input_file output_file'); |
169 print(' Extract the strong-mode index file.'); | 170 print(' Extract the strong-mode index file.'); |
170 } | 171 } |
171 | 172 |
172 class _Builder { | |
173 final String sdkPath; | |
174 final bool strongMode; | |
175 | |
176 AnalysisContext context; | |
177 final Set<Source> processedSources = new Set<Source>(); | |
178 | |
179 final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler(); | |
180 final PackageIndexAssembler indexAssembler = new PackageIndexAssembler(); | |
181 | |
182 _Builder(this.sdkPath, this.strongMode); | |
183 | |
184 /** | |
185 * Build a strong or spec mode summary for the Dart SDK at [sdkPath]. | |
186 */ | |
187 _BuilderOutput build() { | |
188 String modeName = strongMode ? 'strong' : 'spec'; | |
189 print('Generating $modeName mode summary and index.'); | |
190 Stopwatch sw = new Stopwatch()..start(); | |
191 // | |
192 // Prepare SDK. | |
193 // | |
194 DirectoryBasedDartSdk sdk = | |
195 new DirectoryBasedDartSdk(new JavaFile(sdkPath), strongMode); | |
196 sdk.useSummary = false; | |
197 sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = strongMode; | |
198 context = sdk.context; | |
199 // | |
200 // Prepare 'dart:' URIs to serialize. | |
201 // | |
202 Set<String> uriSet = | |
203 sdk.sdkLibraries.map((SdkLibrary library) => library.shortName).toSet(); | |
204 if (!strongMode) { | |
205 uriSet.add('dart:html/nativewrappers.dart'); | |
206 } | |
207 uriSet.add('dart:html_common/html_common_dart2js.dart'); | |
208 // | |
209 // Serialize each SDK library. | |
210 // | |
211 for (String uri in uriSet) { | |
212 Source libSource = sdk.mapDartUri(uri); | |
213 _serializeLibrary(libSource); | |
214 } | |
215 // | |
216 // Assemble the output. | |
217 // | |
218 List<int> sumBytes = bundleAssembler.assemble().toBuffer(); | |
219 List<int> indexBytes = indexAssembler.assemble().toBuffer(); | |
220 print('\tDone in ${sw.elapsedMilliseconds} ms.'); | |
221 return new _BuilderOutput(sumBytes, indexBytes); | |
222 } | |
223 | |
224 /** | |
225 * Serialize the library with the given [source] and all its direct or | |
226 * indirect imports and exports. | |
227 */ | |
228 void _serializeLibrary(Source source) { | |
229 if (!processedSources.add(source)) { | |
230 return; | |
231 } | |
232 LibraryElement element = context.computeLibraryElement(source); | |
233 bundleAssembler.serializeLibraryElement(element); | |
234 element.importedLibraries.forEach((e) => _serializeLibrary(e.source)); | |
235 element.exportedLibraries.forEach((e) => _serializeLibrary(e.source)); | |
236 // Index every unit of the library. | |
237 for (CompilationUnitElement unitElement in element.units) { | |
238 Source unitSource = unitElement.source; | |
239 CompilationUnit unit = | |
240 context.resolveCompilationUnit2(unitSource, source); | |
241 indexAssembler.indexUnit(unit); | |
242 } | |
243 } | |
244 } | |
245 | |
246 class _BuilderOutput { | |
247 final List<int> sum; | |
248 final List<int> index; | |
249 | |
250 _BuilderOutput(this.sum, this.index); | |
251 | |
252 void writeMultiple(String outputDirectoryPath, String modeName) { | |
253 // Write summary. | |
254 { | |
255 String outputPath = join(outputDirectoryPath, '$modeName.sum'); | |
256 File file = new File(outputPath); | |
257 file.writeAsBytesSync(sum, mode: FileMode.WRITE_ONLY); | |
258 } | |
259 // Write index. | |
260 { | |
261 String outputPath = join(outputDirectoryPath, '$modeName.index'); | |
262 File file = new File(outputPath); | |
263 file.writeAsBytesSync(index, mode: FileMode.WRITE_ONLY); | |
264 } | |
265 } | |
266 } | |
267 | |
268 class _Output { | 173 class _Output { |
269 final _BuilderOutput spec; | 174 final BuilderOutput spec; |
270 final _BuilderOutput strong; | 175 final BuilderOutput strong; |
271 | 176 |
272 _Output(this.spec, this.strong); | 177 _Output(this.spec, this.strong); |
273 } | 178 } |
OLD | NEW |