Chromium Code Reviews| Index: dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart b/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
| index fda0709db1ee6cafdc2bc44eb7073bc6d25f4daf..6709df0cd3b8f5f2b2d71d2753b6912d85bd6d8c 100644 |
| --- a/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
| +++ b/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
| @@ -38,7 +38,7 @@ class _MirrorSystem implements MirrorSystem { |
| List<String> classes = data[2]; |
| List<String> functions = data[3]; |
| var libraries = result.putIfAbsent(name, () => <LibraryMirror>[]); |
| - libraries.add(new _LibraryMirror(name, uri, classes, functions)); |
| + libraries.add(new _LibraryMirror(_s(name), uri, classes, functions)); |
| } |
| return result; |
| } |
| @@ -50,12 +50,14 @@ class _TypeMirror implements TypeMirror { |
| } |
| class _LibraryMirror extends _ObjectMirror implements LibraryMirror { |
| - final String _name; |
| + final Symbol simpleName; |
| final Uri uri; |
| final List<String> _classes; |
| final List<String> _functions; |
| - _LibraryMirror(this._name, this.uri, this._classes, this._functions); |
| + _LibraryMirror(this.simpleName, this.uri, this._classes, this._functions); |
| + |
| + Symbol get qualifiedName => simpleName; |
| Map<Symbol, ClassMirror> get classes { |
| var result = new Map<Symbol, ClassMirror>(); |
| @@ -78,6 +80,51 @@ class _LibraryMirror extends _ObjectMirror implements LibraryMirror { |
| // TODO(ahe): This is extremely dangerous!!! |
| return _reflect(JS('', r'$[#]', _n(fieldName))); |
| } |
| + |
| + Map<Symbol, MethodMirror> get functions { |
| + var result = new Map<Symbol, MethodMirror>(); |
| + for (int i = 0; i < _functions.length; i++) { |
| + String name = _functions[i]; |
| + Symbol symbol = _s(name); |
| + int parameterCount = null; // TODO(ahe): Compute this. |
| + _MethodMirror mirror = |
| + new _MethodMirror(symbol, JS('', r'$[#]', name), parameterCount); |
|
kasperl
2013/05/27 12:15:33
Create helpers for reading and writing to fields o
ahe
2013/05/27 13:55:55
Added TODO (a big cleanup).
|
| + // TODO(ahe): Cache mirrors. |
| + result[symbol] = mirror; |
| + mirror._owner = this; |
| + } |
| + return result; |
| + } |
| + |
| + Map<Symbol, MethodMirror> get getters { |
| + var result = new Map<Symbol, MethodMirror>(); |
| + // TODO(ahe): Implement this. |
| + return result; |
| + } |
| + |
| + Map<Symbol, MethodMirror> get setters { |
| + var result = new Map<Symbol, MethodMirror>(); |
| + // TODO(ahe): Implement this. |
| + return result; |
| + } |
| + |
| + Map<Symbol, VariableMirror> get variables { |
| + var result = new Map<Symbol, VariableMirror>(); |
| + // TODO(ahe): Implement this. |
| + return result; |
| + } |
| + |
| + Map<Symbol, Mirror> get members { |
| + Map<Symbol, Mirror> result = new Map<Symbol, Mirror>.from(classes); |
| + addToResult(Symbol key, Mirror value) { |
| + result[key] = value; |
| + } |
| + functions.forEach(addToResult); |
| + getters.forEach(addToResult); |
| + setters.forEach(addToResult); |
| + variables.forEach(addToResult); |
| + return result; |
| + } |
| } |
| String _n(Symbol symbol) => _symbol_dev.Symbol.getName(symbol); |
| @@ -212,17 +259,49 @@ class _ClassMirror extends _ObjectMirror implements ClassMirror { |
| _ClassMirror(this.simpleName, this._jsConstructor, this._fields); |
| - Map<Symbol, Mirror> get members { |
| - var result = new Map<Symbol, Mirror>(); |
| + Symbol get qualifiedName => _computeQualifiedName(owner, simpleName); |
| + |
| + Map<Symbol, MethodMirror> get functions { |
| + var result = new Map<Symbol, MethodMirror>(); |
| + // TODO(ahe): Implement this. |
| + return result; |
| + } |
| + |
| + Map<Symbol, MethodMirror> get getters { |
| + var result = new Map<Symbol, MethodMirror>(); |
| + // TODO(ahe): Implement this. |
| + return result; |
| + } |
| + |
| + Map<Symbol, MethodMirror> get setters { |
| + var result = new Map<Symbol, MethodMirror>(); |
| + // TODO(ahe): Implement this. |
| + return result; |
| + } |
| + |
| + Map<Symbol, VariableMirror> get variables { |
| + var result = new Map<Symbol, VariableMirror>(); |
| var s = _fields.split(";"); |
| var fields = s[1] == "" ? [] : s[1].split(","); |
| for (String field in fields) { |
| _VariableMirror mirror = new _VariableMirror.from(field); |
| result[mirror.simpleName] = mirror; |
| + mirror._owner = this; |
| } |
| return result; |
| } |
| + Map<Symbol, Mirror> get members { |
| + Map<Symbol, Mirror> result = new Map<Symbol, Mirror>.from(functions); |
| + addToResult(Symbol key, Mirror value) { |
| + result[key] = value; |
| + } |
| + getters.forEach(addToResult); |
| + setters.forEach(addToResult); |
| + variables.forEach(addToResult); |
| + return result; |
| + } |
| + |
| InstanceMirror setField(Symbol fieldName, Object arg) { |
| // TODO(ahe): This is extremely dangerous!!! |
| JS('void', r'$[#] = #', '${_n(simpleName)}_${_n(fieldName)}', arg); |
| @@ -287,6 +366,7 @@ class _VariableMirror implements VariableMirror { |
| final Symbol simpleName; |
| final String _jsName; |
| final bool _readOnly; |
| + DeclarationMirror _owner; |
| _VariableMirror(this.simpleName, this._jsName, this._readOnly); |
| @@ -311,6 +391,10 @@ class _VariableMirror implements VariableMirror { |
| TypeMirror get type => _MirrorSystem._dynamicType; |
| + DeclarationMirror get owner => _owner; |
| + |
| + Symbol get qualifiedName => _computeQualifiedName(owner, simpleName); |
| + |
| static int fieldCode(int code) { |
| if (code >= 60 && code <= 64) return code - 59; |
| if (code >= 123 && code <= 126) return code - 117; |
| @@ -338,7 +422,7 @@ function(reflectee) { |
| } |
| var jsFunction = JS('', '#[#]', reflectee, callName); |
| int parameterCount = int.parse(callName.split(r'$')[1]); |
| - return new _MethodMirror(jsFunction, parameterCount); |
| + return new _MethodMirror(_s(callName), jsFunction, parameterCount); |
| } |
| InstanceMirror apply(List positionalArguments, |
| @@ -355,13 +439,24 @@ function(reflectee) { |
| } |
| class _MethodMirror implements MethodMirror { |
| + final Symbol simpleName; |
| final _jsFunction; |
| final int _parameterCount; |
| + DeclarationMirror _owner; |
| - _MethodMirror(this._jsFunction, this._parameterCount); |
| + _MethodMirror(this.simpleName, this._jsFunction, this._parameterCount); |
| List<ParameterMirror> get parameters { |
| // TODO(ahe): Fill the list with parameter mirrors. |
| return new List<ParameterMirror>(_parameterCount); |
| } |
| + |
| + DeclarationMirror get owner => _owner; |
| + |
| + Symbol get qualifiedName => _computeQualifiedName(owner, simpleName); |
| +} |
| + |
| +Symbol _computeQualifiedName(DeclarationMirror owner, Symbol simpleName) { |
| + if (owner == null || _n(owner.qualifiedName) == '') return simpleName; |
|
kasperl
2013/05/27 12:15:33
Consider using ? :.
ahe
2013/05/27 13:55:55
Did something else :-)
|
| + return _s('${_n(owner.qualifiedName)}.${_n(simpleName)}'); |
| } |