Chromium Code Reviews| Index: web/web_command.dart |
| diff --git a/web/web_command.dart b/web/web_command.dart |
| index 238257ae6e4f7bb240892ff31c915331e2195b65..70043ad1e5e4ae7f4f4128566060b1042813dd9c 100644 |
| --- a/web/web_command.dart |
| +++ b/web/web_command.dart |
| @@ -1,8 +1,12 @@ |
| // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| +@JS() |
| +library dev_compiler.web.web_command; |
| + |
| import 'dart:html' show HttpRequest; |
| import 'dart:convert' show BASE64; |
| +import 'dart:async'; |
|
Jacob
2016/08/03 23:58:32
sort imports in alphabetical order.
priscillalee
2016/08/04 16:01:56
Done.
|
| import 'package:analyzer/file_system/file_system.dart' |
| show ResourceProvider, ResourceUriResolver; |
| @@ -18,6 +22,11 @@ import 'package:analyzer/src/generated/sdk.dart' |
| import 'package:analyzer/src/generated/source.dart' |
| show DartUriResolver, Source, SourceFactory, UriKind; |
| import 'package:analyzer/src/summary/idl.dart' show PackageBundle; |
| +import 'package:analyzer/src/summary/package_bundle_reader.dart' |
| + show |
| + SummaryDataStore, |
| + InSummaryPackageUriResolver, |
| + InputPackagesResultProvider; |
| import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; |
| import 'package:args/command_runner.dart'; |
| @@ -26,49 +35,65 @@ import 'package:dev_compiler/src/analyzer/context.dart' show AnalyzerOptions; |
| import 'package:dev_compiler/src/compiler/compiler.dart' |
| show BuildUnit, CompilerOptions, JSModuleFile, ModuleCompiler; |
| +import 'package:js/js.dart'; |
| + |
| typedef void MessageHandler(Object message); |
| -typedef String CompileFn(String dart); |
| -typedef void OnLoadFn(CompileFn compile); |
| /// The command for invoking the modular compiler. |
| class WebCompileCommand extends Command { |
| get name => 'compile'; |
| get description => 'Compile a set of Dart files into a JavaScript module.'; |
| final MessageHandler messageHandler; |
| - final OnLoadFn onload; |
| - WebCompileCommand(this.onload, {MessageHandler messageHandler}) |
| + WebCompileCommand({MessageHandler messageHandler}) |
| : this.messageHandler = messageHandler ?? print { |
| CompilerOptions.addArguments(argParser); |
| AnalyzerOptions.addArguments(argParser); |
| } |
| @override |
| - void run() { |
| - var request = new HttpRequest(); |
| - |
| - request.onReadyStateChange.listen((_) { |
| - if (request.readyState == HttpRequest.DONE && |
| - (request.status == 200 || request.status == 0)) { |
| - var response = request.responseText; |
| - var sdkBytes = BASE64.decode(response); |
| - var result = setUpCompile(sdkBytes); |
| - onload(result); |
| - } |
| - }); |
| + Function run() { |
| + return requestSummaries; |
|
Jacob
2016/08/03 23:58:31
Are we really getting anything from implementing C
priscillalee
2016/08/04 16:01:56
I agree. It does seem strange. I don't understand
|
| + } |
| + |
| + void requestSummaries( |
| + String sdkUrl, List<String> summaryUrls, Function callback) { |
| + HttpRequest.request(sdkUrl).then((sdkRequest) { |
| + var sdkResponse = sdkRequest.responseText; |
| + var sdkBytes = BASE64.decode(sdkResponse); |
| + |
| + // Map summary URLs to HttpRequests. |
| + var summaryRequests = summaryUrls |
| + .map((summary) => new Future(() => HttpRequest.request(summary))); |
| + |
| + Future.wait(summaryRequests).then((summaryResponses) { |
| + // Map summary responses to summary bytes. |
| + var summaryBytes = summaryResponses |
| + .map((response) => BASE64.decode(response.responseText)); |
| - request.open('get', 'dart_sdk.sum'); |
| - request.send(); |
| + var compileFn = setUpCompile(sdkBytes, summaryBytes); |
| + callback(compileFn); |
| + }); |
|
Jacob
2016/08/03 23:58:31
You should handle if a summary fails to load.
priscillalee
2016/08/04 16:01:56
I added status checks, but should I also throw exc
Jacob
2016/08/04 16:27:48
Ideally you would report the error back to the cal
priscillalee
2016/08/04 17:56:33
Done.
|
| + }); |
| } |
| - CompileFn setUpCompile(List<int> sdkBytes) { |
| + Function setUpCompile(List<int> sdkBytes, List<List<int>> summaryBytes) { |
| var resourceProvider = new MemoryResourceProvider(); |
| + var resourceUriResolver = new ResourceUriResolver(resourceProvider); |
| + |
| var packageBundle = new PackageBundle.fromBuffer(sdkBytes); |
| var webDartSdk = new SummaryBasedDartSdk.fromBundle( |
| true, packageBundle, resourceProvider); |
| - |
| var sdkResolver = new DartUriResolver(webDartSdk); |
| - var fileResolvers = [new ResourceUriResolver(resourceProvider)]; |
| + |
| + var summaryDataStore = new SummaryDataStore([]); |
| + for (var bytes in summaryBytes) { |
| + var summaryBundle = new PackageBundle.fromBuffer(bytes); |
| + summaryDataStore.addBundle('', summaryBundle); |
| + } |
| + var summaryResolver = new InSummaryPackageUriResolver(summaryDataStore); |
| + |
| + var fileResolvers = [summaryResolver, resourceUriResolver]; |
| var compiler = new ModuleCompiler( |
| new AnalyzerOptions(dartSdkPath: '/dart-sdk'), |
| @@ -76,17 +101,20 @@ class WebCompileCommand extends Command { |
| fileResolvers: fileResolvers, |
| resourceProvider: resourceProvider); |
| + compiler.context.resultProvider = |
| + new InputPackagesResultProvider(compiler.context, summaryDataStore); |
| + |
| var compilerOptions = new CompilerOptions.fromArguments(argResults); |
| var number = 0; |
| - return (String dart) { |
| + var compileFn = (String dart) { |
| // Create a new virtual File that contains the given Dart source. |
| number++; |
| resourceProvider.newFile("/expression$number.dart", dart); |
| - var unit = |
| - new BuildUnit("", "", ["file:///expression$number.dart"], null); |
| + var unit = new BuildUnit( |
| + "", "", ["file:///expression$number.dart"], (source) => ""); |
|
Jacob
2016/08/03 23:58:32
what is the fn (source) => "" doing?
shouldn't it
Jacob
2016/08/03 23:58:32
nit: put {} around number for clarity.
e.g.
${num
priscillalee
2016/08/04 16:01:56
It's the libraryToModule function of a BuildUnit.
priscillalee
2016/08/04 16:01:56
Done.
Jacob
2016/08/04 16:27:48
do that everywhere in the file where $number occur
priscillalee
2016/08/04 17:56:33
Done.
|
| JSModuleFile module = compiler.compile(unit, compilerOptions); |
| module.errors.forEach(messageHandler); |
| @@ -94,6 +122,8 @@ class WebCompileCommand extends Command { |
| if (!module.isValid) throw new CompileErrorException(); |
| return module.code; |
| }; |
| + |
| + return allowInterop(compileFn); |
| } |
| } |