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

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

Issue 1341963003: qualify core types: Object, Error, Symbol (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 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/codegen/js_codegen.dart
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
index 048bb5c8508f6633a0b5a295e4f98eedc4740c58..87db3c5e1cc0cf239380317713201323b7610651 100644
--- a/lib/src/codegen/js_codegen.dart
+++ b/lib/src/codegen/js_codegen.dart
@@ -291,19 +291,11 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
}
JS.Identifier _initSymbol(JS.Identifier id) {
- var s = js.statement('let # = $_SYMBOL(#);', [id, js.string(id.name, "'")]);
+ var s = js.statement('let # = Symbol(#);', [id, js.string(id.name, "'")]);
_moduleItems.add(s);
return id;
}
- // TODO(jmesserly): this is a temporary workaround for `Symbol` in core,
- // until we have better name tracking.
- String get _SYMBOL {
- var name = currentLibrary.name;
- if (name == 'dart.core' || name == 'dart._internal') return 'dart.JsSymbol';
- return 'Symbol';
- }
-
bool isPublic(String name) => !name.startsWith('_');
@override
@@ -551,13 +543,34 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
[_exportsVar, _propertyName(name), body, name]);
}
- if (isPublic(name)) _addExport(name);
-
if (genericDef != null) {
var dynType = fillDynamicTypeArgs(type, types);
var genericInst = _emitTypeName(dynType, lowerGeneric: true);
- return js.statement('{ #; let # = #; }', [genericDef, name, genericInst]);
+
+ if (_isJsBuiltinName(name)) {
ochafik 2015/09/15 18:05:17 nit: store as a var above for reuse below?
+ genericInst = js.statement('#.# = #;',
+ [_libraryName(type.element.library), name, genericInst]);
ochafik 2015/09/15 18:05:17 nit: isn't this guaranteed to be currentLibrary?
+ } else {
+ if (isPublic(name)) _addExport(name);
+ genericInst = js.statement('let # = #;', [name, genericInst]);
+ }
+
+ return new JS.Block([genericDef, genericInst]);
}
+
+ if (_isJsBuiltinName(name)) {
+ var typeName = _emitTypeName(type) as JS.PropertyAccess;
+
+ // TODO(jmesserly): we could generate something cleaner, but since it only
+ // affects 3 types, doesn't seem like a big concern.
+ var classExpr = new JS.Call(
+ new JS.ArrowFun([], js.statement('{ #; return #; }', [body, name])),
+ []);
+ return new JS.Assignment(typeName, classExpr).toStatement();
+ } else if (isPublic(name)) {
+ _addExport(name);
+ }
+
return body;
}
@@ -655,7 +668,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
// Otherwise, emit the adapter method, which wraps the Dart iterator in
// an ES6 iterator.
return new JS.Method(
- js.call('$_SYMBOL.iterator'),
+ js.call('Symbol.iterator'),
js.call('function() { return new dart.JsIterator(this.#); }',
[_emitMemberName('iterator', type: t)]) as JS.Fun);
}
@@ -1655,13 +1668,30 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator {
// Mutable top-level fields should always be qualified.
bool mutableTopLevel = e is TopLevelVariableElement && !e.isConst;
- if (e.library != currentLibrary || mutableTopLevel) {
+ if (e.library != currentLibrary ||
+ mutableTopLevel ||
+ _isJsBuiltinName(e.name)) {
ochafik 2015/09/15 18:05:17 I think that check alone (in the context of "exten
return new JS.PropertyAccess(libName, name);
}
return idTable.putIfAbsent(e, () => new JS.MaybeQualifiedId(libName, name));
}
+ /// Returns true if this name is Object, Error, or Symbol.
+ ///
+ /// We avoid using those names as locals so we don't shadow the global JS
+ /// names. While we could technically deal with this, it confuses other tools
+ /// like JS Compiler.
+ bool _isJsBuiltinName(String name) {
+ switch (name) {
+ case 'Object':
+ case 'Error':
+ case 'Symbol':
ochafik 2015/09/15 16:58:33 Presumably also Map, Set, TypeError, RangeError, R
Jennifer Messerly 2015/09/15 17:06:09 Maybe I need to step back, I honestly don't have a
ochafik 2015/09/15 18:05:17 Right now it's just to avoid errors in Closure wit
Jennifer Messerly 2015/09/15 18:34:23 ah, we try and qualify the minimum possible. In fa
+ return true;
+ }
+ return false;
+ }
+
@override
JS.Expression visitAssignmentExpression(AssignmentExpression node) {
var left = node.leftHandSide;

Powered by Google App Engine
This is Rietveld 408576698