Index: pkg/polymer/lib/src/reflected_type.dart |
diff --git a/pkg/polymer/lib/src/reflected_type.dart b/pkg/polymer/lib/src/reflected_type.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ad11ffb61f0af33c504f97c7431c71d3470e6c1a |
--- /dev/null |
+++ b/pkg/polymer/lib/src/reflected_type.dart |
@@ -0,0 +1,31 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library polymer.src.reflected_type; |
+ |
+// These are used by _getReflectedTypeWorkaround, see http://dartbug.com/12607 |
+@MirrorsUsed(targets: |
+ const ['_js_helper.createRuntimeType', 'dart._js_mirrors.JsClassMirror'], |
+ override: 'polymer.src.reflected_type') |
Siggi Cherem (dart-lang)
2013/10/15 21:52:18
ditto
Jennifer Messerly
2013/10/15 22:03:29
ditto :)
|
+import 'dart:mirrors'; |
+ |
+// Horrible hack to work around: http://dartbug.com/12607 |
+Type getReflectedTypeWorkaround(ClassMirror cls) { |
+ // On Dart VM, just return reflectedType. |
+ if (1.0 is! int) return cls.reflectedType; |
+ |
+ var mangledName = reflect(cls).getField(_mangledNameField).reflectee; |
+ Type type = _jsHelper.invoke(#createRuntimeType, [mangledName]).reflectee; |
+ return type; |
+} |
+ |
+final LibraryMirror _jsHelper = |
+ currentMirrorSystem().libraries[Uri.parse('dart:_js_helper')]; |
+ |
+final Symbol _mangledNameField = () { |
+ var jsClassMirrorMirror = reflect(reflectClass(ClassMirror)).type; |
+ for (var name in jsClassMirrorMirror.variables.keys) { |
+ if (MirrorSystem.getName(name) == '_mangledName') return name; |
+ } |
+}(); |