Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: pkg/dev_compiler/web/web_command.dart

Issue 2757753002: Migrate DDC to the new analysis driver.
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 @JS() 4 @JS()
5 library dev_compiler.web.web_command; 5 library dev_compiler.web.web_command;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:convert'; 8 import 'dart:convert';
9 import 'dart:html' show HttpRequest; 9 import 'dart:html' show HttpRequest;
10 10
11 import 'package:analyzer/dart/element/element.dart' 11 import 'package:analyzer/dart/element/element.dart'
12 show 12 show
13 LibraryElement, 13 LibraryElement,
14 ImportElement, 14 ImportElement,
15 ShowElementCombinator, 15 ShowElementCombinator,
16 HideElementCombinator; 16 HideElementCombinator;
17 import 'package:analyzer/file_system/file_system.dart' show ResourceUriResolver; 17 import 'package:analyzer/file_system/file_system.dart' show ResourceUriResolver;
18 import 'package:analyzer/file_system/memory_file_system.dart' 18 import 'package:analyzer/file_system/memory_file_system.dart'
19 show MemoryResourceProvider; 19 show MemoryResourceProvider;
20 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl;
21 import 'package:analyzer/src/summary/idl.dart' show PackageBundle; 20 import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
22 import 'package:analyzer/src/summary/package_bundle_reader.dart' 21 import 'package:analyzer/src/summary/package_bundle_reader.dart'
23 show SummaryDataStore, InSummaryUriResolver, InSummarySource; 22 show SummaryDataStore, InSummaryUriResolver, InSummarySource;
24 import 'package:analyzer/src/dart/resolver/scope.dart' show Scope; 23 import 'package:analyzer/src/dart/resolver/scope.dart' show Scope;
25 24
26 import 'package:args/command_runner.dart'; 25 import 'package:args/command_runner.dart';
27 26
28 import 'package:dev_compiler/src/analyzer/context.dart' show AnalyzerOptions; 27 import 'package:dev_compiler/src/analyzer/context.dart' show AnalyzerOptions;
29 import 'package:dev_compiler/src/compiler/compiler.dart' 28 import 'package:dev_compiler/src/compiler/compiler.dart'
30 show BuildUnit, CompilerOptions, JSModuleFile, ModuleCompiler; 29 show BuildUnit, CompilerOptions, JSModuleFile, ModuleCompiler;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 new InSummaryUriResolver(resourceProvider, summaryDataStore); 113 new InSummaryUriResolver(resourceProvider, summaryDataStore);
115 114
116 var fileResolvers = [summaryResolver, resourceUriResolver]; 115 var fileResolvers = [summaryResolver, resourceUriResolver];
117 116
118 var compiler = new ModuleCompiler(options, 117 var compiler = new ModuleCompiler(options,
119 analysisRoot: '/web-compile-root', 118 analysisRoot: '/web-compile-root',
120 fileResolvers: fileResolvers, 119 fileResolvers: fileResolvers,
121 resourceProvider: resourceProvider, 120 resourceProvider: resourceProvider,
122 summaryData: summaryDataStore); 121 summaryData: summaryDataStore);
123 122
124 var context = compiler.context as AnalysisContextImpl;
125
126 var compilerOptions = new CompilerOptions.fromArguments(argResults); 123 var compilerOptions = new CompilerOptions.fromArguments(argResults);
127 124
128 var resolveFn = (String url) { 125 var resolveFn = (String url) {
129 var packagePrefix = 'package:'; 126 var packagePrefix = 'package:';
130 var uri = Uri.parse(url); 127 var uri = Uri.parse(url);
131 var base = path.basename(url); 128 var base = path.basename(url);
132 var parts = uri.pathSegments; 129 var parts = uri.pathSegments;
133 var match = null; 130 var match = null;
134 int bestScore = 0; 131 int bestScore = 0;
135 for (var candidate in summaryDataStore.uriToSummaryPath.keys) { 132 for (var candidate in summaryDataStore.uriToSummaryPath.keys) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 } 175 }
179 176
180 if (score > bestScore) { 177 if (score > bestScore) {
181 match = candidate; 178 match = candidate;
182 } 179 }
183 } 180 }
184 return match; 181 return match;
185 }; 182 };
186 183
187 CompileModule compileFn = (String imports, String body, String libraryName, 184 CompileModule compileFn = (String imports, String body, String libraryName,
188 String existingLibrary, String fileName) { 185 String existingLibrary, String fileName) async {
189 // Instead of returning a single function, return a pair of functions. 186 // Instead of returning a single function, return a pair of functions.
190 // Create a new virtual File that contains the given Dart source. 187 // Create a new virtual File that contains the given Dart source.
191 String sourceCode; 188 String sourceCode;
192 if (existingLibrary == null) { 189 if (existingLibrary == null) {
193 sourceCode = imports + body; 190 sourceCode = imports + body;
194 } else { 191 } else {
195 var dir = path.dirname(existingLibrary); 192 var dir = path.dirname(existingLibrary);
196 // Need to pull in all the imports from the existing library and 193 // Need to pull in all the imports from the existing library and
197 // re-export all privates as privates in this library. 194 // re-export all privates as privates in this library.
198 var source = context.sourceFactory.forUri(existingLibrary); 195 var source = compiler.driver.sourceFactory.forUri(existingLibrary);
199 if (source == null) { 196 if (source == null) {
200 throw "Unable to load source for library $existingLibrary"; 197 throw "Unable to load source for library $existingLibrary";
201 } 198 }
202 199
203 LibraryElement libraryElement = context.computeLibraryElement(source); 200 var unitResult = await compiler.driver.getUnitElement(source.fullName);
201 LibraryElement libraryElement = unitResult.element.library;
204 if (libraryElement == null) { 202 if (libraryElement == null) {
205 throw "Unable to get library element."; 203 throw "Unable to get library element.";
206 } 204 }
207 var sb = new StringBuffer(imports); 205 var sb = new StringBuffer(imports);
208 sb.write('\n'); 206 sb.write('\n');
209 207
210 // TODO(jacobr): we need to add a proper Analyzer flag specifing that 208 // TODO(jacobr): we need to add a proper Analyzer flag specifing that
211 // cross-library privates should be in scope instead of this hack. 209 // cross-library privates should be in scope instead of this hack.
212 // We set the private name prefix for scope resolution to an invalid 210 // We set the private name prefix for scope resolution to an invalid
213 // character code so that the analyzer ignores normal Dart private 211 // character code so that the analyzer ignores normal Dart private
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 } 244 }
247 sb.write(';\n'); 245 sb.write(';\n');
248 } 246 }
249 sb.write(body); 247 sb.write(body);
250 sourceCode = sb.toString(); 248 sourceCode = sb.toString();
251 } 249 }
252 resourceProvider.newFile(fileName, sourceCode); 250 resourceProvider.newFile(fileName, sourceCode);
253 251
254 var unit = new BuildUnit(libraryName, "", [fileName], _moduleForLibrary); 252 var unit = new BuildUnit(libraryName, "", [fileName], _moduleForLibrary);
255 253
256 JSModuleFile module = compiler.compile(unit, compilerOptions); 254 JSModuleFile module = await compiler.compile(unit, compilerOptions);
257 255
258 var moduleCode = ''; 256 var moduleCode = '';
259 if (module.isValid) { 257 if (module.isValid) {
260 moduleCode = module 258 moduleCode = module
261 .getCode(ModuleFormat.legacy, unit.name, unit.name + '.map', 259 .getCode(ModuleFormat.legacy, unit.name, unit.name + '.map',
262 singleOutFile: true) 260 singleOutFile: true)
263 .code; 261 .code;
264 } 262 }
265 263
266 return new CompileResult( 264 return new CompileResult(
267 code: moduleCode, isValid: module.isValid, errors: module.errors); 265 code: moduleCode, isValid: module.isValid, errors: module.errors);
268 }; 266 };
269 267
270 return [allowInterop(compileFn), allowInterop(resolveFn)]; 268 return [allowInterop(compileFn), allowInterop(resolveFn)];
271 } 269 }
272 } 270 }
273 271
274 // Given path, determine corresponding dart library. 272 // Given path, determine corresponding dart library.
275 String _moduleForLibrary(source) { 273 String _moduleForLibrary(source) {
276 if (source is InSummarySource) { 274 if (source is InSummarySource) {
277 return source.summaryPath.substring(1).replaceAll('.api.ds', ''); 275 return source.summaryPath.substring(1).replaceAll('.api.ds', '');
278 } 276 }
279 return source.toString().substring(1).replaceAll('.dart', ''); 277 return source.toString().substring(1).replaceAll('.dart', '');
280 } 278 }
281 279
282 /// Thrown when the input source code has errors. 280 /// Thrown when the input source code has errors.
283 class CompileErrorException implements Exception { 281 class CompileErrorException implements Exception {
284 toString() => '\nPlease fix all errors before compiling (warnings are okay).'; 282 toString() => '\nPlease fix all errors before compiling (warnings are okay).';
285 } 283 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698