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

Unified Diff: lib/src/codegen/js_codegen.dart

Issue 1122133003: fixes #157, renaming local library identifiers if needed. (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: rebase and format Created 5 years, 7 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
« no previous file with comments | « lib/runtime/dart_runtime.js ('k') | test/codegen/expect/8invalid-chars.in+file_name.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/codegen/js_codegen.dart
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
index eecddeeff14005752e004750bbdda948a0ebb9da..61d12301f60533fef70b99ff271b5a284acf629d 100644
--- a/lib/src/codegen/js_codegen.dart
+++ b/lib/src/codegen/js_codegen.dart
@@ -68,6 +68,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
ConstantEvaluator _constEvaluator;
+ /// Imported libraries, and the temporaries used to refer to them.
+ final _imports = new Map<LibraryElement, JS.TemporaryId>();
final _exports = new Set<String>();
final _lazyFields = <VariableDeclaration>[];
final _properties = <FunctionDeclaration>[];
@@ -77,8 +79,6 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
final _temps = new HashMap<Element, JS.TemporaryId>();
/// The name for the library's exports inside itself.
- /// This much be a constant because we interpolate it into template strings,
- /// and otherwise it would break caching for them.
/// `exports` was chosen as the most similar to ES module patterns.
final _exportsVar = new JS.TemporaryId('exports');
final _namedArgTemp = new JS.TemporaryId('opts');
@@ -141,19 +141,33 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
body.add(js.statement('#.# = #;', [_exportsVar, name, name]));
}
- var name = jsLibraryName(libraryInfo.library);
+ var name = new JS.Identifier(jsLibraryName(currentLibrary));
- var defaultValue = js.call(jsDefaultValue);
- return new JS.Program([
- js.statement('var #;', name),
- js.statement("(function(#) { 'use strict'; #; })(# || (# = #));", [
- _exportsVar,
- body,
+ // TODO(jmesserly): it would be great to run the renamer on the body,
+ // then figure out if we really need each of these parameters.
+ // See ES6 modules: https://github.com/dart-lang/dev_compiler/issues/34
+ var program = [
+ js.statement('var # = dart.defineLibrary(#, #);', [
name,
name,
- defaultValue
+ js.call(jsDefaultValue)
])
- ]);
+ ];
+
+ var params = [_exportsVar];
+ var args = [name];
+ _imports.forEach((library, temp) {
+ var name = new JS.Identifier(temp.name);
+ params.add(temp);
+ args.add(name);
+ var helper = _libraryMightNotBeLoaded(library) ? 'lazyImport' : 'import';
+ program.add(js.statement('var # = dart.#(#);', [name, helper, name]));
+ });
+
+ program.add(js.statement(
+ "(function(#) { 'use strict'; #; })(#);", [params, body, args]));
+
+ return new JS.Program(program);
}
JS.Identifier _initSymbol(JS.Identifier id) {
@@ -477,7 +491,10 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
bool _typeMightNotBeLoaded(DartType type) {
var library = type.element.library;
if (library == currentLibrary) return _lazyClass(type);
+ return _libraryMightNotBeLoaded(library);
+ }
+ bool _libraryMightNotBeLoaded(LibraryElement library) {
// The SDK is a special case: we optimize the order to prevent laziness.
if (library.isInSdk) {
// SDK is loaded before non-SDK libraies
@@ -1101,7 +1118,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
// library member
if (element.enclosingElement is CompilationUnitElement &&
- (element.library != libraryInfo.library ||
+ (element.library != currentLibrary ||
element is TopLevelVariableElement && !element.isConst)) {
var memberName = _emitMemberName(name, isStatic: true);
return js.call('#.#', [_libraryName(element.library), memberName]);
@@ -2243,7 +2260,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
// correctly.
var name = js.string(node.components.join('.'), "'");
var nameHint = 'symbol_' + node.components.join('_');
- return _const(node, js.call('new core.Symbol(#)', name), nameHint);
+ return _const(
+ node, new JS.New(_emitTypeName(types.symbolType), [name]), nameHint);
}
@override
@@ -2492,8 +2510,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
/// This never uses the library's name (the identifier in the `library`
/// declaration) as it doesn't have any meaningful rules enforced.
JS.Identifier _libraryName(LibraryElement library) {
- if (library == libraryInfo.library) return _exportsVar;
- return new JS.Identifier(jsLibraryName(library));
+ if (library == currentLibrary) return _exportsVar;
+ return _imports.putIfAbsent(
+ library, () => new JS.TemporaryId(jsLibraryName(library)));
}
DartType getStaticType(Expression e) => rules.getStaticType(e);
« no previous file with comments | « lib/runtime/dart_runtime.js ('k') | test/codegen/expect/8invalid-chars.in+file_name.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698