@@ -186,8 +186,9 @@ class WatchGroup implements _EvalWatchList, _WatchGroupList {
186
186
* - [expression] normalized expression used for caching.
187
187
*/
188
188
_EvalWatchRecord addFunctionWatch (/* dartbug.com/16401 Function */ fn, List <AST > argsAST,
189
+ Map <Symbol , AST > namedArgsAST,
189
190
String expression) =>
190
- _addEvalWatch (null , fn, null , argsAST, expression);
191
+ _addEvalWatch (null , fn, null , argsAST, namedArgsAST, expression);
191
192
192
193
/**
193
194
* Watch a method [name] ed represented by an [expression] .
@@ -198,13 +199,16 @@ class WatchGroup implements _EvalWatchList, _WatchGroupList {
198
199
* - [expression] normalized expression used for caching.
199
200
*/
200
201
_EvalWatchRecord addMethodWatch (AST lhs, String name, List <AST > argsAST,
202
+ Map <Symbol , AST > namedArgsAST,
201
203
String expression) =>
202
- _addEvalWatch (lhs, null , name, argsAST, expression);
204
+ _addEvalWatch (lhs, null , name, argsAST, namedArgsAST, expression);
203
205
204
206
205
207
206
208
_EvalWatchRecord _addEvalWatch (AST lhsAST, /* dartbug.com/16401 Function */ fn, String name,
207
- List <AST > argsAST, String expression) {
209
+ List <AST > argsAST,
210
+ Map <Symbol , AST > namedArgsAST,
211
+ String expression) {
208
212
_InvokeHandler invokeHandler = new _InvokeHandler (this , expression);
209
213
var evalWatchRecord = new _EvalWatchRecord (this , invokeHandler, fn, name,
210
214
argsAST.length);
@@ -218,15 +222,24 @@ class WatchGroup implements _EvalWatchList, _WatchGroupList {
218
222
}
219
223
220
224
// Convert the args from AST to WatchRecords
221
- var i = 0 ;
222
- argsAST.map ((ast) =>
223
- _cache.putIfAbsent (ast.expression, () => ast.setupWatch (this )))
224
- .forEach ((WatchRecord <_Handler > record) {
225
- var argHandler = new _ArgHandler (this , evalWatchRecord, i++ );
226
- _ArgHandlerList ._add (invokeHandler, argHandler);
227
- record.handler.addForwardHandler (argHandler);
228
- argHandler.acceptValue (record.currentValue);
229
- });
225
+ Iterable <WatchRecord <_Handler >> records = argsAST.map ((ast) =>
226
+ _cache.putIfAbsent (ast.expression, () => ast.setupWatch (this )));
227
+ int i = 0 ;
228
+ records.forEach ((WatchRecord <_Handler > record) {
229
+ _ArgHandler handler = new _PositionalArgHandler (this , evalWatchRecord, i++ );
230
+ _ArgHandlerList ._add (invokeHandler, handler);
231
+ record.handler.addForwardHandler (handler);
232
+ handler.acceptValue (record.currentValue);
233
+ });
234
+
235
+ namedArgsAST.forEach ((Symbol name, AST ast) {
236
+ WatchRecord <_Handler > record = _cache.putIfAbsent (ast.expression,
237
+ () => ast.setupWatch (this ));
238
+ _ArgHandler handler = new _NamedArgHandler (this , evalWatchRecord, name);
239
+ _ArgHandlerList ._add (invokeHandler, handler);
240
+ record.handler.addForwardHandler (handler);
241
+ handler.acceptValue (record.currentValue);
242
+ });
230
243
231
244
// Must be done last
232
245
_EvalWatchList ._add (this , evalWatchRecord);
@@ -615,25 +628,42 @@ class _CollectionHandler extends _Handler {
615
628
}
616
629
}
617
630
618
- class _ArgHandler extends _Handler {
631
+ abstract class _ArgHandler extends _Handler {
619
632
_ArgHandler _previousArgHandler, _nextArgHandler;
620
633
621
634
// TODO(misko): Why do we override parent?
622
635
final _EvalWatchRecord watchRecord;
623
- final int index;
636
+ _ArgHandler (WatchGroup watchGrp, String expression, this .watchRecord)
637
+ : super (watchGrp, expression);
624
638
625
639
_releaseWatch () => null ;
640
+ }
626
641
627
- _ArgHandler (WatchGroup watchGrp, this .watchRecord, int index)
628
- : index = index,
629
- super (watchGrp, 'arg[$index ]' );
642
+ class _PositionalArgHandler extends _ArgHandler {
643
+ final int index;
644
+ _PositionalArgHandler (WatchGroup watchGrp, _EvalWatchRecord record, int index)
645
+ : this .index = index,
646
+ super (watchGrp, 'arg[$index ]' , record);
630
647
631
648
void acceptValue (object) {
632
649
watchRecord.dirtyArgs = true ;
633
650
watchRecord.args[index] = object;
634
651
}
635
652
}
636
653
654
+ class _NamedArgHandler extends _ArgHandler {
655
+ final Symbol name;
656
+
657
+ _NamedArgHandler (WatchGroup watchGrp, _EvalWatchRecord record, Symbol name)
658
+ : this .name = name,
659
+ super (watchGrp, 'namedArg[$name ]' , record);
660
+
661
+ void acceptValue (object) {
662
+ watchRecord.dirtyArgs = true ;
663
+ watchRecord.namedArgs[name] = object;
664
+ }
665
+ }
666
+
637
667
class _InvokeHandler extends _Handler implements _ArgHandlerList {
638
668
_ArgHandler _argHandlerHead, _argHandlerTail;
639
669
@@ -675,6 +705,7 @@ class _EvalWatchRecord implements WatchRecord<_Handler>, Record<_Handler> {
675
705
WatchGroup watchGrp;
676
706
final _Handler handler;
677
707
final List args;
708
+ final Map <Symbol , dynamic > namedArgs = new Map <Symbol , dynamic >();
678
709
final Symbol symbol;
679
710
final String name;
680
711
int mode;
@@ -751,7 +782,7 @@ class _EvalWatchRecord implements WatchRecord<_Handler>, Record<_Handler> {
751
782
return false ;
752
783
case _MODE_FUNCTION_ :
753
784
if (! dirtyArgs) return false ;
754
- value = Function .apply (fn, args);
785
+ value = Function .apply (fn, args, namedArgs );
755
786
dirtyArgs = false ;
756
787
break ;
757
788
case _MODE_FUNCTION_APPLY_ :
@@ -761,14 +792,14 @@ class _EvalWatchRecord implements WatchRecord<_Handler>, Record<_Handler> {
761
792
break ;
762
793
case _MODE_FIELD_CLOSURE_ :
763
794
var closure = _instanceMirror.getField (symbol).reflectee;
764
- value = closure == null ? null : Function .apply (closure, args);
795
+ value = closure == null ? null : Function .apply (closure, args, namedArgs );
765
796
break ;
766
797
case _MODE_MAP_CLOSURE_ :
767
798
var closure = object[name];
768
- value = closure == null ? null : Function .apply (closure, args);
799
+ value = closure == null ? null : Function .apply (closure, args, namedArgs );
769
800
break ;
770
801
case _MODE_METHOD_ :
771
- value = _instanceMirror.invoke (symbol, args).reflectee;
802
+ value = _instanceMirror.invoke (symbol, args, namedArgs ).reflectee;
772
803
break ;
773
804
default :
774
805
assert (false );
0 commit comments