diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart index ba98796d5f7..f7ab997abea 100644 --- a/pkg/compiler/lib/src/kernel/dart2js_target.dart +++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart @@ -14,38 +14,13 @@ import '../native/native.dart' show maybeEnableNative; /// A kernel [Target] to configure the Dart Front End for dart2js. class Dart2jsTarget extends Target { final TargetFlags flags; + final String name; - Dart2jsTarget(this.flags); + Dart2jsTarget(this.name, this.flags); bool get strongMode => flags.strongMode; - String get name => 'dart2js'; - - List get extraRequiredLibraries => const [ - 'dart:_chrome', - 'dart:_foreign_helper', - 'dart:_interceptors', - 'dart:_internal', - 'dart:_isolate_helper', - 'dart:_js_embedded_names', - 'dart:_js_helper', - 'dart:_js_mirrors', - 'dart:_js_names', - 'dart:_native_typed_data', - 'dart:async', - 'dart:collection', - 'dart:html', - 'dart:html_common', - 'dart:indexed_db', - 'dart:io', - 'dart:js', - 'dart:js_util', - 'dart:mirrors', - 'dart:svg', - 'dart:web_audio', - 'dart:web_gl', - 'dart:web_sql', - ]; + List get extraRequiredLibraries => _requiredLibraries[name]; @override bool mayDefineRestrictedType(Uri uri) => @@ -96,3 +71,50 @@ class Dart2jsTarget extends Target { return new InvalidExpression(null); } } + +// TODO(sigmund): this "extraRequiredLibraries" needs to be removed... +// compile-platform should just specify which libraries to compile instead. +const _requiredLibraries = const >{ + 'dart2js': const [ + 'dart:_chrome', + 'dart:_foreign_helper', + 'dart:_interceptors', + 'dart:_internal', + 'dart:_isolate_helper', + 'dart:_js_embedded_names', + 'dart:_js_helper', + 'dart:_js_mirrors', + 'dart:_js_names', + 'dart:_native_typed_data', + 'dart:async', + 'dart:collection', + 'dart:html', + 'dart:html_common', + 'dart:indexed_db', + 'dart:io', + 'dart:js', + 'dart:js_util', + 'dart:mirrors', + 'dart:svg', + 'dart:web_audio', + 'dart:web_gl', + 'dart:web_sql', + ], + 'dart2js_server': const [ + 'dart:_foreign_helper', + 'dart:_interceptors', + 'dart:_internal', + 'dart:_isolate_helper', + 'dart:_js_embedded_names', + 'dart:_js_helper', + 'dart:_js_mirrors', + 'dart:_js_names', + 'dart:_native_typed_data', + 'dart:async', + 'dart:collection', + 'dart:io', + 'dart:js', + 'dart:js_util', + 'dart:mirrors', + ] +}; diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart index 2485eb05258..33ca3935f53 100644 --- a/pkg/compiler/lib/src/library_loader.dart +++ b/pkg/compiler/lib/src/library_loader.dart @@ -871,12 +871,15 @@ class KernelLibraryLoaderTask extends CompilerTask new BinaryBuilder(input.data).readComponent(component); } else { bool strongMode = _elementMap.options.strongMode; + String targetName = + _elementMap.options.compileForServer ? "dart2js_server" : "dart2js"; String platform = strongMode - ? 'dart2js_platform_strong.dill' - : 'dart2js_platform.dill'; + ? '${targetName}_platform_strong.dill' + : '${targetName}_platform.dill'; initializedCompilerState = fe.initializeCompiler( initializedCompilerState, - new Dart2jsTarget(new TargetFlags(strongMode: strongMode)), + new Dart2jsTarget( + targetName, new TargetFlags(strongMode: strongMode)), librariesSpecification, platformBinaries.resolve(platform), _packageConfig); diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart index 5f0f3c4813e..c42e0661fe3 100644 --- a/pkg/compiler/lib/src/options.dart +++ b/pkg/compiler/lib/src/options.dart @@ -100,6 +100,10 @@ class CompilerOptions implements DiagnosticOptions { /// and in the emitted output of the compiler. bool get hasBuildId => buildId != _UNDETERMINED_BUILD_ID; + /// Whether to compile for the server category. This is used to compile to JS + /// that is intended to be run on server-side VMs like nodejs. + final bool compileForServer; + /// Location where to generate a map containing details of how deferred /// libraries are subdivided. final Uri deferredMapUri; @@ -309,6 +313,7 @@ class CompilerOptions implements DiagnosticOptions { analyzeSignaturesOnly: _hasOption(options, Flags.analyzeSignaturesOnly), buildId: _extractStringOption( options, '--build-id=', _UNDETERMINED_BUILD_ID), + compileForServer: _resolveCompileForServerFromOptions(options), deferredMapUri: _extractUriOption(options, '--deferred-map='), fatalWarnings: _hasOption(options, Flags.fatalWarnings), terseDiagnostics: _hasOption(options, Flags.terse), @@ -387,6 +392,7 @@ class CompilerOptions implements DiagnosticOptions { bool analyzeOnly: false, bool analyzeSignaturesOnly: false, String buildId: _UNDETERMINED_BUILD_ID, + bool compileForServer: false, Uri deferredMapUri: null, bool fatalWarnings: false, bool terseDiagnostics: false, @@ -469,6 +475,7 @@ class CompilerOptions implements DiagnosticOptions { analyzeOnly || analyzeSignaturesOnly || analyzeAll || resolveOnly, analyzeSignaturesOnly: analyzeSignaturesOnly, buildId: buildId, + compileForServer: compileForServer, deferredMapUri: deferredMapUri, fatalWarnings: fatalWarnings, terseDiagnostics: terseDiagnostics, @@ -527,6 +534,7 @@ class CompilerOptions implements DiagnosticOptions { this.analyzeOnly: false, this.analyzeSignaturesOnly: false, this.buildId: _UNDETERMINED_BUILD_ID, + this.compileForServer: false, this.deferredMapUri: null, this.fatalWarnings: false, this.terseDiagnostics: false, @@ -591,6 +599,7 @@ class CompilerOptions implements DiagnosticOptions { analyzeOnly, analyzeSignaturesOnly, buildId, + compileForServer, deferredMapUri, fatalWarnings, terseDiagnostics, @@ -654,6 +663,7 @@ class CompilerOptions implements DiagnosticOptions { analyzeSignaturesOnly: analyzeSignaturesOnly ?? options.analyzeSignaturesOnly, buildId: buildId ?? options.buildId, + compileForServer: compileForServer ?? options.compileForServer, deferredMapUri: deferredMapUri ?? options.deferredMapUri, fatalWarnings: fatalWarnings ?? options.fatalWarnings, terseDiagnostics: terseDiagnostics ?? options.terseDiagnostics, @@ -801,6 +811,11 @@ Uri _resolvePlatformConfig( } } +bool _resolveCompileForServerFromOptions(List options) { + var categories = _extractCsvOption(options, '--categories='); + return categories.length == 1 && categories.single == 'Server'; +} + Uri _resolvePlatformConfigFromOptions(Uri libraryRoot, List options) { return _resolvePlatformConfig( libraryRoot, diff --git a/pkg/compiler/tool/generate_kernel.dart b/pkg/compiler/tool/generate_kernel.dart index a64999710af..1ccdd8b5bae 100644 --- a/pkg/compiler/tool/generate_kernel.dart +++ b/pkg/compiler/tool/generate_kernel.dart @@ -23,7 +23,7 @@ import 'package:kernel/target/targets.dart'; main(List args) async { ArgResults flags = _argParser.parse(args); var options = new CompilerOptions() - ..target = new Dart2jsTarget(new TargetFlags()) + ..target = new Dart2jsTarget("dart2js", new TargetFlags()) ..packagesFileUri = Uri.base.resolve('.packages') ..setExitCodeOnProblem = true ..linkedDependencies = [ diff --git a/pkg/front_end/tool/_fasta/compile_platform.dart b/pkg/front_end/tool/_fasta/compile_platform.dart index d541fd7fe8b..b2bf572cc1e 100644 --- a/pkg/front_end/tool/_fasta/compile_platform.dart +++ b/pkg/front_end/tool/_fasta/compile_platform.dart @@ -38,7 +38,10 @@ import 'command_line.dart' show withGlobalOptions; const int iterations = const int.fromEnvironment("iterations", defaultValue: 1); Future main(List arguments) async { - targets["dart2js"] = (TargetFlags flags) => new Dart2jsTarget(flags); + targets["dart2js"] = + (TargetFlags flags) => new Dart2jsTarget("dart2js", flags); + targets["dart2js_server"] = + (TargetFlags flags) => new Dart2jsTarget("dart2js_server", flags); targets["dart_runner"] = (TargetFlags flags) => new DartRunnerTarget(flags); targets["flutter_runner"] = (TargetFlags flags) => new FlutterRunnerTarget(flags); diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart index 67cbe5959ac..c69bb9ba06f 100644 --- a/pkg/front_end/tool/_fasta/entry_points.dart +++ b/pkg/front_end/tool/_fasta/entry_points.dart @@ -49,7 +49,10 @@ const bool summary = const bool.fromEnvironment("summary", defaultValue: false); const int iterations = const int.fromEnvironment("iterations", defaultValue: 1); compileEntryPoint(List arguments) async { - targets["dart2js"] = (TargetFlags flags) => new Dart2jsTarget(flags); + targets["dart2js"] = + (TargetFlags flags) => new Dart2jsTarget("dart2js", flags); + targets["dart2js_server"] = + (TargetFlags flags) => new Dart2jsTarget("dart2js_server", flags); // Timing results for each iteration List elapsedTimes = []; diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index e294c6706ef..b3e25e2c26e 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -65,7 +65,9 @@ declare_args() { #.........spec.sum #.........strong.sum #.........dart2js_platform.dill +#.........dart2js_server_platform.dill #.........dart2js_platform_strong.dill +#.........dart2js_server_platform_strong.dill #.........vm_outline.dill #.........vm_outline_strong.dill #.........vm_platform.dill @@ -549,11 +551,15 @@ copy("copy_dart2js_dill_files") { deps = [ ":copy_libraries", "../utils/compiler:compile_dart2js_platform", + "../utils/compiler:compile_dart2js_server_platform", "../utils/compiler:compile_dart2js_platform_strong", + "../utils/compiler:compile_dart2js_server_platform_strong", ] sources = [ "$root_out_dir/dart2js_platform.dill", + "$root_out_dir/dart2js_server_platform.dill", "$root_out_dir/dart2js_platform_strong.dill", + "$root_out_dir/dart2js_server_platform_strong.dill", ] outputs = [ "$root_out_dir/dart-sdk/lib/_internal/{{source_file_part}}", diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json index 4c0ecac5316..633ae36b396 100644 --- a/sdk/lib/libraries.json +++ b/sdk/lib/libraries.json @@ -266,5 +266,100 @@ "uri": "svg/dart2js/svg_dart2js.dart" } } + }, + "dart2js_server": { + "environment_overrides": { + "mirrors": false, + "io": false + }, + "libraries": { + "async": { + "patches": "_internal/js_runtime/lib/async_patch.dart", + "uri": "async/async.dart" + }, + "mirrors": { + "patches": "_internal/js_runtime/lib/mirrors_patch_cfe.dart", + "uri": "mirrors/mirrors.dart" + }, + "_interceptors": { + "uri": "_internal/js_runtime/lib/interceptors.dart" + }, + "_js_embedded_names": { + "uri": "_internal/js_runtime/lib/shared/embedded_names.dart" + }, + "io": { + "patches": "_internal/js_runtime/lib/io_patch.dart", + "uri": "io/io.dart" + }, + "_internal": { + "patches": "_internal/js_runtime/lib/internal_patch.dart", + "uri": "internal/internal.dart" + }, + "_async_await_error_codes": { + "uri": "_internal/js_runtime/lib/shared/async_await_error_codes.dart" + }, + "_http": { + "uri": "_http/http.dart" + }, + "_js_helper": { + "uri": "_internal/js_runtime/lib/js_helper.dart" + }, + "_js_primitives": { + "uri": "_internal/js_runtime/lib/js_primitives.dart" + }, + "js": { + "uri": "js/dart2js/js_dart2js.dart" + }, + "_js_mirrors": { + "uri": "_internal/js_runtime/lib/js_mirrors.dart" + }, + "_native_typed_data": { + "uri": "_internal/js_runtime/lib/native_typed_data.dart" + }, + "core": { + "patches": "_internal/js_runtime/lib/core_patch.dart", + "uri": "core/core.dart" + }, + "_js_names": { + "uri": "_internal/js_runtime/lib/js_names.dart" + }, + "js_util": { + "uri": "js_util/dart2js/js_util_dart2js.dart" + }, + "collection": { + "patches": "_internal/js_runtime/lib/collection_patch.dart", + "uri": "collection/collection.dart" + }, + "typed_data": { + "patches": "_internal/js_runtime/lib/typed_data_patch.dart", + "uri": "typed_data/typed_data.dart" + }, + "isolate": { + "patches": "_internal/js_runtime/lib/isolate_patch.dart", + "uri": "isolate/isolate.dart" + }, + "developer": { + "patches": "_internal/js_runtime/lib/developer_patch.dart", + "uri": "developer/developer.dart" + }, + "_js": { + "patches": "js/_js_server.dart", + "uri": "js/_js.dart" + }, + "convert": { + "patches": "_internal/js_runtime/lib/convert_patch.dart", + "uri": "convert/convert.dart" + }, + "_isolate_helper": { + "uri": "_internal/js_runtime/lib/isolate_helper.dart" + }, + "math": { + "patches": "_internal/js_runtime/lib/math_patch.dart", + "uri": "math/math.dart" + }, + "_foreign_helper": { + "uri": "_internal/js_runtime/lib/foreign_helper.dart" + } + } } } \ No newline at end of file diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml index e090c1efbe7..2bb6e8c00da 100644 --- a/sdk/lib/libraries.yaml +++ b/sdk/lib/libraries.yaml @@ -263,3 +263,96 @@ dart2js: environment_overrides: io: false mirrors: false + +dart2js_server: + libraries: + async: + uri: "async/async.dart" + patches: "_internal/js_runtime/lib/async_patch.dart" + + collection: + uri: "collection/collection.dart" + patches: "_internal/js_runtime/lib/collection_patch.dart" + + convert: + uri: "convert/convert.dart" + patches: "_internal/js_runtime/lib/convert_patch.dart" + + core: + uri: "core/core.dart" + patches: "_internal/js_runtime/lib/core_patch.dart" + + developer: + uri: "developer/developer.dart" + patches: "_internal/js_runtime/lib/developer_patch.dart" + + _http: + uri: "_http/http.dart" + + io: + uri: "io/io.dart" + patches: "_internal/js_runtime/lib/io_patch.dart" + + isolate: + uri: "isolate/isolate.dart" + patches: "_internal/js_runtime/lib/isolate_patch.dart" + + js: + uri: "js/dart2js/js_dart2js.dart" + + _js: + uri: "js/_js.dart" + patches: "js/_js_server.dart" + + js_util: + uri: "js_util/dart2js/js_util_dart2js.dart" + + math: + uri: "math/math.dart" + patches: "_internal/js_runtime/lib/math_patch.dart" + + mirrors: + uri: "mirrors/mirrors.dart" + patches: "_internal/js_runtime/lib/mirrors_patch_cfe.dart" + + typed_data: + uri: "typed_data/typed_data.dart" + patches: "_internal/js_runtime/lib/typed_data_patch.dart" + + _native_typed_data: + uri: "_internal/js_runtime/lib/native_typed_data.dart" + + _internal: + uri: "internal/internal.dart" + patches: "_internal/js_runtime/lib/internal_patch.dart" + + _js_helper: + uri: "_internal/js_runtime/lib/js_helper.dart" + + _interceptors: + uri: "_internal/js_runtime/lib/interceptors.dart" + + _foreign_helper: + uri: "_internal/js_runtime/lib/foreign_helper.dart" + + _isolate_helper: + uri: "_internal/js_runtime/lib/isolate_helper.dart" + + _js_mirrors: + uri: "_internal/js_runtime/lib/js_mirrors.dart" + + _js_names: + uri: "_internal/js_runtime/lib/js_names.dart" + + _js_primitives: + uri: "_internal/js_runtime/lib/js_primitives.dart" + + _js_embedded_names: + uri: "_internal/js_runtime/lib/shared/embedded_names.dart" + + _async_await_error_codes: + uri: "_internal/js_runtime/lib/shared/async_await_error_codes.dart" + + environment_overrides: + io: false + mirrors: false diff --git a/tests/compiler/dart2js/dill_loader_test.dart b/tests/compiler/dart2js/dill_loader_test.dart index 1963d3b4e3f..41927564217 100644 --- a/tests/compiler/dart2js/dill_loader_test.dart +++ b/tests/compiler/dart2js/dill_loader_test.dart @@ -43,7 +43,7 @@ main() { Uri entryPoint = Uri.parse('memory:main.dill'); var options = new CompilerOptions() - ..target = new Dart2jsTarget(new TargetFlags()) + ..target = new Dart2jsTarget("dart2js", new TargetFlags()) ..packagesFileUri = Uri.base.resolve('.packages') ..linkedDependencies = [ computePlatformBinariesLocation().resolve("dart2js_platform.dill"), diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart index 5d1cf86b409..f8dd6fc3eb6 100644 --- a/tools/patch_sdk.dart +++ b/tools/patch_sdk.dart @@ -139,7 +139,7 @@ Future _main(List argv) async { break; case 'dart2js': - target = new Dart2jsTarget(flags); + target = new Dart2jsTarget("dart2js", flags); break; default: diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn index bcea398469a..a279e9e0f33 100644 --- a/utils/compiler/BUILD.gn +++ b/utils/compiler/BUILD.gn @@ -110,3 +110,36 @@ compile_platform("compile_dart2js_platform_strong") { "dart:core", ] } + +compile_platform("compile_dart2js_server_platform") { + sources = [ + "../../sdk/lib/libraries.json", + ] + + outputs = [ + "$root_out_dir/dart2js_server_platform.dill", + "$root_out_dir/dart2js_server_outline.dill", + ] + + args = [ + "--target=dart2js_server", + "dart:core", + ] +} + +compile_platform("compile_dart2js_server_platform_strong") { + sources = [ + "../../sdk/lib/libraries.json", + ] + + outputs = [ + "$root_out_dir/dart2js_server_platform_strong.dill", + "$root_out_dir/dart2js_server_outline_strong.dill", + ] + + args = [ + "--target=dart2js_server", + "--strong", + "dart:core", + ] +}