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

Unified Diff: lib/src/transformer/entry_point_transformer.dart

Issue 580283004: Add JsInitializerGenerator (Closed) Base URL: https://github.com/dart-lang/js-interop.git@master
Patch Set: Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: lib/src/transformer/entry_point_transformer.dart
diff --git a/lib/src/transformer/entry_point_transformer.dart b/lib/src/transformer/entry_point_transformer.dart
index cb7dd0a7ef9ba0d0b53005d30f87f3753e9660b0..6af296d06969bce839b4c492918f6cc3dd4b49ac 100644
--- a/lib/src/transformer/entry_point_transformer.dart
+++ b/lib/src/transformer/entry_point_transformer.dart
@@ -11,7 +11,6 @@ import 'package:barback/barback.dart' show Asset, AssetId, Transform,
import 'package:code_transformers/resolver.dart' show Resolver,
ResolverTransformer, Resolvers, isPossibleDartEntryId;
import 'package:logging/logging.dart' show Logger;
-import 'package:path/path.dart' as path;
import 'utils.dart';
@@ -46,51 +45,83 @@ class EntryPointTransformer extends Transformer with ResolverTransformer {
.map((lib) {
// look for initializer library
var libAssetId = resolver.getSourceAssetId(lib);
- var initializerAssetId = libAssetId.addExtension(INITIALIZER_SUFFIX);
- return transform
- .getInput(initializerAssetId)
- .catchError((e) => null,
- test: (e) => e is AssetNotFoundException);
+ var dartInitializerAssetId =
+ libAssetId.addExtension(DART_INITIALIZER_SUFFIX);
+ var jsInitializerAssetId =
+ libAssetId.addExtension(JS_INITIALIZER_SUFFIX);
+ return [
+ transform
+ .getInput(dartInitializerAssetId)
+ .catchError((e) => null,
+ test: (e) => e is AssetNotFoundException),
+ transform
+ .getInput(jsInitializerAssetId)
+ .catchError((e) => null,
+ test: (e) => e is AssetNotFoundException),
+ ];
+ });
+
+ var dartInitializerFutures = initializerFutures.map((l) => l[0]);
+ var jsInitializerFutures = initializerFutures.map((l) => l[1]);
+
+ var dartImports = new StringBuffer('\n');
+ var dartInitializerCalls = new StringBuffer();
+
+ var dartFuture = Future.wait(dartInitializerFutures).
Siggi Cherem (dart-lang) 2014/09/22 22:42:58 style nit: move . to the next line
justinfagnani 2014/09/23 01:29:53 Done.
+ then((initializerAssets) {
+ for (Asset asset in initializerAssets.where((a) => a != null)) {
+ var id = asset.id;
+ var importUri = getImportUri(id, input.id);
+ if (importUri == null) continue;
+ var prefix = assetIdToPrefix(id);
+ dartImports.writeln("import '$importUri' as $prefix;");
+ dartInitializerCalls
+ .writeln(" $prefix.initializeJavaScriptLibrary();");
+ }
})
- .where((f) => f != null);
- return Future.wait(initializerFutures).then((initializerAssets) {
- var imports = new StringBuffer('\n');
- var calls = new StringBuffer();
- for (Asset asset in initializerAssets.where((a) => a != null)) {
- var id = asset.id;
- var importUri = getImportUri(id, input.id);
- if (importUri == null) continue;
- var prefix = assetIdToPrefix(id);
- imports.writeln("import '$importUri' as $prefix;");
- calls.writeln(" $prefix.initializeJavaScriptLibrary();");
- }
-
- var initMethod = 'initializeJavaScript() {\n$calls}\n';
- var insertImportOffset = getInsertImportOffset(library);
- var initMethodOffset = library.source.contents.data.length;
- transaction.edit(insertImportOffset, insertImportOffset, '$imports');
- transaction.edit(initMethodOffset, initMethodOffset, initMethod);
- var printer = transaction.commit();
- printer.build(input.id.path);
- transform.addOutput(new Asset.fromString(input.id, printer.text));
- });
+ .then((_) {
+ var initMethod = 'initializeJavaScript() {\n$dartInitializerCalls}\n';
+ var insertImportOffset = getInsertImportOffset(library);
+ var initMethodOffset = library.source.contents.data.length;
+ transaction.edit(insertImportOffset, insertImportOffset,
+ '$dartImports');
+ transaction.edit(initMethodOffset, initMethodOffset, initMethod);
+ var printer = transaction.commit();
+ printer.build(input.id.path);
+ transform.addOutput(new Asset.fromString(input.id, printer.text));
+ });
+
+ var jsInitializerScript = new StringBuffer('''
+
+window.dart = window.dart || {};
+
+window.dart.Object = function DartObject() {
+ throw "not allowed";
+};
+
+window.dart.Object._wrapDartObject = function(dartObject) {
+ var o = Object.create(window.dart.Object.prototype);
+ o.__dart_object__ = dartObject;
+ return o;
+};
+
+''');
+
+ var jsFuture =
+ Future.wait(jsInitializerFutures)
+ .then((assets) => Future.wait(assets
+ .where((a) => a != null)
+ .map((Asset a) => a.readAsString())))
+ .then((initializerSources) {
+ for (String source in initializerSources) {
+ jsInitializerScript.writeln(source);
+ }
+ }).then((_) {
+ var jsInitializerId = input.id.addExtension('_initialize.js');
+ var asset = new Asset.fromString(jsInitializerId,
+ jsInitializerScript.toString());
+ transform.addOutput(asset);
+ });
+ return Future.wait([dartFuture, jsFuture]);
}
}
-
-final illegalIdRegex = new RegExp(r'[^a-zA-Z0-9_]');
-
-String assetIdToPrefix(AssetId id) =>
- '_js__${id.package}__${id.path.replaceAll(illegalIdRegex, '_')}';
-
-// TODO(justinfagnani): put this in code_transformers ?
-String getImportUri(AssetId importId, AssetId from) {
- if (importId.path.startsWith('lib/')) {
- // we support package imports
- return "package:${importId.package}/${importId.path.substring(4)}";
- } else if (importId.package == from.package) {
- // we can support relative imports
- return path.relative(importId.path, from: path.dirname(from.path));
- }
- // cannot import
- return null;
-}
« no previous file with comments | « lib/src/transformer/dart_initializer_generator.dart ('k') | lib/src/transformer/js_initializer_generator.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698