| Index: runtime/lib/mirrors_impl.dart
|
| ===================================================================
|
| --- runtime/lib/mirrors_impl.dart (revision 9490)
|
| +++ runtime/lib/mirrors_impl.dart (working copy)
|
| @@ -9,6 +9,16 @@
|
| 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();
|
| + old_map.forEach((key, value) {
|
| + if (filter(key, value)) {
|
| + new_map[key] = value;
|
| + }
|
| + });
|
| + return new_map;
|
| +}
|
| +
|
| abstract class _LocalMirrorImpl implements Mirror {
|
| // Local mirrors always return the same IsolateMirror. This field
|
| // is more interesting once we implement remote mirrors.
|
| @@ -25,6 +35,28 @@
|
|
|
| Map<String, LibraryMirror> libraries() { return _libraries; }
|
|
|
| + InterfaceMirror _sharedDynamic = null;
|
| +
|
| + InterfaceMirror _dynamicMirror() {
|
| + if (_sharedDynamic === null) {
|
| + _sharedDynamic =
|
| + new _LocalInterfaceMirrorImpl(
|
| + null, 'Dynamic', false, null, null, [], null, const {});
|
| + }
|
| + return _sharedDynamic;
|
| + }
|
| +
|
| + InterfaceMirror _sharedVoid = null;
|
| +
|
| + InterfaceMirror _voidMirror() {
|
| + if (_sharedVoid === null) {
|
| + _sharedVoid =
|
| + new _LocalInterfaceMirrorImpl(
|
| + null, 'void', false, null, null, [], null, const {});
|
| + }
|
| + return _sharedVoid;
|
| + }
|
| +
|
| String toString() {
|
| return "IsolateMirror on '$debugName'";
|
| }
|
| @@ -92,7 +124,7 @@
|
| StringBuffer buf = new StringBuffer();
|
| for (int i = 0; i < str.length; i++) {
|
| var input = str[i];
|
| - String output;
|
| + String output;
|
| switch (input) {
|
| case '\\' :
|
| output = @'\\';
|
| @@ -176,6 +208,16 @@
|
| _LazyInterfaceMirror(this.libraryName, this.interfaceName) {}
|
|
|
| InterfaceMirror resolve(IsolateMirror isolate) {
|
| + if (libraryName === null) {
|
| + if (interfaceName == 'Dynamic') {
|
| + return isolate._dynamicMirror();
|
| + } else if (interfaceName == 'void') {
|
| + return isolate._dynamicMirror();
|
| + } else {
|
| + throw new NotImplementedException(
|
| + "Mirror for type '$interfaceName' not implemented");
|
| + }
|
| + }
|
| return isolate.libraries()[libraryName].members()[interfaceName];
|
| }
|
|
|
| @@ -191,7 +233,8 @@
|
| this._library,
|
| this._superclass,
|
| this._superinterfaces,
|
| - this._defaultFactory) : super(ref) {}
|
| + this._defaultFactory,
|
| + this._members) : super(ref) {}
|
|
|
| final String simpleName;
|
| final bool isClass;
|
| @@ -233,6 +276,28 @@
|
| return _defaultFactory;
|
| }
|
|
|
| + Map<String, InterfaceMirror> _members;
|
| + Map<String, InterfaceMirror> _methods = null;
|
| + Map<String, InterfaceMirror> _variables = null;
|
| +
|
| + Map<String, Mirror> members() { return _members; }
|
| +
|
| + Map<String, MethodMirror> methods() {
|
| + if (_methods == null) {
|
| + _methods = filterMap(members(),
|
| + (key, value) => (value is MethodMirror));
|
| + }
|
| + return _methods;
|
| + }
|
| +
|
| + Map<String, VariableMirror> variables() {
|
| + if (_variables == null) {
|
| + _variables = filterMap(members(),
|
| + (key, value) => (value is VariableMirror));
|
| + }
|
| + return _variables;
|
| + }
|
| +
|
| String toString() {
|
| return "InterfaceMirror on '$simpleName'";
|
| }
|
| @@ -258,14 +323,119 @@
|
| final String simpleName;
|
| final String url;
|
| Map<String, InterfaceMirror> _members;
|
| + Map<String, InterfaceMirror> _classes = null;
|
| + Map<String, InterfaceMirror> _functions = null;
|
| + Map<String, InterfaceMirror> _variables = null;
|
|
|
| Map<String, Mirror> members() { return _members; }
|
|
|
| + Map<String, InterfaceMirror> classes() {
|
| + if (_classes == null) {
|
| + _classes = filterMap(members(),
|
| + (key, value) => (value is InterfaceMirror));
|
| + }
|
| + return _classes;
|
| + }
|
| +
|
| + Map<String, MethodMirror> functions() {
|
| + if (_functions == null) {
|
| + _functions = filterMap(members(),
|
| + (key, value) => (value is MethodMirror));
|
| + }
|
| + return _functions;
|
| + }
|
| +
|
| + Map<String, VariableMirror> variables() {
|
| + if (_variables == null) {
|
| + _variables = filterMap(members(),
|
| + (key, value) => (value is VariableMirror));
|
| + }
|
| + return _variables;
|
| + }
|
| +
|
| String toString() {
|
| return "LibraryMirror on '$simpleName'";
|
| }
|
| }
|
|
|
| +class _LocalMethodMirrorImpl extends _LocalMirrorImpl
|
| + implements MethodMirror {
|
| + _LocalMethodMirrorImpl(this.simpleName,
|
| + this._owner,
|
| + this.isStatic,
|
| + this.isAbstract,
|
| + this.isGetter,
|
| + this.isSetter,
|
| + this.isConstructor,
|
| + this.isConstConstructor,
|
| + this.isGenerativeConstructor,
|
| + this.isRedirectingConstructor,
|
| + this.isFactoryConstructor) {}
|
| +
|
| + final String simpleName;
|
| +
|
| + var _owner;
|
| + Mirror get owner() {
|
| + if (_owner is! Mirror) {
|
| + _owner = _owner.resolve(isolate);
|
| + }
|
| + return _owner;
|
| + }
|
| +
|
| + bool get isTopLevel() {
|
| + return owner is LibraryMirror;
|
| + }
|
| +
|
| + final bool isStatic;
|
| +
|
| + bool get isMethod() {
|
| + return !isGetter && !isSetter && !isConstructor;
|
| + }
|
| +
|
| + final bool isAbstract;
|
| + final bool isGetter;
|
| + final bool isSetter;
|
| + final bool isConstructor;
|
| +
|
| + final bool isConstConstructor;
|
| + final bool isGenerativeConstructor;
|
| + final bool isRedirectingConstructor;
|
| + final bool isFactoryConstructor;
|
| +
|
| + String toString() {
|
| + return "MethodMirror on '$simpleName'";
|
| + }
|
| +}
|
| +
|
| +class _LocalVariableMirrorImpl extends _LocalMirrorImpl
|
| + implements VariableMirror {
|
| + _LocalVariableMirrorImpl(this.simpleName,
|
| + this._owner,
|
| + this.isStatic,
|
| + this.isFinal) {}
|
| +
|
| + final String simpleName;
|
| +
|
| + var _owner;
|
| + Mirror get owner() {
|
| + if (_owner is! Mirror) {
|
| + _owner = _owner.resolve(isolate);
|
| + }
|
| + return _owner;
|
| + }
|
| +
|
| + bool get isTopLevel() {
|
| + return owner is LibraryMirror;
|
| + }
|
| +
|
| + final bool isStatic;
|
| + final bool isFinal;
|
| +
|
| + String toString() {
|
| + return "VariableMirror on '$simpleName'";
|
| + }
|
| +}
|
| +
|
| class _Mirrors {
|
| // Does a port refer to our local isolate?
|
| static bool isLocalPort(SendPort port) native 'Mirrors_isLocalPort';
|
|
|