From 4954a032c50a66d568affdd09e0b9409dce180c9 Mon Sep 17 00:00:00 2001 From: Graciliano Monteiro Passos Date: Tue, 13 Aug 2024 00:49:37 -0300 Subject: [PATCH 1/2] `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. --- .../type_inference/shared_inference_log.dart | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart index d99c77754856..b56296d1f025 100644 --- a/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart +++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart @@ -77,13 +77,22 @@ enum ConstraintGenerationSource { /// Representation of a single event in the inference log, with pointers to any /// events that are nested beneath it. class Event { + final Object _message; + /// Message display string. - final String message; + String get message { + var m = _message; + if (m is Function()) { + return m(); + } else { + return m.toString(); + } + } /// List of nested events. List? subEvents; - Event({required this.message}); + Event({required Object message}) : _message = message; } /// Specialization of [State] used when type inferring an expression. @@ -392,7 +401,7 @@ abstract class SharedInferenceLogWriterImpl, pushState(new State( kind: StateKind.annotation, writer: this, - message: 'INFER ANNOTATION ${describe(node)}', + message: () => 'INFER ANNOTATION ${describe(node)}', nodeSet: [node])); } @@ -406,7 +415,7 @@ abstract class SharedInferenceLogWriterImpl, pushState(new State( kind: StateKind.constraintGeneration, writer: this, - message: 'GENERATE CONSTRAINTS FOR $source: $p <# $q', + message: () => 'GENERATE CONSTRAINTS FOR $source: $p <# $q', nodeSet: state.nodeSet)); } @@ -415,7 +424,7 @@ abstract class SharedInferenceLogWriterImpl, pushState(new State( kind: StateKind.collectionElement, writer: this, - message: 'INFER ELEMENT ${describe(node)}', + message: () => 'INFER ELEMENT ${describe(node)}', nodeSet: [node])); } @@ -423,7 +432,8 @@ abstract class SharedInferenceLogWriterImpl, void enterExpression(Object node, Type contextType) { pushState(new ExpressionState( writer: this, - message: 'INFER EXPRESSION ${describe(node)} IN CONTEXT $contextType', + message: () => + 'INFER EXPRESSION ${describe(node)} IN CONTEXT $contextType', nodeSet: [node])); } @@ -432,7 +442,7 @@ abstract class SharedInferenceLogWriterImpl, pushState(new State( kind: StateKind.extensionOverride, writer: this, - message: 'INFER EXTENSION OVERRIDE ${describe(node)} IN CONTEXT ' + message: () => 'INFER EXTENSION OVERRIDE ${describe(node)} IN CONTEXT ' '$contextType', nodeSet: [node])); } @@ -441,7 +451,8 @@ abstract class SharedInferenceLogWriterImpl, void enterFunctionExpressionInvocationTarget(Object node) { pushState(new ExpressionState( writer: this, - message: 'REINTERPRET METHOD NAME ${describe(node)} AS AN EXPRESSION', + message: () => + 'REINTERPRET METHOD NAME ${describe(node)} AS AN EXPRESSION', nodeSet: [node])); } @@ -456,7 +467,7 @@ abstract class SharedInferenceLogWriterImpl, ].join(', '); pushState(new GenericInferenceState( writer: this, - message: 'FIND $typeFormalNames IN $template', + message: () => 'FIND $typeFormalNames IN $template', parent: state, typeFormals: typeFormals)); } @@ -466,7 +477,7 @@ abstract class SharedInferenceLogWriterImpl, pushState(new State( kind: StateKind.lValue, writer: this, - message: 'INFER LVALUE ${describe(node)}', + message: () => 'INFER LVALUE ${describe(node)}', nodeSet: [node])); } @@ -475,7 +486,7 @@ abstract class SharedInferenceLogWriterImpl, pushState(new State( kind: StateKind.pattern, writer: this, - message: 'INFER PATTERN ${describe(node)}', + message: () => 'INFER PATTERN ${describe(node)}', nodeSet: [node])); } @@ -484,7 +495,7 @@ abstract class SharedInferenceLogWriterImpl, pushState(new State( kind: StateKind.statement, writer: this, - message: 'INFER STATEMENT ${describe(node)}', + message: () => 'INFER STATEMENT ${describe(node)}', nodeSet: [node])); } @@ -573,7 +584,7 @@ abstract class SharedInferenceLogWriterImpl, '${typeFormals[i]}=${finalTypes[i]}' ]; addEvent(new Event( - message: 'FINAL GENERIC TYPES ${typeAssignments.join(', ')}')); + message: () => 'FINAL GENERIC TYPES ${typeAssignments.join(', ')}')); } popState(); } @@ -620,7 +631,7 @@ abstract class SharedInferenceLogWriterImpl, /// an event showing the failure [message], and then an exception is thrown. Never fail(String message) { dump(); - addEvent(new Event(message: 'FAILURE: $message')); + addEvent(new Event(message: () => 'FAILURE: $message')); throw new StateError(message); } @@ -655,7 +666,7 @@ abstract class SharedInferenceLogWriterImpl, expectedNode: oldExpression, expectedKind: StateKind.expression); addEvent(new Event( - message: 'REWRITE ${describe(oldExpression)} TO ' + message: () => 'REWRITE ${describe(oldExpression)} TO ' '${describe(newExpression)}')); (state as ExpressionState).nodeSet.add(newExpression); if (oldExpression != null) { @@ -673,8 +684,8 @@ abstract class SharedInferenceLogWriterImpl, arguments: [expression], expectedNode: expression, expectedKind: StateKind.expression); - addEvent( - new Event(message: 'EXPRESSION ${describe(expression)} HAS NO TYPE')); + addEvent(new Event( + message: () => 'EXPRESSION ${describe(expression)} HAS NO TYPE')); ExpressionState state = this.state as ExpressionState; if (state.typeRecorded) { fail('A type (or lack thereof) was already recorded for this expression'); @@ -693,7 +704,7 @@ abstract class SharedInferenceLogWriterImpl, expectedKind: StateKind.constraintGeneration); String constraintText = constraint.toString().replaceAll('', parameter.toString()); - addEvent(new Event(message: 'ADDED CONSTRAINT $constraintText')); + addEvent(new Event(message: () => 'ADDED CONSTRAINT $constraintText')); } @override @@ -714,7 +725,7 @@ abstract class SharedInferenceLogWriterImpl, expectedKind: StateKind.expression); String query = target != null ? '${describe(target)}.$methodName' : methodName; - addEvent(new Event(message: 'LOOKUP $query FINDS $type')); + addEvent(new Event(message: () => 'LOOKUP $query FINDS $type')); } @override @@ -728,7 +739,8 @@ abstract class SharedInferenceLogWriterImpl, for (int i = 0; i < types.length; i++) '${typeFormals[i]}=${types[i]}' ]; addEvent(new Event( - message: 'PRELIMINARY GENERIC TYPES ${typeAssignments.join(', ')}')); + message: () => + 'PRELIMINARY GENERIC TYPES ${typeAssignments.join(', ')}')); } @override @@ -738,8 +750,8 @@ abstract class SharedInferenceLogWriterImpl, arguments: [expression, type], expectedNode: expression, expectedKind: StateKind.expression); - addEvent( - new Event(message: 'STATIC TYPE OF ${describe(expression)} IS $type')); + addEvent(new Event( + message: () => 'STATIC TYPE OF ${describe(expression)} IS $type')); ExpressionState state = this.state as ExpressionState; if (state.typeRecorded) { fail('A type (or lack thereof) was already recorded for this expression'); From 8aab254bc350e8d7c62965e42529db9b91fa768a Mon Sep 17 00:00:00 2001 From: Graciliano Monteiro Passos Date: Tue, 13 Aug 2024 01:12:38 -0300 Subject: [PATCH 2/2] `shared_inference_log.dart`: optimize `message` functions. --- .../type_inference/shared_inference_log.dart | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart index b56296d1f025..7b57f860152a 100644 --- a/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart +++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart @@ -702,9 +702,11 @@ abstract class SharedInferenceLogWriterImpl, method: 'recordGeneratedConstraint', arguments: [parameter, constraint], expectedKind: StateKind.constraintGeneration); - String constraintText = - constraint.toString().replaceAll('', parameter.toString()); - addEvent(new Event(message: () => 'ADDED CONSTRAINT $constraintText')); + addEvent(new Event(message: () { + String constraintText = + constraint.toString().replaceAll('', parameter.toString()); + return 'ADDED CONSTRAINT $constraintText'; + })); } @override @@ -734,13 +736,13 @@ abstract class SharedInferenceLogWriterImpl, method: 'recordPreliminaryTypes', arguments: [types], expectedKind: StateKind.genericInference); - List typeFormals = (state as GenericInferenceState).typeFormals; - List typeAssignments = [ - for (int i = 0; i < types.length; i++) '${typeFormals[i]}=${types[i]}' - ]; - addEvent(new Event( - message: () => - 'PRELIMINARY GENERIC TYPES ${typeAssignments.join(', ')}')); + addEvent(new Event(message: () { + List typeFormals = (state as GenericInferenceState).typeFormals; + List typeAssignments = [ + for (int i = 0; i < types.length; i++) '${typeFormals[i]}=${types[i]}' + ]; + return 'PRELIMINARY GENERIC TYPES ${typeAssignments.join(', ')}'; + })); } @override