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

Unified Diff: lib/src/mirrors.dart

Issue 615913004: Add @jsify annotation. Support automatically proxying Lists and Maps to Dart in Proxies. Support co… (Closed) Base URL: https://github.com/dart-lang/js-interop.git@master
Patch Set: Created 6 years, 2 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/mirrors.dart
diff --git a/lib/src/mirrors.dart b/lib/src/mirrors.dart
index 92ac6a0551309e22590d2d23c6167466f5c3fbab..0fe6eb6293da273efb20760ad2a13c4554f35a5e 100644
--- a/lib/src/mirrors.dart
+++ b/lib/src/mirrors.dart
@@ -12,14 +12,16 @@ import 'dart:js' as js;
import 'dart:mirrors';
import 'dart:mirrors' as mirrors;
-import 'package:js/src/metadata.dart';
+import 'package:js/src/metadata.dart' as metadata;
import 'package:js/src/js_elements.dart';
import 'package:js/src/js_impl.dart' as jsi;
import 'package:js/src/js_impl.dart';
// This is the public interface of js.dart
// The exports must match those in static.dart
-export 'package:js/src/js_impl.dart' hide JsInterface;
+// JsInterface is not include to show the version defined here
+export 'package:js/src/js_impl.dart' show JsGlobal, toJs, toDart,
+ registerJsConstructorForType, registerFactoryForJsConstructor;
export 'dart:js' show JsObject;
export 'package:js/src/metadata.dart';
@@ -49,7 +51,7 @@ initializeJavaScript() {
var classes = library.declarations.values.where((d) => d is ClassMirror);
for (ClassMirror clazz in classes) {
- JsProxy jsProxyAnnotation = _getJsProxyAnnotation(clazz);
+ metadata.JsProxy jsProxyAnnotation = _getJsProxyAnnotation(clazz);
if (jsProxyAnnotation != null && jsProxyAnnotation.constructor != null) {
_registerProxy(clazz, jsProxyAnnotation);
}
@@ -135,7 +137,7 @@ void _addExportedConstructors(ClassMirror clazz, ExportedClass c) {
}
}
-void _registerProxy(ClassMirror clazz, JsProxy jsProxyAnnotation) {
+void _registerProxy(ClassMirror clazz, metadata.JsProxy jsProxyAnnotation) {
var constructorExpr = jsProxyAnnotation.constructor;
var createdConstructor = clazz.declarations[#created];
jsi.registerFactoryForJsConstructor(
@@ -148,7 +150,7 @@ _exportLibrary(ExportedLibrary library, JsObject parent) {
var parts = library.name.split('.');
parts.forEach((p) {
if (!libraryJsObj.hasProperty(p)) {
- libraryJsObj = libraryJsObj[p] = new JsObject.jsify({});
+ libraryJsObj = libraryJsObj[p] = new JsObject(_obj);
} else {
libraryJsObj = libraryJsObj[p];
}
@@ -283,15 +285,17 @@ class _CallbackFunction implements Function {
}
}
-Export _getExportAnnotation(DeclarationMirror d) {
- var m = d.metadata.firstWhere((m) => m.type.reflectedType == Export,
- orElse: () => null);
+metadata.Export _getExportAnnotation(DeclarationMirror d) {
+ var m = d.metadata
+ .firstWhere((m) => m.type.reflectedType == metadata.Export,
+ orElse: () => null);
return m == null ? null : m.reflectee;
}
-NoExport _getNoExportAnnotation(DeclarationMirror d) {
- var m = d.metadata.firstWhere((m) => m.type.reflectedType == NoExport,
- orElse: () => null);
+metadata.NoExport _getNoExportAnnotation(DeclarationMirror d) {
+ var m = d.metadata
+ .firstWhere((m) => m.type.reflectedType == metadata.NoExport,
+ orElse: () => null);
return m == null ? null : m.reflectee;
}
@@ -350,43 +354,58 @@ class JsInterface extends jsi.JsInterface {
}
}
- dynamic noSuchMethod(Invocation i) {
+ dynamic noSuchMethod(Invocation invocation) {
var mirror = mirrors.reflect(this);
- var decl = getDeclaration(mirror.type, i.memberName);
+ var decl = getDeclaration(mirror.type, invocation.memberName);
if (decl != null) {
mirrors.MethodMirror method = decl;
- String name = mirrors.MirrorSystem.getName(i.memberName);
- if (i.isGetter) {
+ String name = mirrors.MirrorSystem.getName(invocation.memberName);
+ if (invocation.isGetter) {
var o = toDart(toJs(this)[name]);
assert(o == null ||
mirrors.reflect(o).type.isSubtypeOf(method.returnType));
return o;
}
- if (i.isSetter) {
+ if (invocation.isSetter) {
// remove the trailing '=' from the setter name
name = name.substring(0, name.length - 1);
- var v = toJs(i.positionalArguments[0]);
+ var v = toJs(invocation.positionalArguments[0]);
toJs(this)[name] = v;
return null;
}
- if (i.isMethod) {
- var jsArgs = i.positionalArguments.map(toJs).toList();
- var o = toDart(toJs(this).callMethod(name, jsArgs));
+ if (invocation.isMethod) {
+ MethodMirror m = decl;
+ var positionalParams = m.parameters.where((p) => !p.isNamed).toList();
+ var positionalArgs = invocation.positionalArguments;
+ var jsArgs = new List(positionalArgs.length);
+ for (int i = 0; i < positionalArgs.length; i++) {
+ var param = positionalParams[i];
+ var arg = positionalArgs[i];
+ var hasJsify = param.metadata.any((m) => m.reflectee == metadata.jsify);
Siggi Cherem (dart-lang) 2014/10/07 20:41:41 80
justinfagnani 2014/10/08 06:30:02 Done.
+ if (hasJsify) {
+ jsArgs[i] = jsify(arg);
+ } else {
+ jsArgs[i] = toJs(arg);
+ }
+ }
+ var returnType = m.returnType.hasReflectedType
+ ? m.returnType.originalDeclaration.simpleName
+ : null;
+ var o = toDart(toJs(this).callMethod(name, jsArgs), returnType);
assert(o == null ||
mirrors.reflect(o).type.isSubtypeOf(method.returnType));
return o;
}
assert(false);
}
- return super.noSuchMethod(i);
+ return super.noSuchMethod(invocation);
}
}
-JsProxy _getJsProxyAnnotation(ClassMirror c) {
- var jsProxyAnnotationMirror =
- c.metadata
- .firstWhere((i) => i.reflectee is JsProxy, orElse: () => null);
+metadata.JsProxy _getJsProxyAnnotation(ClassMirror c) {
+ var jsProxyAnnotationMirror = c.metadata
+ .firstWhere((i) => i.reflectee is metadata.JsProxy, orElse: () => null);
if (jsProxyAnnotationMirror == null) return null;
« lib/src/js_list.dart ('K') | « lib/src/metadata.dart ('k') | lib/src/static.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698