@@ -77,13 +77,22 @@ enum ConstraintGenerationSource {
77
77
/// Representation of a single event in the inference log, with pointers to any
78
78
/// events that are nested beneath it.
79
79
class Event {
80
+ final Object _message;
81
+
80
82
/// Message display string.
81
- final String message;
83
+ String get message {
84
+ var m = _message;
85
+ if (m is Function ()) {
86
+ return m ();
87
+ } else {
88
+ return m.toString ();
89
+ }
90
+ }
82
91
83
92
/// List of nested events.
84
93
List <Event >? subEvents;
85
94
86
- Event ({required this . message});
95
+ Event ({required Object message}) : _message = message ;
87
96
}
88
97
89
98
/// Specialization of [State] used when type inferring an expression.
@@ -392,7 +401,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
392
401
pushState (new State (
393
402
kind: StateKind .annotation,
394
403
writer: this ,
395
- message: 'INFER ANNOTATION ${describe (node )}' ,
404
+ message: () => 'INFER ANNOTATION ${describe (node )}' ,
396
405
nodeSet: [node]));
397
406
}
398
407
@@ -406,7 +415,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
406
415
pushState (new State (
407
416
kind: StateKind .constraintGeneration,
408
417
writer: this ,
409
- message: 'GENERATE CONSTRAINTS FOR $source : $p <# $q ' ,
418
+ message: () => 'GENERATE CONSTRAINTS FOR $source : $p <# $q ' ,
410
419
nodeSet: state.nodeSet));
411
420
}
412
421
@@ -415,15 +424,16 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
415
424
pushState (new State (
416
425
kind: StateKind .collectionElement,
417
426
writer: this ,
418
- message: 'INFER ELEMENT ${describe (node )}' ,
427
+ message: () => 'INFER ELEMENT ${describe (node )}' ,
419
428
nodeSet: [node]));
420
429
}
421
430
422
431
@override
423
432
void enterExpression (Object node, Type contextType) {
424
433
pushState (new ExpressionState (
425
434
writer: this ,
426
- message: 'INFER EXPRESSION ${describe (node )} IN CONTEXT $contextType ' ,
435
+ message: () =>
436
+ 'INFER EXPRESSION ${describe (node )} IN CONTEXT $contextType ' ,
427
437
nodeSet: [node]));
428
438
}
429
439
@@ -432,7 +442,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
432
442
pushState (new State (
433
443
kind: StateKind .extensionOverride,
434
444
writer: this ,
435
- message: 'INFER EXTENSION OVERRIDE ${describe (node )} IN CONTEXT '
445
+ message: () => 'INFER EXTENSION OVERRIDE ${describe (node )} IN CONTEXT '
436
446
'$contextType ' ,
437
447
nodeSet: [node]));
438
448
}
@@ -441,7 +451,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
441
451
void enterFunctionExpressionInvocationTarget (Object node) {
442
452
pushState (new ExpressionState (
443
453
writer: this ,
444
- message: 'REINTERPRET METHOD NAME ${describe (node )} AS AN EXPRESSION' ,
454
+ message: () =>
455
+ 'REINTERPRET METHOD NAME ${describe (node )} AS AN EXPRESSION' ,
445
456
nodeSet: [node]));
446
457
}
447
458
@@ -456,7 +467,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
456
467
].join (', ' );
457
468
pushState (new GenericInferenceState (
458
469
writer: this ,
459
- message: 'FIND $typeFormalNames IN $template ' ,
470
+ message: () => 'FIND $typeFormalNames IN $template ' ,
460
471
parent: state,
461
472
typeFormals: typeFormals));
462
473
}
@@ -466,7 +477,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
466
477
pushState (new State (
467
478
kind: StateKind .lValue,
468
479
writer: this ,
469
- message: 'INFER LVALUE ${describe (node )}' ,
480
+ message: () => 'INFER LVALUE ${describe (node )}' ,
470
481
nodeSet: [node]));
471
482
}
472
483
@@ -475,7 +486,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
475
486
pushState (new State (
476
487
kind: StateKind .pattern,
477
488
writer: this ,
478
- message: 'INFER PATTERN ${describe (node )}' ,
489
+ message: () => 'INFER PATTERN ${describe (node )}' ,
479
490
nodeSet: [node]));
480
491
}
481
492
@@ -484,7 +495,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
484
495
pushState (new State (
485
496
kind: StateKind .statement,
486
497
writer: this ,
487
- message: 'INFER STATEMENT ${describe (node )}' ,
498
+ message: () => 'INFER STATEMENT ${describe (node )}' ,
488
499
nodeSet: [node]));
489
500
}
490
501
@@ -573,7 +584,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
573
584
'${typeFormals [i ]}=${finalTypes [i ]}'
574
585
];
575
586
addEvent (new Event (
576
- message: 'FINAL GENERIC TYPES ${typeAssignments .join (', ' )}' ));
587
+ message: () => 'FINAL GENERIC TYPES ${typeAssignments .join (', ' )}' ));
577
588
}
578
589
popState ();
579
590
}
@@ -620,7 +631,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
620
631
/// an event showing the failure [message] , and then an exception is thrown.
621
632
Never fail (String message) {
622
633
dump ();
623
- addEvent (new Event (message: 'FAILURE: $message ' ));
634
+ addEvent (new Event (message: () => 'FAILURE: $message ' ));
624
635
throw new StateError (message);
625
636
}
626
637
@@ -655,7 +666,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
655
666
expectedNode: oldExpression,
656
667
expectedKind: StateKind .expression);
657
668
addEvent (new Event (
658
- message: 'REWRITE ${describe (oldExpression )} TO '
669
+ message: () => 'REWRITE ${describe (oldExpression )} TO '
659
670
'${describe (newExpression )}' ));
660
671
(state as ExpressionState ).nodeSet.add (newExpression);
661
672
if (oldExpression != null ) {
@@ -673,8 +684,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
673
684
arguments: [expression],
674
685
expectedNode: expression,
675
686
expectedKind: StateKind .expression);
676
- addEvent (
677
- new Event ( message: 'EXPRESSION ${describe (expression )} HAS NO TYPE' ));
687
+ addEvent (new Event (
688
+ message: () => 'EXPRESSION ${describe (expression )} HAS NO TYPE' ));
678
689
ExpressionState state = this .state as ExpressionState ;
679
690
if (state.typeRecorded) {
680
691
fail ('A type (or lack thereof) was already recorded for this expression' );
@@ -693,7 +704,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
693
704
expectedKind: StateKind .constraintGeneration);
694
705
String constraintText =
695
706
constraint.toString ().replaceAll ('<type>' , parameter.toString ());
696
- addEvent (new Event (message: 'ADDED CONSTRAINT $constraintText ' ));
707
+ addEvent (new Event (message: () => 'ADDED CONSTRAINT $constraintText ' ));
697
708
}
698
709
699
710
@override
@@ -714,7 +725,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
714
725
expectedKind: StateKind .expression);
715
726
String query =
716
727
target != null ? '${describe (target )}.$methodName ' : methodName;
717
- addEvent (new Event (message: 'LOOKUP $query FINDS $type ' ));
728
+ addEvent (new Event (message: () => 'LOOKUP $query FINDS $type ' ));
718
729
}
719
730
720
731
@override
@@ -728,7 +739,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
728
739
for (int i = 0 ; i < types.length; i++ ) '${typeFormals [i ]}=${types [i ]}'
729
740
];
730
741
addEvent (new Event (
731
- message: 'PRELIMINARY GENERIC TYPES ${typeAssignments .join (', ' )}' ));
742
+ message: () =>
743
+ 'PRELIMINARY GENERIC TYPES ${typeAssignments .join (', ' )}' ));
732
744
}
733
745
734
746
@override
@@ -738,8 +750,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
738
750
arguments: [expression, type],
739
751
expectedNode: expression,
740
752
expectedKind: StateKind .expression);
741
- addEvent (
742
- new Event ( message: 'STATIC TYPE OF ${describe (expression )} IS $type ' ));
753
+ addEvent (new Event (
754
+ message: () => 'STATIC TYPE OF ${describe (expression )} IS $type ' ));
743
755
ExpressionState state = this .state as ExpressionState ;
744
756
if (state.typeRecorded) {
745
757
fail ('A type (or lack thereof) was already recorded for this expression' );
0 commit comments