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); |
} |
} |