Index: dart/runtime/lib/mirrors_impl.dart |
diff --git a/dart/runtime/lib/mirrors_impl.dart b/dart/runtime/lib/mirrors_impl.dart |
index 6588649ba53bcea4296bdd5612118ba83cc62431..8af4ff8c35bf5aa899b27155add88dd948794c0b 100644 |
--- a/dart/runtime/lib/mirrors_impl.dart |
+++ b/dart/runtime/lib/mirrors_impl.dart |
@@ -9,20 +9,39 @@ bool _isSimpleValue(var value) { |
return (value == null || value is num || value is String || value is bool); |
} |
-Map _filterMap(Map old_map, bool filter(key, value)) { |
- Map new_map = new Map(); |
+Map _filterMap(Map<Symbol, dynamic> old_map, bool filter(Symbol key, value)) { |
+ Map new_map = new Map<Symbol, dynamic>(); |
old_map.forEach((key, value) { |
- if (filter(key, value)) { |
- new_map[key] = value; |
- } |
- }); |
+ if (filter(key, value)) { |
+ new_map[key] = value; |
+ } |
+ }); |
return new_map; |
} |
+String _n(Symbol symbol) => _collection_dev.Symbol.getName(symbol); |
+ |
+Symbol _s(String name) { |
+ if (name == null) return null; |
+ return new _collection_dev.Symbol.unvalidated(name); |
+} |
+ |
+Symbol _computeQualifiedName(DeclarationMirror owner, Symbol simpleName) { |
+ if (owner == null) return simpleName; |
+ return _s('${_n(owner.qualifiedName)}.${_n(simpleName)}'); |
+} |
+ |
+Map<Symbol, dynamic> _convertStringToSymbolMap(Map<String, dynamic> map) { |
+ if (map == null) return null; |
+ Map<Symbol, dynamic> result = new Map<Symbol, dynamic>(); |
+ map.forEach((name, value) => result[_s(name)] = value); |
+ return result; |
+} |
+ |
String _makeSignatureString(TypeMirror returnType, |
List<ParameterMirror> parameters) { |
StringBuffer buf = new StringBuffer(); |
- buf.write(returnType.qualifiedName); |
+ buf.write(_n(returnType.qualifiedName)); |
buf.write(' ('); |
bool found_optional_param = false; |
for (int i = 0; i < parameters.length; i++) { |
@@ -31,7 +50,7 @@ String _makeSignatureString(TypeMirror returnType, |
buf.write('['); |
found_optional_param = true; |
} |
- buf.write(param.type.qualifiedName); |
+ buf.write(_n(param.type.qualifiedName)); |
if (i < (parameters.length - 1)) { |
buf.write(', '); |
} |
@@ -44,10 +63,13 @@ String _makeSignatureString(TypeMirror returnType, |
} |
class _LocalMirrorSystemImpl implements MirrorSystem { |
- _LocalMirrorSystemImpl(this.libraries, this.isolate) |
- : _functionTypes = new Map<String, FunctionTypeMirror>() {} |
+ // TODO(ahe): [libraries] should be Map<Uri, LibraryMirror>. |
+ // Change parameter back to "this.libraries" when native code is changed. |
+ _LocalMirrorSystemImpl(Map<String, LibraryMirror> libraries, this.isolate) |
Søren Gjesse
2013/04/15 14:08:31
Four space indent - more below.
ahe
2013/04/15 14:29:55
Done.
|
+ : _functionTypes = new Map<String, FunctionTypeMirror>(), |
+ this.libraries = _convertStringToSymbolMap(libraries); |
- final Map<String, LibraryMirror> libraries; |
+ final Map<Symbol, LibraryMirror> libraries; |
final IsolateMirror isolate; |
TypeMirror _dynamicType = null; |
@@ -139,10 +161,10 @@ abstract class _LocalVMObjectMirrorImpl extends _LocalMirrorImpl { |
abstract class _LocalObjectMirrorImpl extends _LocalVMObjectMirrorImpl |
implements ObjectMirror { |
_LocalObjectMirrorImpl(ref) : super(ref) {} |
- |
-Future<InstanceMirror> invokeAsync(String memberName, |
- List positionalArguments, |
- [Map<String,dynamic> namedArguments]) { |
+ |
+ Future<InstanceMirror> invokeAsync(Symbol memberName, |
+ List positionalArguments, |
+ [Map<Symbol, dynamic> namedArguments]) { |
if (namedArguments != null) { |
throw new UnimplementedError( |
'named argument support is not implemented'); |
@@ -155,29 +177,29 @@ Future<InstanceMirror> invokeAsync(String memberName, |
Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); |
try { |
completer.complete( |
- _invoke(this, memberName, positionalArguments)); |
+ _invoke(this, _n(memberName), positionalArguments)); |
} catch (exception, s) { |
completer.completeError(exception, s); |
} |
return completer.future; |
} |
- Future<InstanceMirror> getFieldAsync(String fieldName) { |
+ Future<InstanceMirror> getFieldAsync(Symbol fieldName) { |
Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); |
try { |
- completer.complete(_getField(this, fieldName)); |
+ completer.complete(_getField(this, _n(fieldName))); |
} catch (exception, s) { |
completer.completeError(exception, s); |
} |
return completer.future; |
} |
- Future<InstanceMirror> setFieldAsync(String fieldName, Object arg) { |
+ Future<InstanceMirror> setFieldAsync(Symbol fieldName, Object arg) { |
_validateArgument(0, arg); |
Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); |
try { |
- completer.complete(_setField(this, fieldName, arg)); |
+ completer.complete(_setField(this, _n(fieldName), arg)); |
} catch (exception, s) { |
completer.completeError(exception, s); |
} |
@@ -304,7 +326,7 @@ class _LocalClosureMirrorImpl extends _LocalInstanceMirrorImpl |
} |
Future<InstanceMirror> applyAsync(List<Object> positionalArguments, |
- [Map<String,Object> namedArguments]) { |
+ [Map<Symbol, Object> namedArguments]) { |
if (namedArguments != null) { |
throw new UnimplementedError( |
'named argument support is not implemented'); |
@@ -324,7 +346,7 @@ class _LocalClosureMirrorImpl extends _LocalInstanceMirrorImpl |
return completer.future; |
} |
- Future<InstanceMirror> findInContext(String name) { |
+ Future<InstanceMirror> findInContext(Symbol name) { |
throw new UnimplementedError( |
'ClosureMirror.findInContext() is not implemented'); |
} |
@@ -334,13 +356,15 @@ class _LocalClosureMirrorImpl extends _LocalInstanceMirrorImpl |
} |
class _LazyTypeMirror { |
- _LazyTypeMirror(this.libraryName, this.typeName) {} |
+ _LazyTypeMirror(String libraryName, String typeName) |
+ : this.libraryName = _s(libraryName), |
+ this.typeName = _s(typeName); |
TypeMirror resolve(MirrorSystem mirrors) { |
if (libraryName == null) { |
- if (typeName == 'dynamic') { |
+ if (typeName == const Symbol('dynamic')) { |
return mirrors.dynamicType; |
- } else if (typeName == 'void') { |
+ } else if (typeName == const Symbol('void')) { |
return mirrors.voidType; |
} else { |
throw new UnimplementedError( |
@@ -355,35 +379,34 @@ class _LazyTypeMirror { |
return resolved; |
} |
- final String libraryName; |
- final String typeName; |
+ final Symbol libraryName; |
+ final Symbol typeName; |
} |
class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
implements ClassMirror { |
_LocalClassMirrorImpl(ref, |
- this.simpleName, |
+ String simpleName, |
this.isClass, |
this._owner, |
this._superclass, |
this._superinterfaces, |
this._defaultFactory, |
- this.members, |
- this.constructors, |
- this.typeVariables) : super(ref) {} |
- |
- final String simpleName; |
- |
- String _qualifiedName = null; |
- String get qualifiedName { |
- if (_owner != null) { |
- if (_qualifiedName == null) { |
- _qualifiedName = '${owner.qualifiedName}.${simpleName}'; |
- } |
- } else { |
- // The owner of a ClassMirror is null in certain odd cases, like |
- // 'void', 'dynamic' and function type mirrors. |
- _qualifiedName = simpleName; |
+ Map<String, Mirror> members, |
+ Map<String, Mirror> constructors, |
+ Map<String, Mirror> typeVariables) |
+ : this.simpleName = _s(simpleName), |
+ this.members = _convertStringToSymbolMap(members), |
+ this.constructors = _convertStringToSymbolMap(constructors), |
+ this.typeVariables = _convertStringToSymbolMap(typeVariables), |
+ super(ref); |
+ |
+ final Symbol simpleName; |
+ |
+ Symbol _qualifiedName = null; |
+ Symbol get qualifiedName { |
+ if (_qualifiedName == null) { |
+ _qualifiedName = _computeQualifiedName(owner, simpleName); |
} |
return _qualifiedName; |
} |
@@ -396,7 +419,7 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
return _owner; |
} |
- bool get isPrivate => simpleName.startsWith('_'); |
+ bool get isPrivate => _n(simpleName).startsWith('_'); |
final bool isTopLevel = true; |
@@ -436,14 +459,14 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
return _defaultFactory; |
} |
- final Map<String, Mirror> members; |
+ final Map<Symbol, Mirror> members; |
- Map<String, MethodMirror> _methods = null; |
- Map<String, MethodMirror> _getters = null; |
- Map<String, MethodMirror> _setters = null; |
- Map<String, VariableMirror> _variables = null; |
+ Map<Symbol, MethodMirror> _methods = null; |
+ Map<Symbol, MethodMirror> _getters = null; |
+ Map<Symbol, MethodMirror> _setters = null; |
+ Map<Symbol, VariableMirror> _variables = null; |
- Map<String, MethodMirror> get methods { |
+ Map<Symbol, MethodMirror> get methods { |
if (_methods == null) { |
_methods = _filterMap( |
members, |
@@ -452,7 +475,7 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
return _methods; |
} |
- Map<String, MethodMirror> get getters { |
+ Map<Symbol, MethodMirror> get getters { |
if (_getters == null) { |
_getters = _filterMap( |
members, |
@@ -461,7 +484,7 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
return _getters; |
} |
- Map<String, MethodMirror> get setters { |
+ Map<Symbol, MethodMirror> get setters { |
if (_setters == null) { |
_setters = _filterMap( |
members, |
@@ -470,7 +493,7 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
return _setters; |
} |
- Map<String, VariableMirror> get variables { |
+ Map<Symbol, VariableMirror> get variables { |
if (_variables == null) { |
_variables = _filterMap( |
members, |
@@ -479,10 +502,10 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
return _variables; |
} |
- Map<String, MethodMirror> constructors; |
- Map<String, TypeVariableMirror> typeVariables; |
+ Map<Symbol, MethodMirror> constructors; |
+ Map<Symbol, TypeVariableMirror> typeVariables; |
- Map<String, TypeMirror> get typeArguments { |
+ Map<Symbol, TypeMirror> get typeArguments { |
throw new UnimplementedError( |
'ClassMirror.typeArguments is not implemented'); |
} |
@@ -499,9 +522,9 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
String toString() => "ClassMirror on '$simpleName'"; |
- Future<InstanceMirror> newInstanceAsync(String constructorName, |
+ Future<InstanceMirror> newInstanceAsync(Symbol constructorName, |
List positionalArguments, |
- [Map<String,dynamic> namedArguments]) { |
+ [Map<Symbol, dynamic> namedArguments]) { |
if (namedArguments != null) { |
throw new UnimplementedError( |
'named argument support is not implemented'); |
@@ -514,7 +537,7 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
Completer<InstanceMirror> completer = new Completer<InstanceMirror>(); |
try { |
completer.complete( |
- _invokeConstructor(this, constructorName, positionalArguments)); |
+ _invokeConstructor(this, _n(constructorName), positionalArguments)); |
} catch (exception) { |
completer.completeError(exception); |
} |
@@ -569,28 +592,31 @@ class _LocalFunctionTypeMirrorImpl extends _LocalClassMirrorImpl |
class _LazyTypeVariableMirror { |
- _LazyTypeVariableMirror(this._variableName, this._owner) {} |
+ _LazyTypeVariableMirror(String variableName, this._owner) |
+ : this._variableName = _s(variableName); |
TypeVariableMirror resolve(MirrorSystem mirrors) { |
ClassMirror owner = _owner.resolve(mirrors); |
return owner.typeVariables[_variableName]; |
} |
- final String _variableName; |
+ final Symbol _variableName; |
final _LazyTypeMirror _owner; |
} |
class _LocalTypeVariableMirrorImpl extends _LocalMirrorImpl |
implements TypeVariableMirror { |
- _LocalTypeVariableMirrorImpl(this.simpleName, |
+ _LocalTypeVariableMirrorImpl(String simpleName, |
this._owner, |
- this._upperBound) {} |
- final String simpleName; |
+ this._upperBound) |
+ : this.simpleName = _s(simpleName); |
- String _qualifiedName = null; |
- String get qualifiedName { |
+ final Symbol simpleName; |
+ |
+ Symbol _qualifiedName = null; |
+ Symbol get qualifiedName { |
if (_qualifiedName == null) { |
- _qualifiedName = '${owner.qualifiedName}.${simpleName}'; |
+ _qualifiedName = _computeQualifiedName(owner, simpleName); |
} |
return _qualifiedName; |
} |
@@ -626,15 +652,17 @@ class _LocalTypeVariableMirrorImpl extends _LocalMirrorImpl |
class _LocalTypedefMirrorImpl extends _LocalMirrorImpl |
implements TypedefMirror { |
- _LocalTypedefMirrorImpl(this.simpleName, |
+ _LocalTypedefMirrorImpl(String simpleName, |
this._owner, |
- this._referent) {} |
- final String simpleName; |
+ this._referent) |
+ : this.simpleName = _s(simpleName); |
+ |
+ final Symbol simpleName; |
- String _qualifiedName = null; |
- String get qualifiedName { |
+ Symbol _qualifiedName = null; |
+ Symbol get qualifiedName { |
if (_qualifiedName == null) { |
- _qualifiedName = '${owner.qualifiedName}.${simpleName}'; |
+ _qualifiedName = _computeQualifiedName(owner, simpleName); |
} |
return _qualifiedName; |
} |
@@ -669,26 +697,30 @@ class _LocalTypedefMirrorImpl extends _LocalMirrorImpl |
class _LazyLibraryMirror { |
- _LazyLibraryMirror(this.libraryName) {} |
+ _LazyLibraryMirror(String libraryName) |
+ : this.libraryName = _s(libraryName); |
LibraryMirror resolve(MirrorSystem mirrors) { |
return mirrors.libraries[libraryName]; |
} |
- final String libraryName; |
+ final Symbol libraryName; |
} |
class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
implements LibraryMirror { |
_LocalLibraryMirrorImpl(ref, |
- this.simpleName, |
+ String simpleName, |
this.url, |
- this.members) : super(ref) {} |
+ Map<String, Mirror> members) |
+ : this.simpleName = _s(simpleName), |
+ this.members = _convertStringToSymbolMap(members), |
+ super(ref); |
- final String simpleName; |
+ final Symbol simpleName; |
// The simple name and the qualified name are the same for a library. |
- String get qualifiedName => simpleName; |
+ Symbol get qualifiedName => simpleName; |
// Always null for libraries. |
final DeclarationMirror owner = null; |
@@ -705,15 +737,15 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
} |
final String url; |
- final Map<String, Mirror> members; |
+ final Map<Symbol, Mirror> members; |
- Map<String, ClassMirror> _classes = null; |
- Map<String, MethodMirror> _functions = null; |
- Map<String, MethodMirror> _getters = null; |
- Map<String, MethodMirror> _setters = null; |
- Map<String, VariableMirror> _variables = null; |
+ Map<Symbol, ClassMirror> _classes = null; |
+ Map<Symbol, MethodMirror> _functions = null; |
+ Map<Symbol, MethodMirror> _getters = null; |
+ Map<Symbol, MethodMirror> _setters = null; |
+ Map<Symbol, VariableMirror> _variables = null; |
- Map<String, ClassMirror> get classes { |
+ Map<Symbol, ClassMirror> get classes { |
if (_classes == null) { |
_classes = _filterMap(members, |
(key, value) => (value is ClassMirror)); |
@@ -721,7 +753,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
return _classes; |
} |
- Map<String, MethodMirror> get functions { |
+ Map<Symbol, MethodMirror> get functions { |
if (_functions == null) { |
_functions = _filterMap(members, |
(key, value) => (value is MethodMirror)); |
@@ -729,7 +761,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
return _functions; |
} |
- Map<String, MethodMirror> get getters { |
+ Map<Symbol, MethodMirror> get getters { |
if (_getters == null) { |
_getters = _filterMap(functions, |
(key, value) => (value.isGetter)); |
@@ -737,7 +769,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
return _getters; |
} |
- Map<String, MethodMirror> get setters { |
+ Map<Symbol, MethodMirror> get setters { |
if (_setters == null) { |
_setters = _filterMap(functions, |
(key, value) => (value.isSetter)); |
@@ -745,7 +777,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
return _setters; |
} |
- Map<String, VariableMirror> get variables { |
+ Map<Symbol, VariableMirror> get variables { |
if (_variables == null) { |
_variables = _filterMap(members, |
(key, value) => (value is VariableMirror)); |
@@ -758,7 +790,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
class _LocalMethodMirrorImpl extends _LocalMirrorImpl |
implements MethodMirror { |
- _LocalMethodMirrorImpl(this.simpleName, |
+ _LocalMethodMirrorImpl(String simpleName, |
this._owner, |
this.parameters, |
this._returnType, |
@@ -770,14 +802,15 @@ class _LocalMethodMirrorImpl extends _LocalMirrorImpl |
this.isConstConstructor, |
this.isGenerativeConstructor, |
this.isRedirectingConstructor, |
- this.isFactoryConstructor) {} |
+ this.isFactoryConstructor) |
+ : this.simpleName = _s(simpleName); |
- final String simpleName; |
+ final Symbol simpleName; |
- String _qualifiedName = null; |
- String get qualifiedName { |
+ Symbol _qualifiedName = null; |
+ Symbol get qualifiedName { |
if (_qualifiedName == null) { |
- _qualifiedName = '${owner.qualifiedName}.${simpleName}'; |
+ _qualifiedName = _computeQualifiedName(owner, simpleName); |
} |
return _qualifiedName; |
} |
@@ -791,7 +824,8 @@ class _LocalMethodMirrorImpl extends _LocalMirrorImpl |
} |
bool get isPrivate { |
- return simpleName.startsWith('_') || constructorName.startsWith('_'); |
+ return _n(simpleName).startsWith('_') || |
+ _n(constructorName).startsWith('_'); |
} |
bool get isTopLevel => owner is LibraryMirror; |
@@ -825,21 +859,21 @@ class _LocalMethodMirrorImpl extends _LocalMirrorImpl |
final bool isSetter; |
final bool isConstructor; |
- var _constructorName = null; |
- String get constructorName { |
+ Symbol _constructorName = null; |
+ Symbol get constructorName { |
if (_constructorName == null) { |
if (!isConstructor) { |
- _constructorName = ''; |
+ _constructorName = _s(''); |
} else { |
- var parts = simpleName.split('.'); |
+ var parts = _n(simpleName).split('.'); |
if (parts.length > 2) { |
throw new MirrorException( |
'Internal error in MethodMirror.constructorName: ' |
'malformed name <$simpleName>'); |
} else if (parts.length == 2) { |
- _constructorName = parts[1]; |
+ _constructorName = _s(parts[1]); |
} else { |
- _constructorName = ''; |
+ _constructorName = _s(''); |
} |
} |
} |
@@ -856,18 +890,19 @@ class _LocalMethodMirrorImpl extends _LocalMirrorImpl |
class _LocalVariableMirrorImpl extends _LocalMirrorImpl |
implements VariableMirror { |
- _LocalVariableMirrorImpl(this.simpleName, |
+ _LocalVariableMirrorImpl(String simpleName, |
this._owner, |
this._type, |
this.isStatic, |
- this.isFinal) {} |
+ this.isFinal) |
+ : this.simpleName = _s(simpleName); |
- final String simpleName; |
+ final Symbol simpleName; |
- String _qualifiedName = null; |
- String get qualifiedName { |
+ Symbol _qualifiedName = null; |
+ Symbol get qualifiedName { |
if (_qualifiedName == null) { |
- _qualifiedName = '${owner.qualifiedName}.${simpleName}'; |
+ _qualifiedName = _computeQualifiedName(owner, simpleName); |
} |
return _qualifiedName; |
} |
@@ -881,7 +916,7 @@ class _LocalVariableMirrorImpl extends _LocalMirrorImpl |
} |
bool get isPrivate { |
- return simpleName.startsWith('_'); |
+ return _n(simpleName).startsWith('_'); |
} |
bool get isTopLevel { |