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

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

Issue 1633003002: Add --modules=node support (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: regen sdk and expectations Created 4 years, 11 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/codegen/js_codegen.dart
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
index 8104a628f51c1dbc5fe6dfcd8ab8ebd0563e8fa0..486eae63471dad8cf9bb8c8bcb62ea8295235ae3 100644
--- a/lib/src/codegen/js_codegen.dart
+++ b/lib/src/codegen/js_codegen.dart
@@ -25,7 +25,7 @@ import '../js/js_ast.dart' as JS;
import '../js/js_ast.dart' show js;
import '../closure/closure_annotator.dart' show ClosureAnnotator;
-import '../compiler.dart' show AbstractCompiler;
+import '../compiler.dart' show AbstractCompiler, corelibUriOrder;
import '../info.dart';
import '../options.dart' show CodegenOptions;
import '../utils.dart';
@@ -80,7 +80,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
/// Imported libraries, and the temporaries used to refer to them.
final _imports = new Map<LibraryElement, JS.TemporaryId>();
- final _exports = new Set<String>();
+ final _exports = <String, String>{};
final _lazyFields = <VariableDeclaration>[];
final _properties = <FunctionDeclaration>[];
final _privateNames = new HashMap<String, JS.TemporaryId>();
@@ -179,16 +179,18 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
id.setQualified(!_loader.isLoaded(element));
}
- var moduleBuilder = new ModuleBuilder(
- compiler.getModuleName(currentLibrary.source.uri),
- _jsModuleValue,
- _exportsVar,
- options.moduleFormat);
-
+ var moduleBuilder = new ModuleBuilder(options.moduleFormat);
_exports.forEach(moduleBuilder.addExport);
var items = <JS.ModuleItem>[];
if (!_isDartRuntime) {
+ if (currentLibrary.source.isInSystemLibrary) {
+ // Force the import order of runtime libs.
+ // TODO(ochafik): Reduce this to a minimum.
+ for (var lib in corelibUriOrder.reversed) {
+ moduleBuilder.addImport(lib.replaceAll(':', '/'), null);
+ }
+ }
moduleBuilder.addImport('dart/_runtime', _runtimeLibVar);
var dartxImport =
@@ -208,7 +210,11 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
// var jsBin = compiler.options.runnerOptions.v8Binary;
// String scriptTag = null;
// if (library.library.scriptTag != null) scriptTag = '/usr/bin/env $jsBin';
- return moduleBuilder.build(items);
+ return moduleBuilder.build(
+ compiler.getModuleName(currentLibrary.source.uri),
+ _jsModuleValue,
+ _exportsVar,
+ items);
}
void _emitModuleItem(AstNode node) {
@@ -266,8 +272,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
args.add(new JS.ArrayInitializer(hiddenNames));
}
- // When we compile _runtime.js, we need to source export_ from _utils.js:
- _moduleItems.add(js.statement('dart.export(#);', [args]));
+ _moduleItems.add(js.statement('dart.export_(#);', [args]));
}
JS.Identifier _initSymbol(JS.Identifier id) {
@@ -530,7 +535,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
if (genericDef != null) {
var dynType = fillDynamicTypeArgs(type, types);
var genericInst = _emitTypeName(dynType, lowerGeneric: true);
- return js.statement('{ #; let # = #; }', [genericDef, name, genericInst]);
+ return js
+ .statement('{ #; const # = #; }', [genericDef, name, genericInst]);
}
return body;
}
@@ -539,7 +545,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
var name = type.name;
var genericName = '$name\$';
var typeParams = _boundTypeParametersOf(type).map((p) => p.name);
- if (isPublic(name)) _exports.add(genericName);
+ if (isPublic(name)) _addExport(genericName);
return js.statement('const # = dart.generic(function(#) { #; return #; });',
[genericName, typeParams, body, name]);
}
@@ -1285,7 +1291,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
var body = <JS.Statement>[];
_flushLibraryProperties(body);
- var name = _getJSExportName(node.element) ?? node.name.name;
+ var name = node.name.name;
var fn = _visit(node.functionExpression);
@@ -1301,7 +1307,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
.toStatement());
}
- if (isPublic(name)) _addExport(name);
+ if (isPublic(name)) {
+ _addExport(name, _getJSExportName(node.element) ?? name);
+ }
return _statement(body);
}
@@ -1735,7 +1743,6 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
JS.Expression _emitTopLevelName(Element e, {String suffix: ''}) {
var libName = _libraryName(e.library);
- var nameExpr = _propertyName((_getJSExportName(e) ?? e.name) + suffix);
// Always qualify:
// * mutable top-level fields
@@ -1744,6 +1751,12 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
!e.isConst &&
!_isFinalJSDecl(e.computeNode());
bool fromAnotherLibrary = e.library != currentLibrary;
+ var nameExpr;
+ if (fromAnotherLibrary) {
+ nameExpr = _propertyName((_getJSExportName(e) ?? e.name) + suffix);
+ } else {
+ nameExpr = _propertyName(e.name + suffix);
+ }
if (mutableTopLevel || fromAnotherLibrary) {
return new JS.PropertyAccess(libName, nameExpr);
}
@@ -2136,8 +2149,10 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
}
}
- _addExport(String name) {
- if (!_exports.add(name)) throw 'Duplicate top level name found: $name';
+ _addExport(String name, [String exportName]) {
+ if (_exports.containsKey(name))
+ throw 'Duplicate top level name found: $name';
+ _exports[name] = exportName ?? name;
}
@override
@@ -2199,8 +2214,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
if (isJSTopLevel) eagerInit = true;
var fieldName = field.name.name;
+ var exportName = fieldName;
if (element is TopLevelVariableElement) {
- fieldName = _getJSExportName(element) ?? fieldName;
+ exportName = _getJSExportName(element) ?? fieldName;
}
if ((field.isConst && eagerInit && element is TopLevelVariableElement) ||
isJSTopLevel) {
@@ -2208,7 +2224,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
// but add them to the module's exports. However, make sure we generate
// anything they depend on first.
- if (isPublic(fieldName)) _addExport(fieldName);
+ if (isPublic(fieldName)) _addExport(fieldName, exportName);
var declKeyword = field.isConst || field.isFinal ? 'const' : 'let';
return annotateVariable(
js.statement(

Powered by Google App Engine
This is Rietveld 408576698