@@ -125,17 +125,13 @@ ParsedFn ZERO = new ParsedFn((_, _x) => 0);
125
125
126
126
class BreakException {}
127
127
128
- // returns a function that calls fn with numArgs args as an array
129
- varArgs (numArgs, fn) {
130
- switch (numArgs) {
131
- case 0 : return () => fn ([]);
132
- case 1 : return (p0) => fn ([p0]);
133
- case 2 : return (p0, p1) => fn ([p0, p1]);
134
- case 3 : return (p0, p1, p2) => fn ([p0, p1, p3]);
135
- case 4 : return (p0, p1, p2, p3) => fn ([p0, p1, p2, p3]);
136
- case 5 : return (p0, p1, p2, p3) => fn ([p0, p1, p2, p3, p4]);
137
- }
138
- throw "varArgs with $numArgs is not supported." ;
128
+ class Setter {
129
+ operator []= (name, value){}
130
+ }
131
+
132
+ abstract class Getter {
133
+ bool containsKey (name);
134
+ operator [](name);
139
135
}
140
136
141
137
// Returns a tuple [found, value]
@@ -146,7 +142,9 @@ getterChild(value, childKey) {
146
142
} else {
147
143
return [false , null ];
148
144
}
149
- } else if (value is Map && value.containsKey (childKey)) {
145
+ }
146
+
147
+ if (isInterface (value, Getter ) && value.containsKey (childKey)) {
150
148
return [true , value[childKey]];
151
149
} else {
152
150
InstanceMirror instanceMirror = reflect (value);
@@ -159,6 +157,7 @@ getterChild(value, childKey) {
159
157
if (instanceMirror.type.members.containsKey (curSym)) {
160
158
MethodMirror methodMirror = instanceMirror.type.members[curSym];
161
159
return [true , _relaxFnArgs ((args) {
160
+ if (args == null ) args = [];
162
161
try {
163
162
return instanceMirror.invoke (curSym, args).reflectee;
164
163
} catch (e) {
@@ -195,6 +194,21 @@ getter(scope, locals, path) {
195
194
return currentValue;
196
195
}
197
196
197
+ setterChild (obj, childKey, value) {
198
+ if (isInterface (obj, Setter )) {
199
+ obj[childKey] = value;
200
+ return value;
201
+ }
202
+ InstanceMirror instanceMirror = reflect (obj);
203
+ Symbol curSym = new Symbol (childKey);
204
+ try {
205
+ // maybe it is a member field?
206
+ return instanceMirror.setField (curSym, value).reflectee;
207
+ } catch (e) {
208
+ throw "$e \n\n ${e .stacktrace }" ;
209
+ }
210
+ }
211
+
198
212
setter (obj, path, setValue) {
199
213
var element = path.split ('.' );
200
214
for (var i = 0 ; element.length > 1 ; i++ ) {
@@ -206,8 +220,7 @@ setter(obj, path, setValue) {
206
220
}
207
221
obj = propertyObj;
208
222
}
209
- obj[element.removeAt (0 )] = setValue;
210
- return setValue;
223
+ return setterChild (obj, element.removeAt (0 ), setValue);
211
224
}
212
225
213
226
class Parser {
@@ -698,7 +711,7 @@ class Parser {
698
711
args.add (argsFn[i](self, locals));
699
712
}
700
713
var userFn = fn (self, locals);
701
- return _relaxFnApply (userFn, args);
714
+ return relaxFnApply (userFn, args);
702
715
});
703
716
};
704
717
0 commit comments