Skip to content

Commit 4954a03

Browse files
authored
Event.message: accept String of Function to avoid String interpolation.
Since `Event` is a logging object, its construction should not allocate new `String` objects or perform `String` interpolation.
1 parent c9cb779 commit 4954a03

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,22 @@ enum ConstraintGenerationSource {
7777
/// Representation of a single event in the inference log, with pointers to any
7878
/// events that are nested beneath it.
7979
class Event {
80+
final Object _message;
81+
8082
/// 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+
}
8291

8392
/// List of nested events.
8493
List<Event>? subEvents;
8594

86-
Event({required this.message});
95+
Event({required Object message}) : _message = message;
8796
}
8897

8998
/// Specialization of [State] used when type inferring an expression.
@@ -392,7 +401,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
392401
pushState(new State(
393402
kind: StateKind.annotation,
394403
writer: this,
395-
message: 'INFER ANNOTATION ${describe(node)}',
404+
message: () => 'INFER ANNOTATION ${describe(node)}',
396405
nodeSet: [node]));
397406
}
398407

@@ -406,7 +415,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
406415
pushState(new State(
407416
kind: StateKind.constraintGeneration,
408417
writer: this,
409-
message: 'GENERATE CONSTRAINTS FOR $source: $p <# $q',
418+
message: () => 'GENERATE CONSTRAINTS FOR $source: $p <# $q',
410419
nodeSet: state.nodeSet));
411420
}
412421

@@ -415,15 +424,16 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
415424
pushState(new State(
416425
kind: StateKind.collectionElement,
417426
writer: this,
418-
message: 'INFER ELEMENT ${describe(node)}',
427+
message: () => 'INFER ELEMENT ${describe(node)}',
419428
nodeSet: [node]));
420429
}
421430

422431
@override
423432
void enterExpression(Object node, Type contextType) {
424433
pushState(new ExpressionState(
425434
writer: this,
426-
message: 'INFER EXPRESSION ${describe(node)} IN CONTEXT $contextType',
435+
message: () =>
436+
'INFER EXPRESSION ${describe(node)} IN CONTEXT $contextType',
427437
nodeSet: [node]));
428438
}
429439

@@ -432,7 +442,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
432442
pushState(new State(
433443
kind: StateKind.extensionOverride,
434444
writer: this,
435-
message: 'INFER EXTENSION OVERRIDE ${describe(node)} IN CONTEXT '
445+
message: () => 'INFER EXTENSION OVERRIDE ${describe(node)} IN CONTEXT '
436446
'$contextType',
437447
nodeSet: [node]));
438448
}
@@ -441,7 +451,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
441451
void enterFunctionExpressionInvocationTarget(Object node) {
442452
pushState(new ExpressionState(
443453
writer: this,
444-
message: 'REINTERPRET METHOD NAME ${describe(node)} AS AN EXPRESSION',
454+
message: () =>
455+
'REINTERPRET METHOD NAME ${describe(node)} AS AN EXPRESSION',
445456
nodeSet: [node]));
446457
}
447458

@@ -456,7 +467,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
456467
].join(', ');
457468
pushState(new GenericInferenceState(
458469
writer: this,
459-
message: 'FIND $typeFormalNames IN $template',
470+
message: () => 'FIND $typeFormalNames IN $template',
460471
parent: state,
461472
typeFormals: typeFormals));
462473
}
@@ -466,7 +477,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
466477
pushState(new State(
467478
kind: StateKind.lValue,
468479
writer: this,
469-
message: 'INFER LVALUE ${describe(node)}',
480+
message: () => 'INFER LVALUE ${describe(node)}',
470481
nodeSet: [node]));
471482
}
472483

@@ -475,7 +486,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
475486
pushState(new State(
476487
kind: StateKind.pattern,
477488
writer: this,
478-
message: 'INFER PATTERN ${describe(node)}',
489+
message: () => 'INFER PATTERN ${describe(node)}',
479490
nodeSet: [node]));
480491
}
481492

@@ -484,7 +495,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
484495
pushState(new State(
485496
kind: StateKind.statement,
486497
writer: this,
487-
message: 'INFER STATEMENT ${describe(node)}',
498+
message: () => 'INFER STATEMENT ${describe(node)}',
488499
nodeSet: [node]));
489500
}
490501

@@ -573,7 +584,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
573584
'${typeFormals[i]}=${finalTypes[i]}'
574585
];
575586
addEvent(new Event(
576-
message: 'FINAL GENERIC TYPES ${typeAssignments.join(', ')}'));
587+
message: () => 'FINAL GENERIC TYPES ${typeAssignments.join(', ')}'));
577588
}
578589
popState();
579590
}
@@ -620,7 +631,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
620631
/// an event showing the failure [message], and then an exception is thrown.
621632
Never fail(String message) {
622633
dump();
623-
addEvent(new Event(message: 'FAILURE: $message'));
634+
addEvent(new Event(message: () => 'FAILURE: $message'));
624635
throw new StateError(message);
625636
}
626637

@@ -655,7 +666,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
655666
expectedNode: oldExpression,
656667
expectedKind: StateKind.expression);
657668
addEvent(new Event(
658-
message: 'REWRITE ${describe(oldExpression)} TO '
669+
message: () => 'REWRITE ${describe(oldExpression)} TO '
659670
'${describe(newExpression)}'));
660671
(state as ExpressionState).nodeSet.add(newExpression);
661672
if (oldExpression != null) {
@@ -673,8 +684,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
673684
arguments: [expression],
674685
expectedNode: expression,
675686
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'));
678689
ExpressionState state = this.state as ExpressionState;
679690
if (state.typeRecorded) {
680691
fail('A type (or lack thereof) was already recorded for this expression');
@@ -693,7 +704,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
693704
expectedKind: StateKind.constraintGeneration);
694705
String constraintText =
695706
constraint.toString().replaceAll('<type>', parameter.toString());
696-
addEvent(new Event(message: 'ADDED CONSTRAINT $constraintText'));
707+
addEvent(new Event(message: () => 'ADDED CONSTRAINT $constraintText'));
697708
}
698709

699710
@override
@@ -714,7 +725,7 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
714725
expectedKind: StateKind.expression);
715726
String query =
716727
target != null ? '${describe(target)}.$methodName' : methodName;
717-
addEvent(new Event(message: 'LOOKUP $query FINDS $type'));
728+
addEvent(new Event(message: () => 'LOOKUP $query FINDS $type'));
718729
}
719730

720731
@override
@@ -728,7 +739,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
728739
for (int i = 0; i < types.length; i++) '${typeFormals[i]}=${types[i]}'
729740
];
730741
addEvent(new Event(
731-
message: 'PRELIMINARY GENERIC TYPES ${typeAssignments.join(', ')}'));
742+
message: () =>
743+
'PRELIMINARY GENERIC TYPES ${typeAssignments.join(', ')}'));
732744
}
733745

734746
@override
@@ -738,8 +750,8 @@ abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
738750
arguments: [expression, type],
739751
expectedNode: expression,
740752
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'));
743755
ExpressionState state = this.state as ExpressionState;
744756
if (state.typeRecorded) {
745757
fail('A type (or lack thereof) was already recorded for this expression');

0 commit comments

Comments
 (0)