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

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

Issue 1071393007: fuse List and js Array together and a few other misc fixes. (Closed) Base URL: git@github.com:dart-lang/dart-dev-compiler.git@master
Patch Set: ptal Created 5 years, 8 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/dart_codegen/expect/core/list.dart » ('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 e99a23327fc4946cd455bafcd0f9a4b07fbbf9df..31821af5f895a04fd914475a411d13eaade00062 100644
--- a/lib/src/codegen/js_codegen.dart
+++ b/lib/src/codegen/js_codegen.dart
@@ -274,7 +274,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
_emitTypeName(node.element.type, lowerTypedef: true)
]);
- return _finishClassDef(type, result);
+ return _finishClassDef(type, result, null);
}
@override
@@ -292,7 +292,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
var classDecl = new JS.ClassDeclaration(
new JS.ClassExpression(new JS.Identifier(name), heritage, []));
- return _finishClassDef(type, classDecl);
+ return _finishClassDef(type, classDecl, null);
}
JS.Statement _emitJsType(String dartClassName, DartObjectImpl jsName) {
@@ -317,6 +317,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
if (_pendingClasses.remove(classElem) == null) return null;
var jsName = getAnnotationValue(node, _isJsNameAnnotation);
+
if (jsName != null) return _emitJsType(node.name.name, jsName);
var ctors = <ConstructorDeclaration>[];
@@ -336,7 +337,13 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
var body =
_finishClassMembers(classElem, classExpr, ctors, fields, staticFields);
- return _finishClassDef(type, body);
+ var jsPeer = getAnnotationValue(node, _isJsPeerInterface);
+ String jsPeerName = null;
+ if (jsPeer != null) {
+ jsPeerName = getConstantField(jsPeer, 'name', types.stringType);
+ }
+
+ return _finishClassDef(type, body, jsPeerName);
}
@override
@@ -346,7 +353,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
/// Given a class element and body, complete the class declaration.
/// This handles generic type parameters, laziness (in library-cycle cases),
/// and ensuring dependencies are loaded first.
- JS.Statement _finishClassDef(ParameterizedType type, JS.Statement body) {
+ JS.Statement _finishClassDef(
+ ParameterizedType type, JS.Statement body, String jsPeerName) {
var name = type.name;
var genericName = '$name\$';
@@ -405,6 +413,13 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
_emitClassIfNeeded(classDefs, types.functionType);
}
classDefs.add(body);
+ if (jsPeerName != null) {
+ classDefs.add(js.statement(
+ 'dart.copyProperties(dart.global.#.prototype, #.prototype);', [
+ _propertyName(jsPeerName),
+ name
+ ]));
+ }
return _statement(classDefs);
}
@@ -2333,6 +2348,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
_pendingSymbols.add(new JS.Identifier(extName));
_addExport(extName);
}
+ return new JS.Identifier(extName);
}
return js.call('#.#', [_libraryName(library), _propertyName(extName)]);
}
@@ -2425,6 +2441,9 @@ String jsOutputPath(LibraryInfo info, Uri root) {
// TODO(jmesserly): validate the library. See issue #135.
bool _isJsNameAnnotation(DartObjectImpl value) => value.type.name == 'JsName';
+bool _isJsPeerInterface(DartObjectImpl value) =>
+ value.type.name == 'JsPeerInterface';
+
// TODO(jacobr): we would like to do something like the following
// but we don't have summary support yet.
// bool _supportJsExtensionMethod(AnnotatedNode node) =>
« no previous file with comments | « lib/runtime/dart_runtime.js ('k') | test/dart_codegen/expect/core/list.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698