Skip to content

Commit d48b153

Browse files
committed
dart:mirrors
This is a very bare bones version - just enough to get angular running. See #199 R=jmesserly@google.com Review URL: https://codereview.chromium.org/1186683005.
1 parent b769aa5 commit d48b153

File tree

14 files changed

+1857
-81
lines changed

14 files changed

+1857
-81
lines changed

pkg/dev_compiler/lib/runtime/_operations.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88
dart_library.library('dart_runtime/_operations', null, /* Imports */[
99
], /* Lazy Imports */[
1010
'dart/async',
11+
'dart/collection',
1112
'dart/core',
13+
'dart/_js_helper',
1214
'dart_runtime/_classes',
1315
'dart_runtime/_errors',
1416
'dart_runtime/_rtti',
1517
'dart_runtime/_types'
16-
], function(exports, async, core, classes, errors, rtti, types) {
18+
], function(exports, async, collection, core, _js_helper, classes, errors, rtti,
19+
types) {
1720
'use strict';
1821

1922
const getOwnNamesAndSymbols = dart_utils.getOwnNamesAndSymbols;
@@ -146,7 +149,6 @@ dart_library.library('dart_runtime/_operations', null, /* Imports */[
146149
}
147150
exports.dcall = dcall;
148151

149-
150152
/** Shared code for dsend, dindex, and dsetindex. */
151153
function callMethod(obj, name, args, displayName) {
152154
let symbol = _canonicalFieldName(obj, name, args, displayName);
@@ -160,6 +162,11 @@ dart_library.library('dart_runtime/_operations', null, /* Imports */[
160162
}
161163
exports.dsend = dsend;
162164

165+
function dsendArray(obj, method, args) {
166+
return dsend(obj, method, ...args);
167+
}
168+
exports.dsendArray = dsendArray;
169+
163170
function dindex(obj, index) {
164171
return callMethod(obj, 'get', [index], '[]');
165172
}
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
dart_library.library('dart/_js_mirrors', null, /* Imports */[
2+
"dart_runtime/dart",
3+
'dart/_internal',
4+
'dart/core',
5+
'dart/mirrors'
6+
], /* Lazy imports */[
7+
], function(exports, dart, _internal, core, mirrors) {
8+
'use strict';
9+
let dartx = dart.dartx;
10+
function getName(symbol) {
11+
return _internal.Symbol.getName(dart.as(symbol, _internal.Symbol));
12+
}
13+
dart.fn(getName, core.String, [core.Symbol]);
14+
function getSymbol(name, library) {
15+
return dart.throw_(new core.UnimplementedError("MirrorSystem.getSymbol unimplemented"));
16+
}
17+
dart.fn(getSymbol, core.Symbol, [core.Object, core.Object]);
18+
dart.defineLazyProperties(exports, {
19+
get currentJsMirrorSystem() {
20+
return dart.throw_(new core.UnimplementedError("MirrorSystem.currentJsMirrorSystem unimplemented"));
21+
}
22+
});
23+
function reflect(reflectee) {
24+
return new JsInstanceMirror._(reflectee);
25+
}
26+
dart.fn(reflect, mirrors.InstanceMirror, [core.Object]);
27+
function reflectType(key) {
28+
return new JsClassMirror._(key);
29+
}
30+
dart.fn(reflectType, mirrors.TypeMirror, [core.Type]);
31+
dart.defineLazyProperties(exports, {
32+
get _dart() {
33+
return dart;
34+
},
35+
get _metadata() {
36+
return exports._dart.metadata;
37+
}
38+
});
39+
function _dload(obj, name) {
40+
return exports._dart.dload(obj, name);
41+
}
42+
dart.fn(_dload, core.Object, [core.Object, core.String]);
43+
function _dput(obj, name, val) {
44+
exports._dart.dput(obj, name, val);
45+
}
46+
dart.fn(_dput, dart.void, [core.Object, core.String, core.Object]);
47+
function _dsend(obj, name, args) {
48+
return exports._dart.dsendArray(obj, name, args);
49+
}
50+
dart.fn(_dsend, core.Object, [core.Object, core.String, core.List]);
51+
let _toJsMap = Symbol('_toJsMap');
52+
class JsInstanceMirror extends core.Object {
53+
_(reflectee) {
54+
this.reflectee = reflectee;
55+
}
56+
getField(symbol) {
57+
let name = getName(symbol);
58+
let field = _dload(this.reflectee, name);
59+
return new JsInstanceMirror._(field);
60+
}
61+
setField(symbol, value) {
62+
let name = getName(symbol);
63+
let field = _dput(this.reflectee, name, value);
64+
return new JsInstanceMirror._(field);
65+
}
66+
invoke(symbol, args, namedArgs) {
67+
if (namedArgs === void 0)
68+
namedArgs = null;
69+
let name = getName(symbol);
70+
if (namedArgs != null) {
71+
args = core.List.from(args);
72+
args[dartx.add](this[_toJsMap](namedArgs));
73+
}
74+
let result = _dsend(this.reflectee, name, args);
75+
return new JsInstanceMirror._(result);
76+
}
77+
[_toJsMap](map) {
78+
let obj = {};
79+
map.forEach(dart.fn((key, value) => {
80+
obj[getName(key)] = value;
81+
}, core.Object, [core.Symbol, core.Object]));
82+
return obj;
83+
}
84+
}
85+
JsInstanceMirror[dart.implements] = () => [mirrors.InstanceMirror];
86+
dart.defineNamedConstructor(JsInstanceMirror, '_');
87+
dart.setSignature(JsInstanceMirror, {
88+
constructors: () => ({_: [JsInstanceMirror, [core.Object]]}),
89+
methods: () => ({
90+
getField: [mirrors.InstanceMirror, [core.Symbol]],
91+
setField: [mirrors.InstanceMirror, [core.Symbol, core.Object]],
92+
invoke: [mirrors.InstanceMirror, [core.Symbol, core.List], [core.Map$(core.Symbol, core.Object)]],
93+
[_toJsMap]: [core.Object, [core.Map$(core.Symbol, core.Object)]]
94+
})
95+
});
96+
let _metadata = Symbol('_metadata');
97+
let _declarations = Symbol('_declarations');
98+
let _cls = Symbol('_cls');
99+
class JsClassMirror extends core.Object {
100+
get metadata() {
101+
return this[_metadata];
102+
}
103+
get declarations() {
104+
return this[_declarations];
105+
}
106+
_(cls) {
107+
this[_cls] = cls;
108+
this.simpleName = core.Symbol.new(cls.name);
109+
this[_metadata] = null;
110+
this[_declarations] = null;
111+
let fn = this[_cls][dart.metadata];
112+
this[_metadata] = fn == null ? dart.list([], mirrors.InstanceMirror) : core.List$(mirrors.InstanceMirror).from(dart.as(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => new JsInstanceMirror._(i), JsInstanceMirror, [core.Object])), core.Iterable));
113+
this[_declarations] = core.Map$(core.Symbol, mirrors.MethodMirror).new();
114+
this[_declarations].set(this.simpleName, new JsMethodMirror._(this, this[_cls]));
115+
}
116+
newInstance(constructorName, args, namedArgs) {
117+
if (namedArgs === void 0)
118+
namedArgs = null;
119+
dart.assert(getName(constructorName) == "");
120+
dart.assert(namedArgs == null || dart.notNull(namedArgs.isEmpty));
121+
let instance = exports._dart.instantiate(this[_cls], args);
122+
return new JsInstanceMirror._(instance);
123+
}
124+
}
125+
JsClassMirror[dart.implements] = () => [mirrors.ClassMirror];
126+
dart.defineNamedConstructor(JsClassMirror, '_');
127+
dart.setSignature(JsClassMirror, {
128+
constructors: () => ({_: [JsClassMirror, [core.Type]]}),
129+
methods: () => ({newInstance: [mirrors.InstanceMirror, [core.Symbol, core.List], [core.Map$(core.Symbol, core.Object)]]})
130+
});
131+
class JsTypeMirror extends core.Object {
132+
_(reflectedType) {
133+
this.reflectedType = reflectedType;
134+
}
135+
}
136+
JsTypeMirror[dart.implements] = () => [mirrors.TypeMirror];
137+
dart.defineNamedConstructor(JsTypeMirror, '_');
138+
dart.setSignature(JsTypeMirror, {
139+
constructors: () => ({_: [JsTypeMirror, [core.Type]]})
140+
});
141+
let _name = Symbol('_name');
142+
class JsParameterMirror extends core.Object {
143+
_(name, t) {
144+
this.metadata = dart.list([], mirrors.InstanceMirror);
145+
this[_name] = name;
146+
this.type = new JsTypeMirror._(t);
147+
}
148+
}
149+
JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
150+
dart.defineNamedConstructor(JsParameterMirror, '_');
151+
dart.setSignature(JsParameterMirror, {
152+
constructors: () => ({_: [JsParameterMirror, [core.String, core.Type]]})
153+
});
154+
let _method = Symbol('_method');
155+
let _params = Symbol('_params');
156+
let _createParameterMirrorList = Symbol('_createParameterMirrorList');
157+
class JsMethodMirror extends core.Object {
158+
_(cls, method) {
159+
this[_method] = method;
160+
this[_name] = getName(cls.simpleName);
161+
this[_params] = null;
162+
let ftype = exports._dart.classGetConstructorType(cls[_cls]);
163+
this[_params] = this[_createParameterMirrorList](ftype);
164+
}
165+
get constructorName() {
166+
return core.Symbol.new('');
167+
}
168+
get parameters() {
169+
return this[_params];
170+
}
171+
[_createParameterMirrorList](ftype) {
172+
if (ftype == null) {
173+
return dart.list([], mirrors.ParameterMirror);
174+
}
175+
let args = dart.as(dart.dload(ftype, 'args'), core.List);
176+
let opts = dart.as(dart.dload(ftype, 'optionals'), core.List);
177+
let params = core.List$(mirrors.ParameterMirror).new(dart.notNull(args[dartx.length]) + dart.notNull(opts[dartx.length]));
178+
for (let i = 0; dart.notNull(i) < dart.notNull(args[dartx.length]); i = dart.notNull(i) + 1) {
179+
let type = args[dartx.get](i);
180+
let param = new JsParameterMirror._('', dart.as(type, core.Type));
181+
params[dartx.set](i, param);
182+
}
183+
for (let i = 0; dart.notNull(i) < dart.notNull(opts[dartx.length]); i = dart.notNull(i) + 1) {
184+
let type = opts[dartx.get](i);
185+
let param = new JsParameterMirror._('', dart.as(type, core.Type));
186+
params[dartx.set](dart.notNull(i) + dart.notNull(args[dartx.length]), param);
187+
}
188+
return params;
189+
}
190+
}
191+
JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
192+
dart.defineNamedConstructor(JsMethodMirror, '_');
193+
dart.setSignature(JsMethodMirror, {
194+
constructors: () => ({_: [JsMethodMirror, [JsClassMirror, core.Object]]}),
195+
methods: () => ({[_createParameterMirrorList]: [core.List$(mirrors.ParameterMirror), [core.Object]]})
196+
});
197+
// Exports:
198+
exports.getName = getName;
199+
exports.getSymbol = getSymbol;
200+
exports.reflect = reflect;
201+
exports.reflectType = reflectType;
202+
exports.JsInstanceMirror = JsInstanceMirror;
203+
exports.JsClassMirror = JsClassMirror;
204+
exports.JsTypeMirror = JsTypeMirror;
205+
exports.JsParameterMirror = JsParameterMirror;
206+
exports.JsMethodMirror = JsMethodMirror;
207+
});
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
dart_library.library('dart/mirrors', null, /* Imports */[
2+
"dart_runtime/dart",
3+
'dart/core'
4+
], /* Lazy imports */[
5+
'dart/_js_mirrors'
6+
], function(exports, dart, core, _js_mirrors) {
7+
'use strict';
8+
let dartx = dart.dartx;
9+
class MirrorSystem extends core.Object {
10+
findLibrary(libraryName) {
11+
return this.libraries.values[dartx.singleWhere](dart.fn(library => dart.equals(dart.dload(library, 'simpleName'), libraryName), core.bool, [core.Object]));
12+
}
13+
static getName(symbol) {
14+
return _js_mirrors.getName(symbol);
15+
}
16+
static getSymbol(name, library) {
17+
if (library === void 0)
18+
library = null;
19+
return _js_mirrors.getSymbol(name, library);
20+
}
21+
}
22+
dart.setSignature(MirrorSystem, {
23+
methods: () => ({findLibrary: [LibraryMirror, [core.Symbol]]}),
24+
statics: () => ({
25+
getName: [core.String, [core.Symbol]],
26+
getSymbol: [core.Symbol, [core.String], [LibraryMirror]]
27+
}),
28+
names: ['getName', 'getSymbol']
29+
});
30+
function currentMirrorSystem() {
31+
return dart.as(_js_mirrors.currentJsMirrorSystem, MirrorSystem);
32+
}
33+
dart.fn(currentMirrorSystem, MirrorSystem, []);
34+
function reflect(reflectee) {
35+
return _js_mirrors.reflect(reflectee);
36+
}
37+
dart.fn(reflect, () => dart.functionType(InstanceMirror, [core.Object]));
38+
function reflectClass(key) {
39+
if (!dart.is(key, core.Type) || dart.equals(key, core.Object)) {
40+
throw new core.ArgumentError(`${key} does not denote a class`);
41+
}
42+
let tm = reflectType(key);
43+
if (!dart.is(tm, ClassMirror)) {
44+
throw new core.ArgumentError(`${key} does not denote a class`);
45+
}
46+
return dart.as(dart.as(tm, ClassMirror).originalDeclaration, ClassMirror);
47+
}
48+
dart.fn(reflectClass, () => dart.functionType(ClassMirror, [core.Type]));
49+
function reflectType(key) {
50+
if (dart.equals(key, core.Object)) {
51+
return currentMirrorSystem().dynamicType;
52+
}
53+
return _js_mirrors.reflectType(key);
54+
}
55+
dart.fn(reflectType, () => dart.functionType(TypeMirror, [core.Type]));
56+
class Mirror extends core.Object {}
57+
class IsolateMirror extends core.Object {}
58+
IsolateMirror[dart.implements] = () => [Mirror];
59+
class DeclarationMirror extends core.Object {}
60+
DeclarationMirror[dart.implements] = () => [Mirror];
61+
class ObjectMirror extends core.Object {}
62+
ObjectMirror[dart.implements] = () => [Mirror];
63+
class InstanceMirror extends core.Object {}
64+
InstanceMirror[dart.implements] = () => [ObjectMirror];
65+
class ClosureMirror extends core.Object {}
66+
ClosureMirror[dart.implements] = () => [InstanceMirror];
67+
class LibraryMirror extends core.Object {}
68+
LibraryMirror[dart.implements] = () => [DeclarationMirror, ObjectMirror];
69+
class LibraryDependencyMirror extends core.Object {}
70+
LibraryDependencyMirror[dart.implements] = () => [Mirror];
71+
class CombinatorMirror extends core.Object {}
72+
CombinatorMirror[dart.implements] = () => [Mirror];
73+
class TypeMirror extends core.Object {}
74+
TypeMirror[dart.implements] = () => [DeclarationMirror];
75+
class ClassMirror extends core.Object {}
76+
ClassMirror[dart.implements] = () => [TypeMirror, ObjectMirror];
77+
class FunctionTypeMirror extends core.Object {}
78+
FunctionTypeMirror[dart.implements] = () => [ClassMirror];
79+
class TypeVariableMirror extends TypeMirror {}
80+
class TypedefMirror extends core.Object {}
81+
TypedefMirror[dart.implements] = () => [TypeMirror];
82+
class MethodMirror extends core.Object {}
83+
MethodMirror[dart.implements] = () => [DeclarationMirror];
84+
class VariableMirror extends core.Object {}
85+
VariableMirror[dart.implements] = () => [DeclarationMirror];
86+
class ParameterMirror extends core.Object {}
87+
ParameterMirror[dart.implements] = () => [VariableMirror];
88+
class SourceLocation extends core.Object {}
89+
class Comment extends core.Object {
90+
Comment(text, trimmedText, isDocComment) {
91+
this.text = text;
92+
this.trimmedText = trimmedText;
93+
this.isDocComment = isDocComment;
94+
}
95+
}
96+
dart.setSignature(Comment, {
97+
constructors: () => ({Comment: [Comment, [core.String, core.String, core.bool]]})
98+
});
99+
class MirrorsUsed extends core.Object {
100+
MirrorsUsed(opts) {
101+
let symbols = opts && 'symbols' in opts ? opts.symbols : null;
102+
let targets = opts && 'targets' in opts ? opts.targets : null;
103+
let metaTargets = opts && 'metaTargets' in opts ? opts.metaTargets : null;
104+
let override = opts && 'override' in opts ? opts.override : null;
105+
this.symbols = symbols;
106+
this.targets = targets;
107+
this.metaTargets = metaTargets;
108+
this.override = override;
109+
}
110+
}
111+
dart.setSignature(MirrorsUsed, {
112+
constructors: () => ({MirrorsUsed: [MirrorsUsed, [], {symbols: core.Object, targets: core.Object, metaTargets: core.Object, override: core.Object}]})
113+
});
114+
// Exports:
115+
exports.MirrorSystem = MirrorSystem;
116+
exports.currentMirrorSystem = currentMirrorSystem;
117+
exports.reflect = reflect;
118+
exports.reflectClass = reflectClass;
119+
exports.reflectType = reflectType;
120+
exports.Mirror = Mirror;
121+
exports.IsolateMirror = IsolateMirror;
122+
exports.DeclarationMirror = DeclarationMirror;
123+
exports.ObjectMirror = ObjectMirror;
124+
exports.InstanceMirror = InstanceMirror;
125+
exports.ClosureMirror = ClosureMirror;
126+
exports.LibraryMirror = LibraryMirror;
127+
exports.LibraryDependencyMirror = LibraryDependencyMirror;
128+
exports.CombinatorMirror = CombinatorMirror;
129+
exports.TypeMirror = TypeMirror;
130+
exports.ClassMirror = ClassMirror;
131+
exports.FunctionTypeMirror = FunctionTypeMirror;
132+
exports.TypeVariableMirror = TypeVariableMirror;
133+
exports.TypedefMirror = TypedefMirror;
134+
exports.MethodMirror = MethodMirror;
135+
exports.VariableMirror = VariableMirror;
136+
exports.ParameterMirror = ParameterMirror;
137+
exports.SourceLocation = SourceLocation;
138+
exports.Comment = Comment;
139+
exports.MirrorsUsed = MirrorsUsed;
140+
});

0 commit comments

Comments
 (0)