Index: dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart b/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
index 9c43ad731172856d975162919311bf4c340d5223..aaf30d7d4b78978f1f6ffaf676206507b0a6776d 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart |
@@ -77,9 +77,9 @@ class JsLibraryMirror extends JsObjectMirror implements LibraryMirror { |
Map<Symbol, ClassMirror> get classes { |
var result = new Map<Symbol, ClassMirror>(); |
- for (int i = 0; i < _classes.length; i += 2) { |
- Symbol symbol = s(_classes[i]); |
- JsClassMirror cls = reflectClassByName(symbol, _classes[i + 1]); |
+ for (String className in _classes) { |
+ Symbol symbol = s(className); |
+ JsClassMirror cls = reflectClassByName(symbol); |
result[symbol] = cls; |
cls._owner = this; |
} |
@@ -168,9 +168,9 @@ InstanceMirror reflect(Object reflectee) { |
final Expando<ClassMirror> classMirrors = new Expando<ClassMirror>(); |
-ClassMirror reflectType(Type key) => reflectClassByName(s('$key'), null); |
+ClassMirror reflectType(Type key) => reflectClassByName(s('$key')); |
-ClassMirror reflectClassByName(Symbol symbol, String fields) { |
+ClassMirror reflectClassByName(Symbol symbol) { |
String className = n(symbol); |
var constructor = Primitives.getConstructor(className); |
if (constructor == null) { |
@@ -178,9 +178,27 @@ ClassMirror reflectClassByName(Symbol symbol, String fields) { |
// TODO(ahe): How to handle intercepted classes? |
throw new UnsupportedError('Cannot find class for: $className'); |
} |
+ var descriptor = JS('', '#["@"]', constructor); |
+ var fields; |
+ var fieldsMetadata; |
+ if (descriptor == null) { |
+ // This is a native class, or an intercepted class. |
+ // TODO(ahe): Preserve descriptor for such classes. |
+ } else { |
+ fields = JS('', '#[""]', descriptor); |
+ if (fields is List) { |
+ fieldsMetadata = fields.getRange(1, fields.length).toList(); |
+ fields = fields[0]; |
+ } |
+ if (fields is! String) { |
+ // TODO(ahe): This is CSP mode. Find a way to determine the |
+ // fields of this class. |
+ fields = ''; |
+ } |
+ } |
var mirror = classMirrors[constructor]; |
if (mirror == null) { |
- mirror = new JsClassMirror(symbol, constructor, fields); |
+ mirror = new JsClassMirror(symbol, constructor, fields, fieldsMetadata); |
classMirrors[constructor] = mirror; |
} |
return mirror; |
@@ -264,11 +282,15 @@ class JsClassMirror extends JsObjectMirror implements ClassMirror { |
final Symbol simpleName; |
final _jsConstructor; |
final String _fields; |
+ final List _fieldsMetadata; |
List _metadata; |
// Set as side-effect of accessing JsLibraryMirror.classes. |
JsLibraryMirror _owner; |
- JsClassMirror(this.simpleName, this._jsConstructor, this._fields); |
+ JsClassMirror(this.simpleName, |
+ this._jsConstructor, |
+ this._fields, |
+ this._fieldsMetadata); |
Symbol get qualifiedName => computeQualifiedName(owner, simpleName); |
@@ -294,8 +316,13 @@ class JsClassMirror extends JsObjectMirror implements ClassMirror { |
var result = new Map<Symbol, VariableMirror>(); |
var s = _fields.split(";"); |
var fields = s[1] == "" ? [] : s[1].split(","); |
+ int fieldNumber = 0; |
for (String field in fields) { |
- JsVariableMirror mirror = new JsVariableMirror.from(field); |
+ var metadata; |
+ if (_fieldsMetadata != null) { |
+ metadata = _fieldsMetadata[fieldNumber++]; |
+ } |
+ JsVariableMirror mirror = new JsVariableMirror.from(field, metadata); |
result[mirror.simpleName] = mirror; |
mirror._owner = this; |
} |
@@ -388,11 +415,16 @@ class JsVariableMirror implements VariableMirror { |
final Symbol simpleName; |
final String _jsName; |
final bool _readOnly; |
+ final _metadataFunction; |
DeclarationMirror _owner; |
+ List _metadata; |
- JsVariableMirror(this.simpleName, this._jsName, this._readOnly); |
+ JsVariableMirror(this.simpleName, |
+ this._jsName, |
+ this._readOnly, |
+ this._metadataFunction); |
- factory JsVariableMirror.from(String descriptor) { |
+ factory JsVariableMirror.from(String descriptor, metadataFunction) { |
int length = descriptor.length; |
var code = fieldCode(descriptor.codeUnitAt(length - 1)); |
if (code == 0) { |
@@ -408,7 +440,8 @@ class JsVariableMirror implements VariableMirror { |
jsName = accessorName.substring(divider + 1); |
} |
bool readOnly = !hasSetter; |
- return new JsVariableMirror(s(accessorName), jsName, readOnly); |
+ return new JsVariableMirror( |
+ s(accessorName), jsName, readOnly, metadataFunction); |
} |
TypeMirror get type => JsMirrorSystem._dynamicType; |
@@ -417,6 +450,14 @@ class JsVariableMirror implements VariableMirror { |
Symbol get qualifiedName => computeQualifiedName(owner, simpleName); |
+ List<InstanceMirror> get metadata { |
+ if (_metadata == null) { |
+ _metadata = (_metadataFunction == null) |
+ ? const [] : JS('', '#()', _metadataFunction); |
+ } |
+ return _metadata.map(reflect).toList(); |
+ } |
+ |
static int fieldCode(int code) { |
if (code >= 60 && code <= 64) return code - 59; |
if (code >= 123 && code <= 126) return code - 117; |