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

Unified Diff: dart/sdk/lib/_internal/lib/js_mirrors.dart

Issue 17601005: Implement JsClassMirror.constructors. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased on CL 17601006 to fix issues in minified mode. Created 7 years, 6 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
« no previous file with comments | « no previous file | dart/sdk/lib/mirrors/mirrors.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/sdk/lib/_internal/lib/js_mirrors.dart
diff --git a/dart/sdk/lib/_internal/lib/js_mirrors.dart b/dart/sdk/lib/_internal/lib/js_mirrors.dart
index a489d11fcdbd52097d93d0a31fa9200483d10651..19c7f1223da57953bfe83065ba7e9538b6611587 100644
--- a/dart/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/dart/sdk/lib/_internal/lib/js_mirrors.dart
@@ -109,6 +109,7 @@ class JsLibraryMirror extends JsDeclarationMirror with JsObjectMirror
final List<String> _classes;
final List<String> _functions;
final List _metadata;
+ List<JsMethodMirror> _cachedFunctionMirrors;
JsLibraryMirror(Symbol simpleName,
this.uri,
@@ -142,25 +143,42 @@ class JsLibraryMirror extends JsDeclarationMirror with JsObjectMirror
return reflect(JS('', '#[#]', JS_CURRENT_ISOLATE(), n(fieldName)));
}
- Map<Symbol, MethodMirror> get functions {
- var result = new Map<Symbol, MethodMirror>();
+ List<JsMethodMirror> get _functionMirrors {
+ if (_cachedFunctionMirrors != null) return _cachedFunctionMirrors;
+ var result = new List<JsMethodMirror>(_functions.length);
for (int i = 0; i < _functions.length; i++) {
String name = _functions[i];
- Symbol symbol = s(name);
+ String unmangledName = mangledGlobalNames[name];
+ if (unmangledName == null) unmangledName = name;
int parameterCount = null; // TODO(ahe): Compute this.
- bool isStatic = true; // Top-level functions are static.
bool isSetter = false; // TODO(ahe): Compute this.
bool isGetter = false; // TODO(ahe): Compute this.
+ bool isConstructor = unmangledName.startsWith('new ');
+ bool isStatic = true && !isConstructor; // Top-level functions are
+ // static, but constructors are
+ // not.
+ if (isConstructor) {
+ unmangledName = unmangledName.substring(4).replaceAll(r'$', '.');
+ }
+ unmangledName = unmangledName.split(':')[0];
+ Symbol symbol = s(unmangledName);
JsMethodMirror mirror =
// TODO(ahe): Create accessor for accessing $. It is also
// used in js_helper.
new JsMethodMirror(
symbol, JS('', '#[#]', JS_CURRENT_ISOLATE(), name),
- parameterCount, isGetter, isSetter, isStatic);
- // TODO(ahe): Cache mirrors.
- result[symbol] = mirror;
+ parameterCount, isGetter, isSetter, isStatic, isConstructor);
+ result[i] = mirror;
mirror._owner = this;
}
+ return _cachedFunctionMirrors = result;
+ }
+
+ Map<Symbol, MethodMirror> get functions {
+ var result = new Map<Symbol, MethodMirror>();
+ for (JsMethodMirror mirror in _functionMirrors) {
+ if (!mirror.isConstructor) result[mirror.simpleName] = mirror;
+ }
return result;
}
@@ -372,6 +390,22 @@ class JsClassMirror extends JsTypeMirror with JsObjectMirror
}
}
+ Map<Symbol, MethodMirror> get constructors {
+ Map<Symbol, MethodMirror> result = new Map<Symbol, MethodMirror>();
+ JsLibraryMirror library = owner;
+ String unmangledName = mangledGlobalNames[n(simpleName)];
+ if (unmangledName == null) unmangledName = n(simpleName);
+ for (JsMethodMirror mirror in library._functionMirrors) {
+ Symbol name = mirror.simpleName;
+ if (mirror.isConstructor
+ && (name == simpleName || n(name).startsWith('$unmangledName.'))) {
+ result[name] = mirror;
+ mirror._owner = this;
+ }
+ }
+ return result;
+ }
+
List<JsMethodMirror> get _methods {
if (_cachedMethods != null) return _cachedMethods;
var prototype = JS('', '#.prototype', _jsConstructor);
@@ -639,11 +673,12 @@ function(reflectee) {
var self = BoundClosure.selfOf(reflectee);
return new JsMethodMirror(
s(target), JS('', '#[#]', self, target), parameterCount,
- false, false, isStatic);
+ false, false, isStatic, false);
} else {
var jsFunction = JS('', '#[#]', reflectee, callName);
return new JsMethodMirror(
- s(callName), jsFunction, parameterCount, false, false, isStatic);
+ s(callName), jsFunction, parameterCount,
+ false, false, isStatic, false);
}
}
@@ -668,6 +703,7 @@ class JsMethodMirror extends JsDeclarationMirror implements MethodMirror {
final bool isGetter;
final bool isSetter;
final bool isStatic;
+ final bool isConstructor;
DeclarationMirror _owner;
List _metadata;
@@ -676,7 +712,8 @@ class JsMethodMirror extends JsDeclarationMirror implements MethodMirror {
this._parameterCount,
this.isGetter,
this.isSetter,
- this.isStatic)
+ this.isStatic,
+ this.isConstructor)
: super(simpleName);
factory JsMethodMirror.fromUnmangledName(String name, jsFunction) {
@@ -699,7 +736,7 @@ class JsMethodMirror extends JsDeclarationMirror implements MethodMirror {
}
return new JsMethodMirror(
s(name), jsFunction, requiredParameterCount + optionalParameterCount,
- isGetter, isSetter, false);
+ isGetter, isSetter, false, false);
}
String get _prettyName => 'MethodMirror';
« no previous file with comments | « no previous file | dart/sdk/lib/mirrors/mirrors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698