Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart

Issue 15861005: Implement ClassMirror.owner and LibraryMirror.uri. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix problem in deferred code Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 88e9bbaf26ed332b6b967eabf579690a04b958af..fda0709db1ee6cafdc2bc44eb7073bc6d25f4daf 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart
@@ -7,7 +7,7 @@
import 'dart:_foreign_helper' show JS;
import 'dart:_collection-dev' as _symbol_dev;
import 'dart:_js_helper' show createInvocationMirror;
-import 'dart:_interceptors' show getInterceptor;
+import 'dart:_interceptors' show Interceptor;
patch class MirrorSystem {
patch static String getName(Symbol symbol) => _n(symbol);
@@ -61,7 +61,9 @@ class _LibraryMirror extends _ObjectMirror implements LibraryMirror {
var result = new Map<Symbol, ClassMirror>();
for (int i = 0; i < _classes.length; i += 2) {
Symbol symbol = _s(_classes[i]);
- result[symbol] = _reflectClass(symbol, _classes[i + 1]);
+ _ClassMirror cls = _reflectClass(symbol, _classes[i + 1]);
+ result[symbol] = cls;
+ cls._owner = this;
}
return result;
}
@@ -205,6 +207,8 @@ class _ClassMirror extends _ObjectMirror implements ClassMirror {
final Symbol simpleName;
final _jsConstructor;
final String _fields;
+ // Set as side-effect of accessing _LibraryMirror.classes.
+ _LibraryMirror _owner;
_ClassMirror(this.simpleName, this._jsConstructor, this._fields);
@@ -254,6 +258,26 @@ class _ClassMirror extends _ObjectMirror implements ClassMirror {
constructorName, positionalArguments, namedArguments));
}
+ DeclarationMirror get owner {
+ if (_owner == null) {
+ if (_jsConstructor is Interceptor) {
+ _owner = __reflectClass(Object).owner;
+ } else {
+ for (var list in _MirrorSystem.librariesByName.values) {
+ for (_LibraryMirror library in list) {
+ // This will set _owner field on all clasess as a side
+ // effect. This gives us a fast path to reflect on a
+ // class without parsing reflection data.
+ library.classes;
+ }
+ }
+ }
+ if (_owner == null) {
+ throw new StateError('Class "${_n(simpleName)}" has no owner');
+ }
+ }
+ return _owner;
+ }
String toString() => 'ClassMirror(${_n(simpleName)})';
}

Powered by Google App Engine
This is Rietveld 408576698