From 945978f5c016a0bf981fcea3700c28a684ddaa8e Mon Sep 17 00:00:00 2001 From: Erik Ernst Date: Thu, 21 May 2026 04:22:30 -0700 Subject: [PATCH] Change code generation for `dart2js` to enable capturing This CL changes the code generation for `dart2js` (and not for any other backend) such that the variable holding the receiver of an anonymous method invocation is declared as a normal local variable rather than being a `Let` variable. This is needed because `dart2js` supports capturing the former, but not the latter. Change-Id: I054805f7006306186f2c6dfe36d7162b42293ae1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/503420 Reviewed-by: Stephen Adams Commit-Queue: Erik Ernst Reviewed-by: Johnni Winther SLSA-Policy-Verified: SLSA Policy Verification Service --- .../lib/src/kernel/dart2js_target.dart | 3 + .../lib/src/kernel/body_builder.dart | 17 +++- .../src/type_inference/inference_visitor.dart | 30 ++++++- .../test/spell_checking_list_common.txt | 1 + ...ll_aware_with_parameter.dart.strong.expect | 14 +-- ..._with_parameter.dart.strong.modular.expect | 14 +-- ...h_parameter.dart.strong.transformed.expect | 14 +-- ...aware_without_parameter.dart.strong.expect | 16 ++-- ...thout_parameter.dart.strong.modular.expect | 16 ++-- ...t_parameter.dart.strong.transformed.expect | 16 ++-- ...caded_without_parameter.dart.strong.expect | 16 ++-- ...thout_parameter.dart.strong.modular.expect | 16 ++-- ...t_parameter.dart.strong.transformed.expect | 16 ++-- ...ession_explicitly_typed.dart.strong.expect | 14 +-- ...xplicitly_typed.dart.strong.modular.expect | 14 +-- ...citly_typed.dart.strong.transformed.expect | 14 +-- ...xplicitly_wrongly_typed.dart.strong.expect | 18 ++-- ...y_wrongly_typed.dart.strong.modular.expect | 18 ++-- ...ession_extension_method.dart.strong.expect | 28 +++--- ...xtension_method.dart.strong.modular.expect | 28 +++--- ...sion_method.dart.strong.transformed.expect | 28 +++--- ...ll_aware_with_parameter.dart.strong.expect | 6 +- ..._with_parameter.dart.strong.modular.expect | 6 +- ...h_parameter.dart.strong.transformed.expect | 6 +- ...aware_without_parameter.dart.strong.expect | 8 +- ...thout_parameter.dart.strong.modular.expect | 8 +- ...t_parameter.dart.strong.transformed.expect | 8 +- ...ion_this_in_initializer.dart.strong.expect | 8 +- ..._in_initializer.dart.strong.modular.expect | 8 +- ...initializer.dart.strong.transformed.expect | 8 +- ...xpression_void_receiver.dart.strong.expect | 40 ++++----- ...n_void_receiver.dart.strong.modular.expect | 40 ++++----- ...id_receiver.dart.strong.transformed.expect | 40 ++++----- ...ssion_without_parameter.dart.strong.expect | 8 +- ...thout_parameter.dart.strong.modular.expect | 8 +- ...t_parameter.dart.strong.transformed.expect | 8 +- ...on_cascaded_null_aware_with_parameter.dart | 11 +++ ...ll_aware_with_parameter.dart.strong.expect | 28 ++++++ ..._with_parameter.dart.strong.modular.expect | 28 ++++++ ..._with_parameter.dart.strong.outline.expect | 7 ++ ...h_parameter.dart.strong.transformed.expect | 28 ++++++ ...with_parameter.dart.textual_outline.expect | 3 + ...meter.dart.textual_outline_modelled.expect | 3 + ...cascaded_null_aware_without_parameter.dart | 12 +++ ...aware_without_parameter.dart.strong.expect | 35 ++++++++ ...thout_parameter.dart.strong.modular.expect | 35 ++++++++ ...thout_parameter.dart.strong.outline.expect | 7 ++ ...t_parameter.dart.strong.transformed.expect | 35 ++++++++ ...hout_parameter.dart.textual_outline.expect | 3 + ...meter.dart.textual_outline_modelled.expect | 3 + .../expression_cascaded_with_parameter.dart | 9 ++ ...cascaded_with_parameter.dart.strong.expect | 27 ++++++ ..._with_parameter.dart.strong.modular.expect | 27 ++++++ ..._with_parameter.dart.strong.outline.expect | 5 ++ ...h_parameter.dart.strong.transformed.expect | 37 ++++++++ ...with_parameter.dart.textual_outline.expect | 1 + ...meter.dart.textual_outline_modelled.expect | 1 + ...expression_cascaded_without_parameter.dart | 10 +++ ...caded_without_parameter.dart.strong.expect | 34 ++++++++ ...thout_parameter.dart.strong.modular.expect | 34 ++++++++ ...thout_parameter.dart.strong.outline.expect | 5 ++ ...t_parameter.dart.strong.transformed.expect | 46 ++++++++++ ...hout_parameter.dart.textual_outline.expect | 1 + ...meter.dart.textual_outline_modelled.expect | 1 + .../expression_explicitly_typed.dart | 10 +++ ...ession_explicitly_typed.dart.strong.expect | 30 +++++++ ...xplicitly_typed.dart.strong.modular.expect | 30 +++++++ ...xplicitly_typed.dart.strong.outline.expect | 5 ++ ...citly_typed.dart.strong.transformed.expect | 44 ++++++++++ ...plicitly_typed.dart.textual_outline.expect | 1 + ...typed.dart.textual_outline_modelled.expect | 1 + .../expression_extension_method.dart | 20 +++++ ...ession_extension_method.dart.strong.expect | 63 ++++++++++++++ ...xtension_method.dart.strong.modular.expect | 63 ++++++++++++++ ...xtension_method.dart.strong.outline.expect | 14 +++ ...sion_method.dart.strong.transformed.expect | 87 +++++++++++++++++++ ...tension_method.dart.textual_outline.expect | 5 ++ ...ethod.dart.textual_outline_modelled.expect | 5 ++ .../expression_null_aware_with_parameter.dart | 11 +++ ...ll_aware_with_parameter.dart.strong.expect | 22 +++++ ..._with_parameter.dart.strong.modular.expect | 22 +++++ ..._with_parameter.dart.strong.outline.expect | 7 ++ ...h_parameter.dart.strong.transformed.expect | 22 +++++ ...with_parameter.dart.textual_outline.expect | 3 + ...meter.dart.textual_outline_modelled.expect | 3 + ...pression_null_aware_without_parameter.dart | 12 +++ ...aware_without_parameter.dart.strong.expect | 27 ++++++ ...thout_parameter.dart.strong.modular.expect | 27 ++++++ ...thout_parameter.dart.strong.outline.expect | 7 ++ ...t_parameter.dart.strong.transformed.expect | 27 ++++++ ...hout_parameter.dart.textual_outline.expect | 3 + ...meter.dart.textual_outline_modelled.expect | 3 + .../expression_this_in_initializer.dart | 20 +++++ ...ion_this_in_initializer.dart.strong.expect | 55 ++++++++++++ ..._in_initializer.dart.strong.modular.expect | 55 ++++++++++++ ..._in_initializer.dart.strong.outline.expect | 27 ++++++ ...initializer.dart.strong.transformed.expect | 55 ++++++++++++ ...in_initializer.dart.textual_outline.expect | 11 +++ ...lizer.dart.textual_outline_modelled.expect | 11 +++ .../expression_with_parameter.dart | 9 ++ ...pression_with_parameter.dart.strong.expect | 21 +++++ ..._with_parameter.dart.strong.modular.expect | 21 +++++ ..._with_parameter.dart.strong.outline.expect | 5 ++ ...h_parameter.dart.strong.transformed.expect | 21 +++++ ...with_parameter.dart.textual_outline.expect | 1 + ...meter.dart.textual_outline_modelled.expect | 1 + .../expression_without_parameter.dart | 10 +++ ...ssion_without_parameter.dart.strong.expect | 26 ++++++ ...thout_parameter.dart.strong.modular.expect | 26 ++++++ ...thout_parameter.dart.strong.outline.expect | 5 ++ ...t_parameter.dart.strong.transformed.expect | 26 ++++++ ...hout_parameter.dart.textual_outline.expect | 1 + ...meter.dart.textual_outline_modelled.expect | 1 + .../dart2js/anonymous_methods/folder.options | 2 + pkg/kernel/lib/target/targets.dart | 7 ++ .../anonymous_methods/block/error_test.dart | 13 +++ .../expression/extension_member_test.dart | 26 +++++- 117 files changed, 1802 insertions(+), 265 deletions(-) create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/anonymous_methods/folder.options diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart index 07afceb9b57..e32c0675076 100644 --- a/pkg/compiler/lib/src/kernel/dart2js_target.dart +++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart @@ -97,6 +97,9 @@ class Dart2jsTarget extends Target { @override bool get supportsExplicitGetterCalls => false; + @override + bool get supportsLetVariableCapture => false; + @override int get enabledConstructorTearOffLowerings => ConstructorTearOffLowering.all; diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index a8633fb20e9..bc81971b2a4 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart @@ -8037,11 +8037,20 @@ class BodyBuilderImpl extends StackListenerImpl @override void handleImplicitFormalParameters(Token punctuation) { debugEvent("handleImplicitFormalParameters"); - Token token = punctuation; // fallback offset Expression receiver = toValue(peek()); - Variable variable = intern.createVariableDeclarationForValue(receiver) - ..isSynthesized = true; - variable.fileOffset = offsetForToken(token); + Variable variable; + // If `variable` is captured in a nested function literal, dart2js + // requires the variable to have a name. It is sufficient to use + // `anonymous#this` because no user-written variable can have that name, + // and we never have access to more than one of these variables. It does + // not disrupt other backends that this name exists. + variable = intern.createVariableDeclaration( + offsetForToken(punctuation), + "anonymous#this", + initializer: receiver, + isFinal: true, + isSynthesized: true, + ); _thisVariables.push(variable); _parameterlessAnonymousMethodDepth++; diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/type_inference/inference_visitor.dart index 24fca469f96..66c8ddf5d57 100644 --- a/pkg/front_end/lib/src/type_inference/inference_visitor.dart +++ b/pkg/front_end/lib/src/type_inference/inference_visitor.dart @@ -11876,11 +11876,34 @@ class InferenceVisitorImpl extends InferenceVisitorBase body = bodyResult.expression; } + Expression createLetOrBlock() { + if (!libraryBuilder + .loader + .target + .backendTarget + .supportsLetVariableCapture) { + Variable resultVar = new Variable(null, isSynthesized: true) + ..type = inferredType + ..fileOffset = node.fileOffset; + return new BlockExpression( + new Block([ + extern.createVariableStatement(node.variable), + extern.createVariableStatement(resultVar), + new ExpressionStatement(new VariableSet(resultVar, body)) + ..fileOffset = node.fileOffset, + ]), + new VariableGet(resultVar), + )..fileOffset = node.fileOffset; + } else { + return new Let(node.variable, body)..fileOffset = node.fileOffset; + } + } + Expression replacement; if (node.isNullAware) { Variable tempVar = new Variable( - null, + "anonymous#receiver", initializer: node.variable.initializer!, isSynthesized: true, ) @@ -11895,8 +11918,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase ..fileOffset = node.fileOffset ..parent = node.variable; - Expression elseExpression = new Let(node.variable, body) - ..fileOffset = node.fileOffset; + Expression elseExpression = createLetOrBlock(); replacement = new Let( tempVar, @@ -11910,7 +11932,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase inferredType = inferredType.withDeclaredNullability(Nullability.nullable); } else { - replacement = new Let(node.variable, body)..fileOffset = node.fileOffset; + replacement = createLetOrBlock(); } if (node.isParameterless) { diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt index 572be2bcb4a..56652ecb738 100644 --- a/pkg/front_end/test/spell_checking_list_common.txt +++ b/pkg/front_end/test/spell_checking_list_common.txt @@ -953,6 +953,7 @@ display displayed displaying disregard +disrupt distance distinct distinction diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect index 30fbf432d1a..19bc6e7e0e3 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect @@ -5,12 +5,12 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { - let core::int #t2 = #t1{core::int} in #t2 == null ?{core::int?} null : let core::int p = #t2 as core::int in let dynamic #t3 = 1 in p; + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t2 = 1 in p; } =>#t1; - let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { - let core::int #t5 = #t4{core::int} in #t5 == null ?{core::int?} null : let core::int p = #t5 as core::int in let dynamic #t6 = p in p; - } =>#t4; - let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { - let core::int #t8 = #t7{core::int} in #t8 == null ?{core::int?} null : let core::int p = #t8 as core::int in let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; - } =>#t7; + let final core::int? #t3 = self::i in #t3 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t3{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t4 = p in p; + } =>#t3; + let final core::int? #t5 = self::i in #t5 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t5{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t6 = p.{core::int::isEven}{core::bool} in p; + } =>#t5; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect index 30fbf432d1a..19bc6e7e0e3 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect @@ -5,12 +5,12 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { - let core::int #t2 = #t1{core::int} in #t2 == null ?{core::int?} null : let core::int p = #t2 as core::int in let dynamic #t3 = 1 in p; + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t2 = 1 in p; } =>#t1; - let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { - let core::int #t5 = #t4{core::int} in #t5 == null ?{core::int?} null : let core::int p = #t5 as core::int in let dynamic #t6 = p in p; - } =>#t4; - let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { - let core::int #t8 = #t7{core::int} in #t8 == null ?{core::int?} null : let core::int p = #t8 as core::int in let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; - } =>#t7; + let final core::int? #t3 = self::i in #t3 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t3{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t4 = p in p; + } =>#t3; + let final core::int? #t5 = self::i in #t5 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t5{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t6 = p.{core::int::isEven}{core::bool} in p; + } =>#t5; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect index b92564c980e..97c06df06ed 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect @@ -5,12 +5,12 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { - let core::int #t2 = #t1{core::int} in #t2 == null ?{core::int?} null : let core::int p = #t2 as{Unchecked} core::int in let dynamic #t3 = 1 in p; + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as{Unchecked} core::int in let dynamic #t2 = 1 in p; } =>#t1; - let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { - let core::int #t5 = #t4{core::int} in #t5 == null ?{core::int?} null : let core::int p = #t5 as{Unchecked} core::int in let dynamic #t6 = p in p; - } =>#t4; - let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { - let core::int #t8 = #t7{core::int} in #t8 == null ?{core::int?} null : let core::int p = #t8 as{Unchecked} core::int in let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; - } =>#t7; + let final core::int? #t3 = self::i in #t3 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t3{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as{Unchecked} core::int in let dynamic #t4 = p in p; + } =>#t3; + let final core::int? #t5 = self::i in #t5 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t5{core::int} in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as{Unchecked} core::int in let dynamic #t6 = p.{core::int::isEven}{core::bool} in p; + } =>#t5; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect index a291e07095c..ca236b8e862 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect @@ -5,15 +5,15 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { - let core::int #t2 = #t1{core::int} in #t2 == null ?{core::int?} null : let final core::int #t3 = #t2 as core::int in let dynamic #t4 = 1 in #t3; + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t2 = 1 in anonymous#this; } =>#t1; + let final core::int? #t3 = self::i in #t3 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t3{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t4 = anonymous#this in anonymous#this; + } =>#t3; let final core::int? #t5 = self::i in #t5 == null ?{core::int?} null : block { - let core::int #t6 = #t5{core::int} in #t6 == null ?{core::int?} null : let final core::int #t7 = #t6 as core::int in let dynamic #t8 = #t7 in #t7; + let synthesized core::int anonymous#receiver = #t5{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t6 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; } =>#t5; - let final core::int? #t9 = self::i in #t9 == null ?{core::int?} null : block { - let core::int #t10 = #t9{core::int} in #t10 == null ?{core::int?} null : let final core::int #t11 = #t10 as core::int in let dynamic #t12 = #t11.{core::int::isEven}{core::bool} in #t11; - } =>#t9; - let final core::int? #t13 = self::i in #t13 == null ?{core::int?} null : block { - let core::int #t14 = #t13{core::int} in #t14 == null ?{core::int?} null : let final core::int #t15 = #t14 as core::int in let dynamic #t16 = #t15.{core::int::isEven}{core::bool} in #t15; - } =>#t13; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t8 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t7; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect index a291e07095c..ca236b8e862 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect @@ -5,15 +5,15 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { - let core::int #t2 = #t1{core::int} in #t2 == null ?{core::int?} null : let final core::int #t3 = #t2 as core::int in let dynamic #t4 = 1 in #t3; + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t2 = 1 in anonymous#this; } =>#t1; + let final core::int? #t3 = self::i in #t3 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t3{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t4 = anonymous#this in anonymous#this; + } =>#t3; let final core::int? #t5 = self::i in #t5 == null ?{core::int?} null : block { - let core::int #t6 = #t5{core::int} in #t6 == null ?{core::int?} null : let final core::int #t7 = #t6 as core::int in let dynamic #t8 = #t7 in #t7; + let synthesized core::int anonymous#receiver = #t5{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t6 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; } =>#t5; - let final core::int? #t9 = self::i in #t9 == null ?{core::int?} null : block { - let core::int #t10 = #t9{core::int} in #t10 == null ?{core::int?} null : let final core::int #t11 = #t10 as core::int in let dynamic #t12 = #t11.{core::int::isEven}{core::bool} in #t11; - } =>#t9; - let final core::int? #t13 = self::i in #t13 == null ?{core::int?} null : block { - let core::int #t14 = #t13{core::int} in #t14 == null ?{core::int?} null : let final core::int #t15 = #t14 as core::int in let dynamic #t16 = #t15.{core::int::isEven}{core::bool} in #t15; - } =>#t13; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t8 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t7; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect index df6274ab19f..7bbed14a09f 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect @@ -5,15 +5,15 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { - let core::int #t2 = #t1{core::int} in #t2 == null ?{core::int?} null : let final core::int #t3 = #t2 as{Unchecked} core::int in let dynamic #t4 = 1 in #t3; + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as{Unchecked} core::int in let dynamic #t2 = 1 in anonymous#this; } =>#t1; + let final core::int? #t3 = self::i in #t3 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t3{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as{Unchecked} core::int in let dynamic #t4 = anonymous#this in anonymous#this; + } =>#t3; let final core::int? #t5 = self::i in #t5 == null ?{core::int?} null : block { - let core::int #t6 = #t5{core::int} in #t6 == null ?{core::int?} null : let final core::int #t7 = #t6 as{Unchecked} core::int in let dynamic #t8 = #t7 in #t7; + let synthesized core::int anonymous#receiver = #t5{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as{Unchecked} core::int in let dynamic #t6 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; } =>#t5; - let final core::int? #t9 = self::i in #t9 == null ?{core::int?} null : block { - let core::int #t10 = #t9{core::int} in #t10 == null ?{core::int?} null : let final core::int #t11 = #t10 as{Unchecked} core::int in let dynamic #t12 = #t11.{core::int::isEven}{core::bool} in #t11; - } =>#t9; - let final core::int? #t13 = self::i in #t13 == null ?{core::int?} null : block { - let core::int #t14 = #t13{core::int} in #t14 == null ?{core::int?} null : let final core::int #t15 = #t14 as{Unchecked} core::int in let dynamic #t16 = #t15.{core::int::isEven}{core::bool} in #t15; - } =>#t13; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as{Unchecked} core::int in let dynamic #t8 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t7; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect index e301b05bf62..617d30a8d1c 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect @@ -4,15 +4,15 @@ import "dart:core" as core; static method main() → void { let final core::int #t1 = 1 in block { - let final core::int #t2 = #t1 in let dynamic #t3 = 1 in #t2; + let final synthesized core::int anonymous#this = #t1 in let dynamic #t2 = 1 in anonymous#this; } =>#t1; - let final core::int #t4 = 1 in block { - let final core::int #t5 = #t4 in let dynamic #t6 = #t5 in #t5; - } =>#t4; + let final core::int #t3 = 1 in block { + let final synthesized core::int anonymous#this = #t3 in let dynamic #t4 = anonymous#this in anonymous#this; + } =>#t3; + let final core::int #t5 = 1 in block { + let final synthesized core::int anonymous#this = #t5 in let dynamic #t6 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t5; let final core::int #t7 = 1 in block { - let final core::int #t8 = #t7 in let dynamic #t9 = #t8.{core::int::isEven}{core::bool} in #t8; + let final synthesized core::int anonymous#this = #t7 in let dynamic #t8 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; } =>#t7; - let final core::int #t10 = 1 in block { - let final core::int #t11 = #t10 in let dynamic #t12 = #t11.{core::int::isEven}{core::bool} in #t11; - } =>#t10; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect index e301b05bf62..617d30a8d1c 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect @@ -4,15 +4,15 @@ import "dart:core" as core; static method main() → void { let final core::int #t1 = 1 in block { - let final core::int #t2 = #t1 in let dynamic #t3 = 1 in #t2; + let final synthesized core::int anonymous#this = #t1 in let dynamic #t2 = 1 in anonymous#this; } =>#t1; - let final core::int #t4 = 1 in block { - let final core::int #t5 = #t4 in let dynamic #t6 = #t5 in #t5; - } =>#t4; + let final core::int #t3 = 1 in block { + let final synthesized core::int anonymous#this = #t3 in let dynamic #t4 = anonymous#this in anonymous#this; + } =>#t3; + let final core::int #t5 = 1 in block { + let final synthesized core::int anonymous#this = #t5 in let dynamic #t6 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t5; let final core::int #t7 = 1 in block { - let final core::int #t8 = #t7 in let dynamic #t9 = #t8.{core::int::isEven}{core::bool} in #t8; + let final synthesized core::int anonymous#this = #t7 in let dynamic #t8 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; } =>#t7; - let final core::int #t10 = 1 in block { - let final core::int #t11 = #t10 in let dynamic #t12 = #t11.{core::int::isEven}{core::bool} in #t11; - } =>#t10; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect index b9e905e4b35..bcd51b2f273 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect @@ -4,17 +4,17 @@ import "dart:core" as core; static method main() → void { let final core::int #t1 = 1 in block { - let final core::int #t2 = #t1 in let dynamic #t3 = 1 in #t2; + let final synthesized core::int anonymous#this = #t1 in let dynamic #t2 = 1 in anonymous#this; } =>#t1; - let final core::int #t4 = 1 in block { - let final core::int #t5 = #t4 in let dynamic #t6 = #t5 in #t5; - } =>#t4; + let final core::int #t3 = 1 in block { + let final synthesized core::int anonymous#this = #t3 in let dynamic #t4 = anonymous#this in anonymous#this; + } =>#t3; + let final core::int #t5 = 1 in block { + let final synthesized core::int anonymous#this = #t5 in let dynamic #t6 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t5; let final core::int #t7 = 1 in block { - let final core::int #t8 = #t7 in let dynamic #t9 = #t8.{core::int::isEven}{core::bool} in #t8; + let final synthesized core::int anonymous#this = #t7 in let dynamic #t8 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; } =>#t7; - let final core::int #t10 = 1 in block { - let final core::int #t11 = #t10 in let dynamic #t12 = #t11.{core::int::isEven}{core::bool} in #t11; - } =>#t10; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.expect index 4e45234ada8..75403373d99 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.expect @@ -4,11 +4,11 @@ import "dart:core" as core; static method main() → void { let core::int p = 1 in p; - let core::int #t1 = 1 in #t1 == null ?{core::int?} null : let core::int p = #t1 as core::int in p; - let final core::int #t2 = 1 in block { - let core::int p = #t2 in let dynamic #t3 = p in p; - } =>#t2; - let final core::int #t4 = 1 in #t4 == null ?{core::int} #t4 : block { - let core::int #t5 = #t4 in #t5 == null ?{core::int?} null : let core::int p = #t5 as core::int in let dynamic #t6 = p in p; - } =>#t4; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in p; + let final core::int #t1 = 1 in block { + let core::int p = #t1 in let dynamic #t2 = p in p; + } =>#t1; + let final core::int #t3 = 1 in #t3 == null ?{core::int} #t3 : block { + let synthesized core::int anonymous#receiver = #t3 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t4 = p in p; + } =>#t3; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect index 4e45234ada8..75403373d99 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect @@ -4,11 +4,11 @@ import "dart:core" as core; static method main() → void { let core::int p = 1 in p; - let core::int #t1 = 1 in #t1 == null ?{core::int?} null : let core::int p = #t1 as core::int in p; - let final core::int #t2 = 1 in block { - let core::int p = #t2 in let dynamic #t3 = p in p; - } =>#t2; - let final core::int #t4 = 1 in #t4 == null ?{core::int} #t4 : block { - let core::int #t5 = #t4 in #t5 == null ?{core::int?} null : let core::int p = #t5 as core::int in let dynamic #t6 = p in p; - } =>#t4; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in p; + let final core::int #t1 = 1 in block { + let core::int p = #t1 in let dynamic #t2 = p in p; + } =>#t1; + let final core::int #t3 = 1 in #t3 == null ?{core::int} #t3 : block { + let synthesized core::int anonymous#receiver = #t3 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t4 = p in p; + } =>#t3; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect index 7b16bf07e79..38805463950 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect @@ -4,13 +4,13 @@ import "dart:core" as core; static method main() → void { let core::int p = 1 in p; - let core::int #t1 = 1 in #t1 == null ?{core::int?} null : let core::int p = #t1 as{Unchecked} core::int in p; - let final core::int #t2 = 1 in block { - let core::int p = #t2 in let dynamic #t3 = p in p; - } =>#t2; - let final core::int #t4 = 1 in #t4 == null ?{core::int} #t4 : block { - let core::int #t5 = #t4 in #t5 == null ?{core::int?} null : let core::int p = #t5 as{Unchecked} core::int in let dynamic #t6 = p in p; - } =>#t4; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as{Unchecked} core::int in p; + let final core::int #t1 = 1 in block { + let core::int p = #t1 in let dynamic #t2 = p in p; + } =>#t1; + let final core::int #t3 = 1 in #t3 == null ?{core::int} #t3 : block { + let synthesized core::int anonymous#receiver = #t3 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as{Unchecked} core::int in let dynamic #t4 = p in p; + } =>#t3; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.expect index 00ea509adda..014da1123a7 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.expect @@ -30,20 +30,20 @@ static method test() → void { Try removing the parameter type, or make it a supertype of the receiver type. 1.(String p) => p; // Error ^" in 1 as{TypeError} core::String in p; - let core::int #t1 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:7:7: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. + let synthesized core::int anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:7:7: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. Try removing the parameter type, or make it a supertype of the receiver type. 1?.(String p) => p; // Error - ^" in 1 as{TypeError} core::String in #t1 == null ?{core::String?} null : let core::String p = #t1 as core::String in p; - let final core::int #t2 = 1 in block { + ^" in 1 as{TypeError} core::String in anonymous#receiver == null ?{core::String?} null : let core::String p = anonymous#receiver as core::String in p; + let final core::int #t1 = 1 in block { let core::String p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:8:7: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. Try removing the parameter type, or make it a supertype of the receiver type. 1..(String p) => p; // Error - ^" in #t2 as{TypeError} core::String in let dynamic #t3 = p in p; - } =>#t2; - let final core::int #t4 = 1 in #t4 == null ?{core::int} #t4 : block { - let core::int #t5 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:9:8: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. + ^" in #t1 as{TypeError} core::String in let dynamic #t2 = p in p; + } =>#t1; + let final core::int #t3 = 1 in #t3 == null ?{core::int} #t3 : block { + let synthesized core::int anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:9:8: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. Try removing the parameter type, or make it a supertype of the receiver type. 1?..(String p) => p; // Error - ^" in #t4 as{TypeError} core::String in #t5 == null ?{core::int?} null : let core::String p = #t5 as core::String in let dynamic #t6 = p in p; - } =>#t4; + ^" in #t3 as{TypeError} core::String in anonymous#receiver == null ?{core::int?} null : let core::String p = anonymous#receiver as core::String in let dynamic #t4 = p in p; + } =>#t3; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.modular.expect index 00ea509adda..014da1123a7 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart.strong.modular.expect @@ -30,20 +30,20 @@ static method test() → void { Try removing the parameter type, or make it a supertype of the receiver type. 1.(String p) => p; // Error ^" in 1 as{TypeError} core::String in p; - let core::int #t1 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:7:7: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. + let synthesized core::int anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:7:7: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. Try removing the parameter type, or make it a supertype of the receiver type. 1?.(String p) => p; // Error - ^" in 1 as{TypeError} core::String in #t1 == null ?{core::String?} null : let core::String p = #t1 as core::String in p; - let final core::int #t2 = 1 in block { + ^" in 1 as{TypeError} core::String in anonymous#receiver == null ?{core::String?} null : let core::String p = anonymous#receiver as core::String in p; + let final core::int #t1 = 1 in block { let core::String p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:8:7: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. Try removing the parameter type, or make it a supertype of the receiver type. 1..(String p) => p; // Error - ^" in #t2 as{TypeError} core::String in let dynamic #t3 = p in p; - } =>#t2; - let final core::int #t4 = 1 in #t4 == null ?{core::int} #t4 : block { - let core::int #t5 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:9:8: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. + ^" in #t1 as{TypeError} core::String in let dynamic #t2 = p in p; + } =>#t1; + let final core::int #t3 = 1 in #t3 == null ?{core::int} #t3 : block { + let synthesized core::int anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_explicitly_wrongly_typed.dart:9:8: Error: The receiver type 'int' must be assignable to the formal parameter type 'String' in an anonymous method. Try removing the parameter type, or make it a supertype of the receiver type. 1?..(String p) => p; // Error - ^" in #t4 as{TypeError} core::String in #t5 == null ?{core::int?} null : let core::String p = #t5 as core::String in let dynamic #t6 = p in p; - } =>#t4; + ^" in #t3 as{TypeError} core::String in anonymous#receiver == null ?{core::int?} null : let core::String p = anonymous#receiver as core::String in let dynamic #t4 = p in p; + } =>#t3; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.expect index 5b8c1e838aa..afb8ddbe695 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.expect @@ -7,22 +7,22 @@ extension E on core::int { method tearoff foo = self::E|get#foo; } static extension-member method E|foo(lowered final core::int #this) → void { - let final core::int #t1 = 1 in #t1; + let final synthesized core::int anonymous#this = 1 in anonymous#this; let core::int p = 1 in #this; - let core::int #t2 = 1 in #t2 == null ?{core::int?} null : let final core::int #t3 = #t2 as core::int in #t3; - let core::int #t4 = 1 in #t4 == null ?{core::int?} null : let core::int p = #t4 as core::int in #this; - let final core::int #t5 = 1 in block { - let final core::int #t6 = #t5 in let dynamic #t7 = #t6 in #t6; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in #this; + let final core::int #t1 = 1 in block { + let final synthesized core::int anonymous#this = #t1 in let dynamic #t2 = anonymous#this in anonymous#this; + } =>#t1; + let final core::int #t3 = 1 in block { + let core::int p = #t3 in let dynamic #t4 = #this in p; + } =>#t3; + let final core::int #t5 = 1 in #t5 == null ?{core::int} #t5 : block { + let synthesized core::int anonymous#receiver = #t5 in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t6 = anonymous#this in anonymous#this; } =>#t5; - let final core::int #t8 = 1 in block { - let core::int p = #t8 in let dynamic #t9 = #this in p; - } =>#t8; - let final core::int #t10 = 1 in #t10 == null ?{core::int} #t10 : block { - let core::int #t11 = #t10 in #t11 == null ?{core::int?} null : let final core::int #t12 = #t11 as core::int in let dynamic #t13 = #t12 in #t12; - } =>#t10; - let final core::int #t14 = 1 in #t14 == null ?{core::int} #t14 : block { - let core::int #t15 = #t14 in #t15 == null ?{core::int?} null : let core::int p = #t15 as core::int in let dynamic #t16 = #this in p; - } =>#t14; + let final core::int #t7 = 1 in #t7 == null ?{core::int} #t7 : block { + let synthesized core::int anonymous#receiver = #t7 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t8 = #this in p; + } =>#t7; } static extension-member method E|get#foo(lowered final core::int #this) → () → void return () → void => self::E|foo(#this); diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.modular.expect index 5b8c1e838aa..afb8ddbe695 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.modular.expect @@ -7,22 +7,22 @@ extension E on core::int { method tearoff foo = self::E|get#foo; } static extension-member method E|foo(lowered final core::int #this) → void { - let final core::int #t1 = 1 in #t1; + let final synthesized core::int anonymous#this = 1 in anonymous#this; let core::int p = 1 in #this; - let core::int #t2 = 1 in #t2 == null ?{core::int?} null : let final core::int #t3 = #t2 as core::int in #t3; - let core::int #t4 = 1 in #t4 == null ?{core::int?} null : let core::int p = #t4 as core::int in #this; - let final core::int #t5 = 1 in block { - let final core::int #t6 = #t5 in let dynamic #t7 = #t6 in #t6; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in #this; + let final core::int #t1 = 1 in block { + let final synthesized core::int anonymous#this = #t1 in let dynamic #t2 = anonymous#this in anonymous#this; + } =>#t1; + let final core::int #t3 = 1 in block { + let core::int p = #t3 in let dynamic #t4 = #this in p; + } =>#t3; + let final core::int #t5 = 1 in #t5 == null ?{core::int} #t5 : block { + let synthesized core::int anonymous#receiver = #t5 in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in let dynamic #t6 = anonymous#this in anonymous#this; } =>#t5; - let final core::int #t8 = 1 in block { - let core::int p = #t8 in let dynamic #t9 = #this in p; - } =>#t8; - let final core::int #t10 = 1 in #t10 == null ?{core::int} #t10 : block { - let core::int #t11 = #t10 in #t11 == null ?{core::int?} null : let final core::int #t12 = #t11 as core::int in let dynamic #t13 = #t12 in #t12; - } =>#t10; - let final core::int #t14 = 1 in #t14 == null ?{core::int} #t14 : block { - let core::int #t15 = #t14 in #t15 == null ?{core::int?} null : let core::int p = #t15 as core::int in let dynamic #t16 = #this in p; - } =>#t14; + let final core::int #t7 = 1 in #t7 == null ?{core::int} #t7 : block { + let synthesized core::int anonymous#receiver = #t7 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in let dynamic #t8 = #this in p; + } =>#t7; } static extension-member method E|get#foo(lowered final core::int #this) → () → void return () → void => self::E|foo(#this); diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.transformed.expect index 80f11022031..6b3842f1e91 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_extension_method.dart.strong.transformed.expect @@ -7,22 +7,22 @@ extension E on core::int { method tearoff foo = self::E|get#foo; } static extension-member method E|foo(lowered final core::int #this) → void { - let final core::int #t1 = 1 in #t1; + let final synthesized core::int anonymous#this = 1 in anonymous#this; let core::int p = 1 in #this; - let core::int #t2 = 1 in #t2 == null ?{core::int?} null : let final core::int #t3 = #t2 as{Unchecked} core::int in #t3; - let core::int #t4 = 1 in #t4 == null ?{core::int?} null : let core::int p = #t4 as{Unchecked} core::int in #this; - let final core::int #t5 = 1 in block { - let final core::int #t6 = #t5 in let dynamic #t7 = #t6 in #t6; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as{Unchecked} core::int in anonymous#this; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as{Unchecked} core::int in #this; + let final core::int #t1 = 1 in block { + let final synthesized core::int anonymous#this = #t1 in let dynamic #t2 = anonymous#this in anonymous#this; + } =>#t1; + let final core::int #t3 = 1 in block { + let core::int p = #t3 in let dynamic #t4 = #this in p; + } =>#t3; + let final core::int #t5 = 1 in #t5 == null ?{core::int} #t5 : block { + let synthesized core::int anonymous#receiver = #t5 in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as{Unchecked} core::int in let dynamic #t6 = anonymous#this in anonymous#this; } =>#t5; - let final core::int #t8 = 1 in block { - let core::int p = #t8 in let dynamic #t9 = #this in p; - } =>#t8; - let final core::int #t10 = 1 in #t10 == null ?{core::int} #t10 : block { - let core::int #t11 = #t10 in #t11 == null ?{core::int?} null : let final core::int #t12 = #t11 as{Unchecked} core::int in let dynamic #t13 = #t12 in #t12; - } =>#t10; - let final core::int #t14 = 1 in #t14 == null ?{core::int} #t14 : block { - let core::int #t15 = #t14 in #t15 == null ?{core::int?} null : let core::int p = #t15 as{Unchecked} core::int in let dynamic #t16 = #this in p; - } =>#t14; + let final core::int #t7 = 1 in #t7 == null ?{core::int} #t7 : block { + let synthesized core::int anonymous#receiver = #t7 in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as{Unchecked} core::int in let dynamic #t8 = #this in p; + } =>#t7; } static extension-member method E|get#foo(lowered final core::int #this) → () → void return () → void => self::E|foo(#this); diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect index ed19b5e81c4..40363fe2e8e 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect @@ -4,7 +4,7 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { - let core::int? #t1 = self::i in #t1 == null ?{core::int?} null : let core::int p = #t1 as core::int in 1; - let core::int? #t2 = self::i in #t2 == null ?{core::int?} null : let core::int p = #t2 as core::int in p{core::int}; - let core::int? #t3 = self::i in #t3 == null ?{core::bool?} null : let core::int p = #t3 as core::int in p{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in 1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in p{core::int}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let core::int p = anonymous#receiver as core::int in p{core::int}.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect index ed19b5e81c4..40363fe2e8e 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect @@ -4,7 +4,7 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { - let core::int? #t1 = self::i in #t1 == null ?{core::int?} null : let core::int p = #t1 as core::int in 1; - let core::int? #t2 = self::i in #t2 == null ?{core::int?} null : let core::int p = #t2 as core::int in p{core::int}; - let core::int? #t3 = self::i in #t3 == null ?{core::bool?} null : let core::int p = #t3 as core::int in p{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in 1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let core::int p = anonymous#receiver as core::int in p{core::int}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let core::int p = anonymous#receiver as core::int in p{core::int}.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect index aa467fd2e8e..5326b6da1d9 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect @@ -4,7 +4,7 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { - let core::int? #t1 = self::i in #t1 == null ?{core::int?} null : let core::int p = let core::int? #t2 = #t1 in #t2 == null ?{core::int} #t2 as core::int : #t2{core::int} in 1; - let core::int? #t3 = self::i in #t3 == null ?{core::int?} null : let core::int p = let core::int? #t4 = #t3 in #t4 == null ?{core::int} #t4 as core::int : #t4{core::int} in p{core::int}; - let core::int? #t5 = self::i in #t5 == null ?{core::bool?} null : let core::int p = let core::int? #t6 = #t5 in #t6 == null ?{core::int} #t6 as core::int : #t6{core::int} in p{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let core::int p = let core::int? #t1 = anonymous#receiver in #t1 == null ?{core::int} #t1 as core::int : #t1{core::int} in 1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let core::int p = let core::int? #t2 = anonymous#receiver in #t2 == null ?{core::int} #t2 as core::int : #t2{core::int} in p{core::int}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let core::int p = let core::int? #t3 = anonymous#receiver in #t3 == null ?{core::int} #t3 as core::int : #t3{core::int} in p{core::int}.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect index 0f6756cd6bd..edd15741e35 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect @@ -4,8 +4,8 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { - let core::int? #t1 = self::i in #t1 == null ?{core::int?} null : let final core::int #t2 = #t1 as core::int in 1; - let core::int? #t3 = self::i in #t3 == null ?{core::int?} null : let final core::int #t4 = #t3 as core::int in #t4{core::int}; - let core::int? #t5 = self::i in #t5 == null ?{core::bool?} null : let final core::int #t6 = #t5 as core::int in #t6{core::int}.{core::int::isEven}{core::bool}; - let core::int? #t7 = self::i in #t7 == null ?{core::bool?} null : let final core::int #t8 = #t7 as core::int in #t8{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in 1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this{core::int}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this{core::int}.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect index 0f6756cd6bd..edd15741e35 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect @@ -4,8 +4,8 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { - let core::int? #t1 = self::i in #t1 == null ?{core::int?} null : let final core::int #t2 = #t1 as core::int in 1; - let core::int? #t3 = self::i in #t3 == null ?{core::int?} null : let final core::int #t4 = #t3 as core::int in #t4{core::int}; - let core::int? #t5 = self::i in #t5 == null ?{core::bool?} null : let final core::int #t6 = #t5 as core::int in #t6{core::int}.{core::int::isEven}{core::bool}; - let core::int? #t7 = self::i in #t7 == null ?{core::bool?} null : let final core::int #t8 = #t7 as core::int in #t8{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in 1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this{core::int}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let final synthesized core::int anonymous#this = anonymous#receiver as core::int in anonymous#this{core::int}.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect index 1c18e67f153..303e7a3a88a 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect @@ -4,8 +4,8 @@ import "dart:core" as core; static field core::int? i = null; static method main() → void { - let core::int? #t1 = self::i in #t1 == null ?{core::int?} null : let final core::int #t2 = let core::int? #t3 = #t1 in #t3 == null ?{core::int} #t3 as core::int : #t3{core::int} in 1; - let core::int? #t4 = self::i in #t4 == null ?{core::int?} null : let final core::int #t5 = let core::int? #t6 = #t4 in #t6 == null ?{core::int} #t6 as core::int : #t6{core::int} in #t5{core::int}; - let core::int? #t7 = self::i in #t7 == null ?{core::bool?} null : let final core::int #t8 = let core::int? #t9 = #t7 in #t9 == null ?{core::int} #t9 as core::int : #t9{core::int} in #t8{core::int}.{core::int::isEven}{core::bool}; - let core::int? #t10 = self::i in #t10 == null ?{core::bool?} null : let final core::int #t11 = let core::int? #t12 = #t10 in #t12 == null ?{core::int} #t12 as core::int : #t12{core::int} in #t11{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = let core::int? #t1 = anonymous#receiver in #t1 == null ?{core::int} #t1 as core::int : #t1{core::int} in 1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : let final synthesized core::int anonymous#this = let core::int? #t2 = anonymous#receiver in #t2 == null ?{core::int} #t2 as core::int : #t2{core::int} in anonymous#this{core::int}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let final synthesized core::int anonymous#this = let core::int? #t3 = anonymous#receiver in #t3 == null ?{core::int} #t3 as core::int : #t3{core::int} in anonymous#this{core::int}.{core::int::isEven}{core::bool}; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : let final synthesized core::int anonymous#this = let core::int? #t4 = anonymous#receiver in #t4 == null ?{core::int} #t4 as core::int : #t4{core::int} in anonymous#this{core::int}.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.expect index d474809c2ba..9277f07aea2 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.expect @@ -5,16 +5,16 @@ import "dart:core" as core; class A extends core::Object { final field core::int x; constructor n1() → self::A - : self::A::x = let final core::int #t1 = 42 in #t1, super core::Object::•() + : self::A::x = let final synthesized core::int anonymous#this = 42 in anonymous#this, super core::Object::•() ; constructor n2() → self::A - : self::A::x = let final core::String #t2 = "abc" in #t2.{core::String::length}{core::int}, super core::Object::•() + : self::A::x = let final synthesized core::String anonymous#this = "abc" in anonymous#this.{core::String::length}{core::int}, super core::Object::•() ; constructor n3() → self::A - : self::A::x = let final () → core::int #t3 = #C1 in #t3(){() → core::int}, super core::Object::•() + : self::A::x = let final synthesized () → core::int anonymous#this = #C1 in anonymous#this(){() → core::int}, super core::Object::•() ; constructor n4() → self::A - : self::A::x = let final core::String #t4 = "def" in #t4.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}, super core::Object::•() + : self::A::x = let final synthesized core::String anonymous#this = "def" in anonymous#this.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}, super core::Object::•() ; } static method f() → core::int diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect index d474809c2ba..9277f07aea2 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect @@ -5,16 +5,16 @@ import "dart:core" as core; class A extends core::Object { final field core::int x; constructor n1() → self::A - : self::A::x = let final core::int #t1 = 42 in #t1, super core::Object::•() + : self::A::x = let final synthesized core::int anonymous#this = 42 in anonymous#this, super core::Object::•() ; constructor n2() → self::A - : self::A::x = let final core::String #t2 = "abc" in #t2.{core::String::length}{core::int}, super core::Object::•() + : self::A::x = let final synthesized core::String anonymous#this = "abc" in anonymous#this.{core::String::length}{core::int}, super core::Object::•() ; constructor n3() → self::A - : self::A::x = let final () → core::int #t3 = #C1 in #t3(){() → core::int}, super core::Object::•() + : self::A::x = let final synthesized () → core::int anonymous#this = #C1 in anonymous#this(){() → core::int}, super core::Object::•() ; constructor n4() → self::A - : self::A::x = let final core::String #t4 = "def" in #t4.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}, super core::Object::•() + : self::A::x = let final synthesized core::String anonymous#this = "def" in anonymous#this.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}, super core::Object::•() ; } static method f() → core::int diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect index ce2b4cbfe30..9610339d77a 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect @@ -5,16 +5,16 @@ import "dart:core" as core; class A extends core::Object { final field core::int x; constructor n1() → self::A - : self::A::x = let final core::int #t1 = 42 in #t1, super core::Object::•() + : self::A::x = let final synthesized core::int anonymous#this = 42 in anonymous#this, super core::Object::•() ; constructor n2() → self::A - : self::A::x = let final core::String #t2 = "abc" in #t2.{core::String::length}{core::int}, super core::Object::•() + : self::A::x = let final synthesized core::String anonymous#this = "abc" in anonymous#this.{core::String::length}{core::int}, super core::Object::•() ; constructor n3() → self::A - : self::A::x = let final () → core::int #t3 = #C1 in #t3(){() → core::int}, super core::Object::•() + : self::A::x = let final synthesized () → core::int anonymous#this = #C1 in anonymous#this(){() → core::int}, super core::Object::•() ; constructor n4() → self::A - : self::A::x = let final core::String #t4 = "def" in #t4.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}, super core::Object::•() + : self::A::x = let final synthesized core::String anonymous#this = "def" in anonymous#this.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}, super core::Object::•() ; } static method f() → core::int diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.expect index d81a3dc0654..4cd4831f4c3 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.expect @@ -39,36 +39,36 @@ import "dart:core" as core; static field void v = null; static method test() → void { - let final void #t1 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:8:3: Error: This expression has type 'void' and can't be used. + let final synthesized void anonymous#this = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:8:3: Error: This expression has type 'void' and can't be used. v. => 1; // Error ^" in self::v in 1; let void p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:9:3: Error: This expression has type 'void' and can't be used. v.(p) => 1; // Error ^" in self::v in 1; - let void #t2 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:10:3: Error: This expression has type 'void' and can't be used. + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:10:3: Error: This expression has type 'void' and can't be used. v?. => 1; // Error - ^" in self::v in #t2 == null ?{core::int?} null : let final void #t3 = #t2 as void in 1; - let void #t4 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:11:3: Error: This expression has type 'void' and can't be used. + ^" in self::v in anonymous#receiver == null ?{core::int?} null : let final synthesized void anonymous#this = anonymous#receiver as void in 1; + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:11:3: Error: This expression has type 'void' and can't be used. v?.(p) => 1; // Error - ^" in self::v in #t4 == null ?{core::int?} null : let void p = #t4 as void in 1; - let final void #t5 = self::v in block { - let final void #t6 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:12:3: Error: This expression has type 'void' and can't be used. + ^" in self::v in anonymous#receiver == null ?{core::int?} null : let void p = anonymous#receiver as void in 1; + let final void #t1 = self::v in block { + let final synthesized void anonymous#this = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:12:3: Error: This expression has type 'void' and can't be used. v.. => 1; // Error - ^" in #t5 in let dynamic #t7 = 1 in #t6; - } =>#t5; - let final void #t8 = self::v in block { + ^" in #t1 in let dynamic #t2 = 1 in anonymous#this; + } =>#t1; + let final void #t3 = self::v in block { let void p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:13:3: Error: This expression has type 'void' and can't be used. v..(p) => 1; // Error - ^" in #t8 in let dynamic #t9 = 1 in p; - } =>#t8; - let final void #t10 = self::v in #t10 == null ?{void} null : block { - let void #t11 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:14:3: Error: This expression has type 'void' and can't be used. + ^" in #t3 in let dynamic #t4 = 1 in p; + } =>#t3; + let final void #t5 = self::v in #t5 == null ?{void} null : block { + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:14:3: Error: This expression has type 'void' and can't be used. v?.. => 1; // Error - ^" in #t10 in #t11 == null ?{void} null : let final void #t12 = #t11 as void in let dynamic #t13 = 1 in #t12; - } =>#t10; - let final void #t14 = self::v in #t14 == null ?{void} null : block { - let void #t15 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:15:3: Error: This expression has type 'void' and can't be used. + ^" in #t5 in anonymous#receiver == null ?{void} null : let final synthesized void anonymous#this = anonymous#receiver as void in let dynamic #t6 = 1 in anonymous#this; + } =>#t5; + let final void #t7 = self::v in #t7 == null ?{void} null : block { + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:15:3: Error: This expression has type 'void' and can't be used. v?..(p) => 1; // Error - ^" in #t14 in #t15 == null ?{void} null : let void p = #t15 as void in let dynamic #t16 = 1 in p; - } =>#t14; + ^" in #t7 in anonymous#receiver == null ?{void} null : let void p = anonymous#receiver as void in let dynamic #t8 = 1 in p; + } =>#t7; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.modular.expect index d81a3dc0654..4cd4831f4c3 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.modular.expect @@ -39,36 +39,36 @@ import "dart:core" as core; static field void v = null; static method test() → void { - let final void #t1 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:8:3: Error: This expression has type 'void' and can't be used. + let final synthesized void anonymous#this = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:8:3: Error: This expression has type 'void' and can't be used. v. => 1; // Error ^" in self::v in 1; let void p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:9:3: Error: This expression has type 'void' and can't be used. v.(p) => 1; // Error ^" in self::v in 1; - let void #t2 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:10:3: Error: This expression has type 'void' and can't be used. + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:10:3: Error: This expression has type 'void' and can't be used. v?. => 1; // Error - ^" in self::v in #t2 == null ?{core::int?} null : let final void #t3 = #t2 as void in 1; - let void #t4 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:11:3: Error: This expression has type 'void' and can't be used. + ^" in self::v in anonymous#receiver == null ?{core::int?} null : let final synthesized void anonymous#this = anonymous#receiver as void in 1; + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:11:3: Error: This expression has type 'void' and can't be used. v?.(p) => 1; // Error - ^" in self::v in #t4 == null ?{core::int?} null : let void p = #t4 as void in 1; - let final void #t5 = self::v in block { - let final void #t6 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:12:3: Error: This expression has type 'void' and can't be used. + ^" in self::v in anonymous#receiver == null ?{core::int?} null : let void p = anonymous#receiver as void in 1; + let final void #t1 = self::v in block { + let final synthesized void anonymous#this = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:12:3: Error: This expression has type 'void' and can't be used. v.. => 1; // Error - ^" in #t5 in let dynamic #t7 = 1 in #t6; - } =>#t5; - let final void #t8 = self::v in block { + ^" in #t1 in let dynamic #t2 = 1 in anonymous#this; + } =>#t1; + let final void #t3 = self::v in block { let void p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:13:3: Error: This expression has type 'void' and can't be used. v..(p) => 1; // Error - ^" in #t8 in let dynamic #t9 = 1 in p; - } =>#t8; - let final void #t10 = self::v in #t10 == null ?{void} null : block { - let void #t11 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:14:3: Error: This expression has type 'void' and can't be used. + ^" in #t3 in let dynamic #t4 = 1 in p; + } =>#t3; + let final void #t5 = self::v in #t5 == null ?{void} null : block { + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:14:3: Error: This expression has type 'void' and can't be used. v?.. => 1; // Error - ^" in #t10 in #t11 == null ?{void} null : let final void #t12 = #t11 as void in let dynamic #t13 = 1 in #t12; - } =>#t10; - let final void #t14 = self::v in #t14 == null ?{void} null : block { - let void #t15 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:15:3: Error: This expression has type 'void' and can't be used. + ^" in #t5 in anonymous#receiver == null ?{void} null : let final synthesized void anonymous#this = anonymous#receiver as void in let dynamic #t6 = 1 in anonymous#this; + } =>#t5; + let final void #t7 = self::v in #t7 == null ?{void} null : block { + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:15:3: Error: This expression has type 'void' and can't be used. v?..(p) => 1; // Error - ^" in #t14 in #t15 == null ?{void} null : let void p = #t15 as void in let dynamic #t16 = 1 in p; - } =>#t14; + ^" in #t7 in anonymous#receiver == null ?{void} null : let void p = anonymous#receiver as void in let dynamic #t8 = 1 in p; + } =>#t7; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.transformed.expect index b36e1128081..5737071cfde 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart.strong.transformed.expect @@ -39,36 +39,36 @@ import "dart:core" as core; static field void v = null; static method test() → void { - let final void #t1 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:8:3: Error: This expression has type 'void' and can't be used. + let final synthesized void anonymous#this = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:8:3: Error: This expression has type 'void' and can't be used. v. => 1; // Error ^" in self::v in 1; let void p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:9:3: Error: This expression has type 'void' and can't be used. v.(p) => 1; // Error ^" in self::v in 1; - let void #t2 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:10:3: Error: This expression has type 'void' and can't be used. + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:10:3: Error: This expression has type 'void' and can't be used. v?. => 1; // Error - ^" in self::v in #t2 == null ?{core::int?} null : let final void #t3 = #t2 as{Unchecked} void in 1; - let void #t4 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:11:3: Error: This expression has type 'void' and can't be used. + ^" in self::v in anonymous#receiver == null ?{core::int?} null : let final synthesized void anonymous#this = anonymous#receiver as{Unchecked} void in 1; + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:11:3: Error: This expression has type 'void' and can't be used. v?.(p) => 1; // Error - ^" in self::v in #t4 == null ?{core::int?} null : let void p = #t4 as{Unchecked} void in 1; - let final void #t5 = self::v in block { - let final void #t6 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:12:3: Error: This expression has type 'void' and can't be used. + ^" in self::v in anonymous#receiver == null ?{core::int?} null : let void p = anonymous#receiver as{Unchecked} void in 1; + let final void #t1 = self::v in block { + let final synthesized void anonymous#this = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:12:3: Error: This expression has type 'void' and can't be used. v.. => 1; // Error - ^" in #t5 in let dynamic #t7 = 1 in #t6; - } =>#t5; - let final void #t8 = self::v in block { + ^" in #t1 in let dynamic #t2 = 1 in anonymous#this; + } =>#t1; + let final void #t3 = self::v in block { let void p = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:13:3: Error: This expression has type 'void' and can't be used. v..(p) => 1; // Error - ^" in #t8 in let dynamic #t9 = 1 in p; - } =>#t8; - let final void #t10 = self::v in #t10 == null ?{void} null : block { - let void #t11 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:14:3: Error: This expression has type 'void' and can't be used. + ^" in #t3 in let dynamic #t4 = 1 in p; + } =>#t3; + let final void #t5 = self::v in #t5 == null ?{void} null : block { + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:14:3: Error: This expression has type 'void' and can't be used. v?.. => 1; // Error - ^" in #t10 in #t11 == null ?{void} null : let final void #t12 = #t11 as{Unchecked} void in let dynamic #t13 = 1 in #t12; - } =>#t10; - let final void #t14 = self::v in #t14 == null ?{void} null : block { - let void #t15 = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:15:3: Error: This expression has type 'void' and can't be used. + ^" in #t5 in anonymous#receiver == null ?{void} null : let final synthesized void anonymous#this = anonymous#receiver as{Unchecked} void in let dynamic #t6 = 1 in anonymous#this; + } =>#t5; + let final void #t7 = self::v in #t7 == null ?{void} null : block { + let synthesized void anonymous#receiver = invalid-expression "pkg/front_end/testcases/coverage/anonymous_methods/expression_void_receiver.dart:15:3: Error: This expression has type 'void' and can't be used. v?..(p) => 1; // Error - ^" in #t14 in #t15 == null ?{void} null : let void p = #t15 as{Unchecked} void in let dynamic #t16 = 1 in p; - } =>#t14; + ^" in #t7 in anonymous#receiver == null ?{void} null : let void p = anonymous#receiver as{Unchecked} void in let dynamic #t8 = 1 in p; + } =>#t7; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.expect index 1093df2dbb2..6d4d5276bd6 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.expect @@ -3,8 +3,8 @@ import self as self; import "dart:core" as core; static method main() → void { - let final core::int #t1 = 1 in 1; - let final core::int #t2 = 1 in #t2; - let final core::int #t3 = 1 in #t3.{core::int::isEven}{core::bool}; - let final core::int #t4 = 1 in #t4.{core::int::isEven}{core::bool}; + let final synthesized core::int anonymous#this = 1 in 1; + let final synthesized core::int anonymous#this = 1 in anonymous#this; + let final synthesized core::int anonymous#this = 1 in anonymous#this.{core::int::isEven}{core::bool}; + let final synthesized core::int anonymous#this = 1 in anonymous#this.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.modular.expect index 1093df2dbb2..6d4d5276bd6 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.modular.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.modular.expect @@ -3,8 +3,8 @@ import self as self; import "dart:core" as core; static method main() → void { - let final core::int #t1 = 1 in 1; - let final core::int #t2 = 1 in #t2; - let final core::int #t3 = 1 in #t3.{core::int::isEven}{core::bool}; - let final core::int #t4 = 1 in #t4.{core::int::isEven}{core::bool}; + let final synthesized core::int anonymous#this = 1 in 1; + let final synthesized core::int anonymous#this = 1 in anonymous#this; + let final synthesized core::int anonymous#this = 1 in anonymous#this.{core::int::isEven}{core::bool}; + let final synthesized core::int anonymous#this = 1 in anonymous#this.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect index 1a3e305341d..df495f27111 100644 --- a/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/coverage/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect @@ -3,10 +3,10 @@ import self as self; import "dart:core" as core; static method main() → void { - let final core::int #t1 = 1 in 1; - let final core::int #t2 = 1 in #t2; - let final core::int #t3 = 1 in #t3.{core::int::isEven}{core::bool}; - let final core::int #t4 = 1 in #t4.{core::int::isEven}{core::bool}; + let final synthesized core::int anonymous#this = 1 in 1; + let final synthesized core::int anonymous#this = 1 in anonymous#this; + let final synthesized core::int anonymous#this = 1 in anonymous#this.{core::int::isEven}{core::bool}; + let final synthesized core::int anonymous#this = 1 in anonymous#this.{core::int::isEven}{core::bool}; } diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart new file mode 100644 index 00000000000..da290c4a654 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +int? i = null; + +void main() { + i?..(p) => 1; + i?..(p) => p; + i?..(p) => p.isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect new file mode 100644 index 00000000000..4411f55dab6 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.expect @@ -0,0 +1,28 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = let dynamic #t3 = 1 in p; + } =>#t2; + } =>#t1; + let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t4{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t5; + #t5 = let dynamic #t6 = p in p; + } =>#t5; + } =>#t4; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t8; + #t8 = let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; + } =>#t8; + } =>#t7; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..4411f55dab6 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.modular.expect @@ -0,0 +1,28 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = let dynamic #t3 = 1 in p; + } =>#t2; + } =>#t1; + let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t4{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t5; + #t5 = let dynamic #t6 = p in p; + } =>#t5; + } =>#t4; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t8; + #t8 = let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; + } =>#t8; + } =>#t7; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..c17141d4913 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.outline.expect @@ -0,0 +1,7 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i; +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..4411f55dab6 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.strong.transformed.expect @@ -0,0 +1,28 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = let dynamic #t3 = 1 in p; + } =>#t2; + } =>#t1; + let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t4{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t5; + #t5 = let dynamic #t6 = p in p; + } =>#t5; + } =>#t4; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t8; + #t8 = let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; + } =>#t8; + } =>#t7; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_with_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart new file mode 100644 index 00000000000..fd14b8e9cfa --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart @@ -0,0 +1,12 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +int? i = null; + +void main() { + i?..=> 1; + i?..=> this; + i?..=> this.isEven; + i?..=> isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect new file mode 100644 index 00000000000..6430bc919ca --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.expect @@ -0,0 +1,35 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t2; + #t2 = let dynamic #t3 = 1 in anonymous#this; + } =>#t2; + } =>#t1; + let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t4{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t5; + #t5 = let dynamic #t6 = anonymous#this in anonymous#this; + } =>#t5; + } =>#t4; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t8; + #t8 = let dynamic #t9 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t8; + } =>#t7; + let final core::int? #t10 = self::i in #t10 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t10{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t11; + #t11 = let dynamic #t12 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t11; + } =>#t10; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..6430bc919ca --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.modular.expect @@ -0,0 +1,35 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t2; + #t2 = let dynamic #t3 = 1 in anonymous#this; + } =>#t2; + } =>#t1; + let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t4{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t5; + #t5 = let dynamic #t6 = anonymous#this in anonymous#this; + } =>#t5; + } =>#t4; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t8; + #t8 = let dynamic #t9 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t8; + } =>#t7; + let final core::int? #t10 = self::i in #t10 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t10{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t11; + #t11 = let dynamic #t12 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t11; + } =>#t10; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..c17141d4913 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.outline.expect @@ -0,0 +1,7 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i; +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..6430bc919ca --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.strong.transformed.expect @@ -0,0 +1,35 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let final core::int? #t1 = self::i in #t1 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t1{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t2; + #t2 = let dynamic #t3 = 1 in anonymous#this; + } =>#t2; + } =>#t1; + let final core::int? #t4 = self::i in #t4 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t4{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t5; + #t5 = let dynamic #t6 = anonymous#this in anonymous#this; + } =>#t5; + } =>#t4; + let final core::int? #t7 = self::i in #t7 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t7{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t8; + #t8 = let dynamic #t9 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t8; + } =>#t7; + let final core::int? #t10 = self::i in #t10 == null ?{core::int?} null : block { + let synthesized core::int anonymous#receiver = #t10{core::int} in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t11; + #t11 = let dynamic #t12 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } =>#t11; + } =>#t10; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_null_aware_without_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart new file mode 100644 index 00000000000..41ac28281d6 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart @@ -0,0 +1,9 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +void main() { + 1..(p) => 1; + 1..(p) => p; + 1..(p) => p.isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.expect new file mode 100644 index 00000000000..e9a35c1db5f --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.expect @@ -0,0 +1,27 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + let final core::int #t1 = 1 in block { + { + core::int p = #t1; + core::int #t2; + #t2 = let dynamic #t3 = 1 in p; + } + } =>#t1; + let final core::int #t4 = 1 in block { + { + core::int p = #t4; + core::int #t5; + #t5 = let dynamic #t6 = p in p; + } + } =>#t4; + let final core::int #t7 = 1 in block { + { + core::int p = #t7; + core::int #t8; + #t8 = let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; + } + } =>#t7; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..e9a35c1db5f --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.modular.expect @@ -0,0 +1,27 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + let final core::int #t1 = 1 in block { + { + core::int p = #t1; + core::int #t2; + #t2 = let dynamic #t3 = 1 in p; + } + } =>#t1; + let final core::int #t4 = 1 in block { + { + core::int p = #t4; + core::int #t5; + #t5 = let dynamic #t6 = p in p; + } + } =>#t4; + let final core::int #t7 = 1 in block { + { + core::int p = #t7; + core::int #t8; + #t8 = let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; + } + } =>#t7; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..2982c48b884 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.outline.expect @@ -0,0 +1,5 @@ +library; +import self as self; + +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..e6331c8fbe4 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.strong.transformed.expect @@ -0,0 +1,37 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + let final core::int #t1 = 1 in block { + { + core::int p = #t1; + core::int #t2; + #t2 = let dynamic #t3 = 1 in p; + } + } =>#t1; + let final core::int #t4 = 1 in block { + { + core::int p = #t4; + core::int #t5; + #t5 = let dynamic #t6 = p in p; + } + } =>#t4; + let final core::int #t7 = 1 in block { + { + core::int p = #t7; + core::int #t8; + #t8 = let dynamic #t9 = p.{core::int::isEven}{core::bool} in p; + } + } =>#t7; +} + + +Extra constant evaluation status: +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_with_parameter.dart:6:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_with_parameter.dart:6:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_with_parameter.dart:7:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_with_parameter.dart:7:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_with_parameter.dart:8:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_with_parameter.dart:8:3 -> DoubleConstant(1.0) +Extra constant evaluation: evaluated: 24, effectively constant: 6 diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_with_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart new file mode 100644 index 00000000000..e000a0303bb --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart @@ -0,0 +1,10 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +void main() { + 1..=> 1; + 1..=> this; + 1..=> this.isEven; + 1..=> isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect new file mode 100644 index 00000000000..37b704c932b --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.expect @@ -0,0 +1,34 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + let final core::int #t1 = 1 in block { + { + final synthesized core::int anonymous#this = #t1; + core::int #t2; + #t2 = let dynamic #t3 = 1 in anonymous#this; + } + } =>#t1; + let final core::int #t4 = 1 in block { + { + final synthesized core::int anonymous#this = #t4; + core::int #t5; + #t5 = let dynamic #t6 = anonymous#this in anonymous#this; + } + } =>#t4; + let final core::int #t7 = 1 in block { + { + final synthesized core::int anonymous#this = #t7; + core::int #t8; + #t8 = let dynamic #t9 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } + } =>#t7; + let final core::int #t10 = 1 in block { + { + final synthesized core::int anonymous#this = #t10; + core::int #t11; + #t11 = let dynamic #t12 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } + } =>#t10; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..37b704c932b --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.modular.expect @@ -0,0 +1,34 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + let final core::int #t1 = 1 in block { + { + final synthesized core::int anonymous#this = #t1; + core::int #t2; + #t2 = let dynamic #t3 = 1 in anonymous#this; + } + } =>#t1; + let final core::int #t4 = 1 in block { + { + final synthesized core::int anonymous#this = #t4; + core::int #t5; + #t5 = let dynamic #t6 = anonymous#this in anonymous#this; + } + } =>#t4; + let final core::int #t7 = 1 in block { + { + final synthesized core::int anonymous#this = #t7; + core::int #t8; + #t8 = let dynamic #t9 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } + } =>#t7; + let final core::int #t10 = 1 in block { + { + final synthesized core::int anonymous#this = #t10; + core::int #t11; + #t11 = let dynamic #t12 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } + } =>#t10; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..2982c48b884 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.outline.expect @@ -0,0 +1,5 @@ +library; +import self as self; + +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..f5412b80665 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.strong.transformed.expect @@ -0,0 +1,46 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + let final core::int #t1 = 1 in block { + { + final synthesized core::int anonymous#this = #t1; + core::int #t2; + #t2 = let dynamic #t3 = 1 in anonymous#this; + } + } =>#t1; + let final core::int #t4 = 1 in block { + { + final synthesized core::int anonymous#this = #t4; + core::int #t5; + #t5 = let dynamic #t6 = anonymous#this in anonymous#this; + } + } =>#t4; + let final core::int #t7 = 1 in block { + { + final synthesized core::int anonymous#this = #t7; + core::int #t8; + #t8 = let dynamic #t9 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } + } =>#t7; + let final core::int #t10 = 1 in block { + { + final synthesized core::int anonymous#this = #t10; + core::int #t11; + #t11 = let dynamic #t12 = anonymous#this.{core::int::isEven}{core::bool} in anonymous#this; + } + } =>#t10; +} + + +Extra constant evaluation status: +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:6:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:6:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:7:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:7:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:8:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:8:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:9:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_cascaded_without_parameter.dart:9:3 -> DoubleConstant(1.0) +Extra constant evaluation: evaluated: 33, effectively constant: 8 diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_cascaded_without_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart new file mode 100644 index 00000000000..5ee3e413cf9 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart @@ -0,0 +1,10 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +void main() { + 1.(int p) => p; + 1?.(int p) => p; + 1..(int p) => p; + 1?..(int p) => p; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.expect new file mode 100644 index 00000000000..14add835408 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.expect @@ -0,0 +1,30 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + core::int p = 1; + core::int #t1; + #t1 = p; + } + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = p; + } =>#t2; + let final core::int #t3 = 1 in block { + { + core::int p = #t3; + core::int #t4; + #t4 = let dynamic #t5 = p in p; + } + } =>#t3; + let final core::int #t6 = 1 in #t6 == null ?{core::int} #t6 : block { + let synthesized core::int anonymous#receiver = #t6 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t7; + #t7 = let dynamic #t8 = p in p; + } =>#t7; + } =>#t6; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect new file mode 100644 index 00000000000..14add835408 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.modular.expect @@ -0,0 +1,30 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + core::int p = 1; + core::int #t1; + #t1 = p; + } + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = p; + } =>#t2; + let final core::int #t3 = 1 in block { + { + core::int p = #t3; + core::int #t4; + #t4 = let dynamic #t5 = p in p; + } + } =>#t3; + let final core::int #t6 = 1 in #t6 == null ?{core::int} #t6 : block { + let synthesized core::int anonymous#receiver = #t6 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t7; + #t7 = let dynamic #t8 = p in p; + } =>#t7; + } =>#t6; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.outline.expect new file mode 100644 index 00000000000..2982c48b884 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.outline.expect @@ -0,0 +1,5 @@ +library; +import self as self; + +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect new file mode 100644 index 00000000000..70b3645eeb8 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.strong.transformed.expect @@ -0,0 +1,44 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + core::int p = 1; + core::int #t1; + #t1 = p; + } + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = p; + } =>#t2; + let final core::int #t3 = 1 in block { + { + core::int p = #t3; + core::int #t4; + #t4 = let dynamic #t5 = p in p; + } + } =>#t3; + let final core::int #t6 = 1 in #t6 == null ?{core::int} #t6 : block { + let synthesized core::int anonymous#receiver = #t6 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t7; + #t7 = let dynamic #t8 = p in p; + } =>#t7; + } =>#t6; +} + + +Extra constant evaluation status: +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_explicitly_typed.dart:7:3 -> BoolConstant(false) +Evaluated: AsExpression @ org-dartlang-testcase:///expression_explicitly_typed.dart:7:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_explicitly_typed.dart:8:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_explicitly_typed.dart:8:3 -> DoubleConstant(1.0) +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_explicitly_typed.dart:9:3 -> BoolConstant(false) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_explicitly_typed.dart:9:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_explicitly_typed.dart:9:3 -> DoubleConstant(1.0) +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_explicitly_typed.dart:9:3 -> BoolConstant(false) +Evaluated: AsExpression @ org-dartlang-testcase:///expression_explicitly_typed.dart:9:3 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_explicitly_typed.dart:9:3 -> DoubleConstant(1.0) +Extra constant evaluation: evaluated: 35, effectively constant: 10 diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_explicitly_typed.dart.textual_outline_modelled.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart new file mode 100644 index 00000000000..0ea2821a425 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart @@ -0,0 +1,20 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +extension E on int { + void foo() { + 1.=> this; + 1.(p) => this; + 1?.=> this; + 1?.(p) => this; + 1..=> this; + 1..(p) => this; + 1?..=> this; + 1?..(p) => this; + } +} + +void main() { + 1.foo(); +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.expect new file mode 100644 index 00000000000..e2757d7262e --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.expect @@ -0,0 +1,63 @@ +library; +import self as self; +import "dart:core" as core; + +extension E on core::int { + method foo = self::E|foo; + method tearoff foo = self::E|get#foo; +} +static extension-member method E|foo(lowered final core::int #this) → void { + { + final synthesized core::int anonymous#this = 1; + core::int #t1; + #t1 = anonymous#this; + } + { + core::int p = 1; + core::int #t2; + #t2 = #this; + } + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t3; + #t3 = anonymous#this; + } =>#t3; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t4; + #t4 = #this; + } =>#t4; + let final core::int #t5 = 1 in block { + { + final synthesized core::int anonymous#this = #t5; + core::int #t6; + #t6 = let dynamic #t7 = anonymous#this in anonymous#this; + } + } =>#t5; + let final core::int #t8 = 1 in block { + { + core::int p = #t8; + core::int #t9; + #t9 = let dynamic #t10 = #this in p; + } + } =>#t8; + let final core::int #t11 = 1 in #t11 == null ?{core::int} #t11 : block { + let synthesized core::int anonymous#receiver = #t11 in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t12; + #t12 = let dynamic #t13 = anonymous#this in anonymous#this; + } =>#t12; + } =>#t11; + let final core::int #t14 = 1 in #t14 == null ?{core::int} #t14 : block { + let synthesized core::int anonymous#receiver = #t14 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t15; + #t15 = let dynamic #t16 = #this in p; + } =>#t15; + } =>#t14; +} +static extension-member method E|get#foo(lowered final core::int #this) → () → void + return () → void => self::E|foo(#this); +static method main() → void { + self::E|foo(1); +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.modular.expect new file mode 100644 index 00000000000..e2757d7262e --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.modular.expect @@ -0,0 +1,63 @@ +library; +import self as self; +import "dart:core" as core; + +extension E on core::int { + method foo = self::E|foo; + method tearoff foo = self::E|get#foo; +} +static extension-member method E|foo(lowered final core::int #this) → void { + { + final synthesized core::int anonymous#this = 1; + core::int #t1; + #t1 = anonymous#this; + } + { + core::int p = 1; + core::int #t2; + #t2 = #this; + } + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t3; + #t3 = anonymous#this; + } =>#t3; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t4; + #t4 = #this; + } =>#t4; + let final core::int #t5 = 1 in block { + { + final synthesized core::int anonymous#this = #t5; + core::int #t6; + #t6 = let dynamic #t7 = anonymous#this in anonymous#this; + } + } =>#t5; + let final core::int #t8 = 1 in block { + { + core::int p = #t8; + core::int #t9; + #t9 = let dynamic #t10 = #this in p; + } + } =>#t8; + let final core::int #t11 = 1 in #t11 == null ?{core::int} #t11 : block { + let synthesized core::int anonymous#receiver = #t11 in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t12; + #t12 = let dynamic #t13 = anonymous#this in anonymous#this; + } =>#t12; + } =>#t11; + let final core::int #t14 = 1 in #t14 == null ?{core::int} #t14 : block { + let synthesized core::int anonymous#receiver = #t14 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t15; + #t15 = let dynamic #t16 = #this in p; + } =>#t15; + } =>#t14; +} +static extension-member method E|get#foo(lowered final core::int #this) → () → void + return () → void => self::E|foo(#this); +static method main() → void { + self::E|foo(1); +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.outline.expect new file mode 100644 index 00000000000..0ee47384fc6 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.outline.expect @@ -0,0 +1,14 @@ +library; +import self as self; +import "dart:core" as core; + +extension E on core::int { + method foo = self::E|foo; + method tearoff foo = self::E|get#foo; +} +static extension-member method E|foo(lowered final core::int #this) → void + ; +static extension-member method E|get#foo(lowered final core::int #this) → () → void + return () → void => self::E|foo(#this); +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.transformed.expect new file mode 100644 index 00000000000..bb2b20b871b --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.strong.transformed.expect @@ -0,0 +1,87 @@ +library; +import self as self; +import "dart:core" as core; + +extension E on core::int { + method foo = self::E|foo; + method tearoff foo = self::E|get#foo; +} +static extension-member method E|foo(lowered final core::int #this) → void { + { + final synthesized core::int anonymous#this = 1; + core::int #t1; + #t1 = anonymous#this; + } + { + core::int p = 1; + core::int #t2; + #t2 = #this; + } + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t3; + #t3 = anonymous#this; + } =>#t3; + let synthesized core::int anonymous#receiver = 1 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t4; + #t4 = #this; + } =>#t4; + let final core::int #t5 = 1 in block { + { + final synthesized core::int anonymous#this = #t5; + core::int #t6; + #t6 = let dynamic #t7 = anonymous#this in anonymous#this; + } + } =>#t5; + let final core::int #t8 = 1 in block { + { + core::int p = #t8; + core::int #t9; + #t9 = let dynamic #t10 = #this in p; + } + } =>#t8; + let final core::int #t11 = 1 in #t11 == null ?{core::int} #t11 : block { + let synthesized core::int anonymous#receiver = #t11 in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t12; + #t12 = let dynamic #t13 = anonymous#this in anonymous#this; + } =>#t12; + } =>#t11; + let final core::int #t14 = 1 in #t14 == null ?{core::int} #t14 : block { + let synthesized core::int anonymous#receiver = #t14 in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t15; + #t15 = let dynamic #t16 = #this in p; + } =>#t15; + } =>#t14; +} +static extension-member method E|get#foo(lowered final core::int #this) → () → void + return () → void => self::E|foo(#this); +static method main() → void { + self::E|foo(1); +} + + +Extra constant evaluation status: +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_extension_method.dart:9:5 -> BoolConstant(false) +Evaluated: AsExpression @ org-dartlang-testcase:///expression_extension_method.dart:9:5 -> DoubleConstant(1.0) +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_extension_method.dart:10:5 -> BoolConstant(false) +Evaluated: AsExpression @ org-dartlang-testcase:///expression_extension_method.dart:10:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:11:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:11:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:12:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:12:5 -> DoubleConstant(1.0) +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_extension_method.dart:13:5 -> BoolConstant(false) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:13:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:13:5 -> DoubleConstant(1.0) +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_extension_method.dart:13:5 -> BoolConstant(false) +Evaluated: AsExpression @ org-dartlang-testcase:///expression_extension_method.dart:13:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:13:5 -> DoubleConstant(1.0) +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_extension_method.dart:14:5 -> BoolConstant(false) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:14:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:14:5 -> DoubleConstant(1.0) +Evaluated: EqualsNull @ org-dartlang-testcase:///expression_extension_method.dart:14:5 -> BoolConstant(false) +Evaluated: AsExpression @ org-dartlang-testcase:///expression_extension_method.dart:14:5 -> DoubleConstant(1.0) +Evaluated: VariableGet @ org-dartlang-testcase:///expression_extension_method.dart:14:5 -> DoubleConstant(1.0) +Extra constant evaluation: evaluated: 74, effectively constant: 20 diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline.expect new file mode 100644 index 00000000000..41e1ed2b527 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline.expect @@ -0,0 +1,5 @@ +extension E on int { + void foo() {} +} + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..41e1ed2b527 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_extension_method.dart.textual_outline_modelled.expect @@ -0,0 +1,5 @@ +extension E on int { + void foo() {} +} + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart new file mode 100644 index 00000000000..76ca33cbf90 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +int? i = null; + +void main() { + i?.(p) => 1; + i?.(p) => p; + i?.(p) => p.isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect new file mode 100644 index 00000000000..b8739c2516c --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.expect @@ -0,0 +1,22 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t1; + #t1 = 1; + } =>#t1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = p{core::int}; + } =>#t2; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + core::int p = anonymous#receiver as core::int; + core::bool #t3; + #t3 = p{core::int}.{core::int::isEven}{core::bool}; + } =>#t3; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..b8739c2516c --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.modular.expect @@ -0,0 +1,22 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t1; + #t1 = 1; + } =>#t1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = p{core::int}; + } =>#t2; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + core::int p = anonymous#receiver as core::int; + core::bool #t3; + #t3 = p{core::int}.{core::int::isEven}{core::bool}; + } =>#t3; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..c17141d4913 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.outline.expect @@ -0,0 +1,7 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i; +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..b8739c2516c --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.strong.transformed.expect @@ -0,0 +1,22 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t1; + #t1 = 1; + } =>#t1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + core::int p = anonymous#receiver as core::int; + core::int #t2; + #t2 = p{core::int}; + } =>#t2; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + core::int p = anonymous#receiver as core::int; + core::bool #t3; + #t3 = p{core::int}.{core::int::isEven}{core::bool}; + } =>#t3; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_with_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart new file mode 100644 index 00000000000..0029b5bc486 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart @@ -0,0 +1,12 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +int? i = null; + +void main() { + i?.=> 1; + i?.=> this; + i?.=> this.isEven; + i?.=> isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect new file mode 100644 index 00000000000..e7c014343cb --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.expect @@ -0,0 +1,27 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t1; + #t1 = 1; + } =>#t1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t2; + #t2 = anonymous#this{core::int}; + } =>#t2; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::bool #t3; + #t3 = anonymous#this{core::int}.{core::int::isEven}{core::bool}; + } =>#t3; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::bool #t4; + #t4 = anonymous#this{core::int}.{core::int::isEven}{core::bool}; + } =>#t4; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..e7c014343cb --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.modular.expect @@ -0,0 +1,27 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t1; + #t1 = 1; + } =>#t1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t2; + #t2 = anonymous#this{core::int}; + } =>#t2; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::bool #t3; + #t3 = anonymous#this{core::int}.{core::int::isEven}{core::bool}; + } =>#t3; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::bool #t4; + #t4 = anonymous#this{core::int}.{core::int::isEven}{core::bool}; + } =>#t4; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..c17141d4913 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.outline.expect @@ -0,0 +1,7 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i; +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..e7c014343cb --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.strong.transformed.expect @@ -0,0 +1,27 @@ +library; +import self as self; +import "dart:core" as core; + +static field core::int? i = null; +static method main() → void { + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t1; + #t1 = 1; + } =>#t1; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::int?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::int #t2; + #t2 = anonymous#this{core::int}; + } =>#t2; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::bool #t3; + #t3 = anonymous#this{core::int}.{core::int::isEven}{core::bool}; + } =>#t3; + let synthesized core::int? anonymous#receiver = self::i in anonymous#receiver == null ?{core::bool?} null : block { + final synthesized core::int anonymous#this = anonymous#receiver as core::int; + core::bool #t4; + #t4 = anonymous#this{core::int}.{core::int::isEven}{core::bool}; + } =>#t4; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..eedd821d211 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_null_aware_without_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1,3 @@ +int? i = null; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart new file mode 100644 index 00000000000..d9ac3af0618 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart @@ -0,0 +1,20 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +int f() => 5; + +class A { + final int x; + A.n1() : x = 42.=> this; + A.n2() : x = 'abc'.=> this.length; + A.n3() : x = f.=> this(); + A.n4() : x = 'def'.=> this.toString().length; +} + +void main() { + A.n1(); + A.n2(); + A.n3(); + A.n4(); +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.expect new file mode 100644 index 00000000000..27fa45b34e8 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.expect @@ -0,0 +1,55 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + final field core::int x; + constructor n1() → self::A + : self::A::x = block { + final synthesized core::int anonymous#this = 42; + core::int #t1; + #t1 = anonymous#this; + } =>#t1, super core::Object::•() + ; + constructor n2() → self::A + : self::A::x = block { + final synthesized core::String anonymous#this = "abc"; + core::int #t2; + #t2 = anonymous#this.{core::String::length}{core::int}; + } =>#t2, super core::Object::•() + ; + constructor n3() → self::A + : self::A::x = block { + final synthesized () → core::int anonymous#this = #C1; + core::int #t3; + #t3 = anonymous#this(){() → core::int}; + } =>#t3, super core::Object::•() + ; + constructor n4() → self::A + : self::A::x = block { + final synthesized core::String anonymous#this = "def"; + core::int #t4; + #t4 = anonymous#this.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}; + } =>#t4, super core::Object::•() + ; + static synthetic method _#n1#tearOff() → self::A + return new self::A::n1(); + static synthetic method _#n2#tearOff() → self::A + return new self::A::n2(); + static synthetic method _#n3#tearOff() → self::A + return new self::A::n3(); + static synthetic method _#n4#tearOff() → self::A + return new self::A::n4(); +} +static method f() → core::int + return 5; +static method main() → void { + new self::A::n1(); + new self::A::n2(); + new self::A::n3(); + new self::A::n4(); +} + +constants { + #C1 = static-tearoff self::f +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect new file mode 100644 index 00000000000..27fa45b34e8 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.modular.expect @@ -0,0 +1,55 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + final field core::int x; + constructor n1() → self::A + : self::A::x = block { + final synthesized core::int anonymous#this = 42; + core::int #t1; + #t1 = anonymous#this; + } =>#t1, super core::Object::•() + ; + constructor n2() → self::A + : self::A::x = block { + final synthesized core::String anonymous#this = "abc"; + core::int #t2; + #t2 = anonymous#this.{core::String::length}{core::int}; + } =>#t2, super core::Object::•() + ; + constructor n3() → self::A + : self::A::x = block { + final synthesized () → core::int anonymous#this = #C1; + core::int #t3; + #t3 = anonymous#this(){() → core::int}; + } =>#t3, super core::Object::•() + ; + constructor n4() → self::A + : self::A::x = block { + final synthesized core::String anonymous#this = "def"; + core::int #t4; + #t4 = anonymous#this.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}; + } =>#t4, super core::Object::•() + ; + static synthetic method _#n1#tearOff() → self::A + return new self::A::n1(); + static synthetic method _#n2#tearOff() → self::A + return new self::A::n2(); + static synthetic method _#n3#tearOff() → self::A + return new self::A::n3(); + static synthetic method _#n4#tearOff() → self::A + return new self::A::n4(); +} +static method f() → core::int + return 5; +static method main() → void { + new self::A::n1(); + new self::A::n2(); + new self::A::n3(); + new self::A::n4(); +} + +constants { + #C1 = static-tearoff self::f +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.outline.expect new file mode 100644 index 00000000000..f9502b3a729 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.outline.expect @@ -0,0 +1,27 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + final field core::int x; + constructor n1() → self::A + ; + constructor n2() → self::A + ; + constructor n3() → self::A + ; + constructor n4() → self::A + ; + static synthetic method _#n1#tearOff() → self::A + return new self::A::n1(); + static synthetic method _#n2#tearOff() → self::A + return new self::A::n2(); + static synthetic method _#n3#tearOff() → self::A + return new self::A::n3(); + static synthetic method _#n4#tearOff() → self::A + return new self::A::n4(); +} +static method f() → core::int + ; +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect new file mode 100644 index 00000000000..27fa45b34e8 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.strong.transformed.expect @@ -0,0 +1,55 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + final field core::int x; + constructor n1() → self::A + : self::A::x = block { + final synthesized core::int anonymous#this = 42; + core::int #t1; + #t1 = anonymous#this; + } =>#t1, super core::Object::•() + ; + constructor n2() → self::A + : self::A::x = block { + final synthesized core::String anonymous#this = "abc"; + core::int #t2; + #t2 = anonymous#this.{core::String::length}{core::int}; + } =>#t2, super core::Object::•() + ; + constructor n3() → self::A + : self::A::x = block { + final synthesized () → core::int anonymous#this = #C1; + core::int #t3; + #t3 = anonymous#this(){() → core::int}; + } =>#t3, super core::Object::•() + ; + constructor n4() → self::A + : self::A::x = block { + final synthesized core::String anonymous#this = "def"; + core::int #t4; + #t4 = anonymous#this.{core::Object::toString}(){() → core::String}.{core::String::length}{core::int}; + } =>#t4, super core::Object::•() + ; + static synthetic method _#n1#tearOff() → self::A + return new self::A::n1(); + static synthetic method _#n2#tearOff() → self::A + return new self::A::n2(); + static synthetic method _#n3#tearOff() → self::A + return new self::A::n3(); + static synthetic method _#n4#tearOff() → self::A + return new self::A::n4(); +} +static method f() → core::int + return 5; +static method main() → void { + new self::A::n1(); + new self::A::n2(); + new self::A::n3(); + new self::A::n4(); +} + +constants { + #C1 = static-tearoff self::f +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline.expect new file mode 100644 index 00000000000..ad900e9c816 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline.expect @@ -0,0 +1,11 @@ +int f() => 5; + +class A { + final int x; + A.n1() : x = 42.=> this; + A.n2() : x = 'abc'.=> this.length; + A.n3() : x = f.=> this(); + A.n4() : x = 'def'.=> this.toString().length; +} + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..102c9cf6b46 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_this_in_initializer.dart.textual_outline_modelled.expect @@ -0,0 +1,11 @@ +class A { + A.n1() : x = 42.=> this; + A.n2() : x = 'abc'.=> this.length; + A.n3() : x = f.=> this(); + A.n4() : x = 'def'.=> this.toString().length; + final int x; +} + +int f() => 5; + +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart new file mode 100644 index 00000000000..4b3fda26691 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart @@ -0,0 +1,9 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +void main() { + 1.(p) => 1; + 1.(p) => p; + 1.(p) => p.isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.expect new file mode 100644 index 00000000000..181f5bdf90e --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.expect @@ -0,0 +1,21 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + core::int p = 1; + core::int #t1; + #t1 = 1; + } + { + core::int p = 1; + core::int #t2; + #t2 = p; + } + { + core::int p = 1; + core::bool #t3; + #t3 = p.{core::int::isEven}{core::bool}; + } +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..181f5bdf90e --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.modular.expect @@ -0,0 +1,21 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + core::int p = 1; + core::int #t1; + #t1 = 1; + } + { + core::int p = 1; + core::int #t2; + #t2 = p; + } + { + core::int p = 1; + core::bool #t3; + #t3 = p.{core::int::isEven}{core::bool}; + } +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..2982c48b884 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.outline.expect @@ -0,0 +1,5 @@ +library; +import self as self; + +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..181f5bdf90e --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.strong.transformed.expect @@ -0,0 +1,21 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + core::int p = 1; + core::int #t1; + #t1 = 1; + } + { + core::int p = 1; + core::int #t2; + #t2 = p; + } + { + core::int p = 1; + core::bool #t3; + #t3 = p.{core::int::isEven}{core::bool}; + } +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_with_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart new file mode 100644 index 00000000000..dc37fc6a5d8 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart @@ -0,0 +1,10 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +void main() { + 1.=> 1; + 1.=> this; + 1.=> this.isEven; + 1.=> isEven; +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.expect new file mode 100644 index 00000000000..73493e06033 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.expect @@ -0,0 +1,26 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + final synthesized core::int anonymous#this = 1; + core::int #t1; + #t1 = 1; + } + { + final synthesized core::int anonymous#this = 1; + core::int #t2; + #t2 = anonymous#this; + } + { + final synthesized core::int anonymous#this = 1; + core::bool #t3; + #t3 = anonymous#this.{core::int::isEven}{core::bool}; + } + { + final synthesized core::int anonymous#this = 1; + core::bool #t4; + #t4 = anonymous#this.{core::int::isEven}{core::bool}; + } +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.modular.expect new file mode 100644 index 00000000000..73493e06033 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.modular.expect @@ -0,0 +1,26 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + final synthesized core::int anonymous#this = 1; + core::int #t1; + #t1 = 1; + } + { + final synthesized core::int anonymous#this = 1; + core::int #t2; + #t2 = anonymous#this; + } + { + final synthesized core::int anonymous#this = 1; + core::bool #t3; + #t3 = anonymous#this.{core::int::isEven}{core::bool}; + } + { + final synthesized core::int anonymous#this = 1; + core::bool #t4; + #t4 = anonymous#this.{core::int::isEven}{core::bool}; + } +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.outline.expect new file mode 100644 index 00000000000..2982c48b884 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.outline.expect @@ -0,0 +1,5 @@ +library; +import self as self; + +static method main() → void + ; diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect new file mode 100644 index 00000000000..73493e06033 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.strong.transformed.expect @@ -0,0 +1,26 @@ +library; +import self as self; +import "dart:core" as core; + +static method main() → void { + { + final synthesized core::int anonymous#this = 1; + core::int #t1; + #t1 = 1; + } + { + final synthesized core::int anonymous#this = 1; + core::int #t2; + #t2 = anonymous#this; + } + { + final synthesized core::int anonymous#this = 1; + core::bool #t3; + #t3 = anonymous#this.{core::int::isEven}{core::bool}; + } + { + final synthesized core::int anonymous#this = 1; + core::bool #t4; + #t4 = anonymous#this.{core::int::isEven}{core::bool}; + } +} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..ab73b3a234a --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/expression_without_parameter.dart.textual_outline_modelled.expect @@ -0,0 +1 @@ +void main() {} diff --git a/pkg/front_end/testcases/dart2js/anonymous_methods/folder.options b/pkg/front_end/testcases/dart2js/anonymous_methods/folder.options new file mode 100644 index 00000000000..c5e7ecaafc6 --- /dev/null +++ b/pkg/front_end/testcases/dart2js/anonymous_methods/folder.options @@ -0,0 +1,2 @@ +--target=dart2js +--enable-experiment=anonymous-methods diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart index 4e0a6a87b08..d9c52eb72d4 100644 --- a/pkg/kernel/lib/target/targets.dart +++ b/pkg/kernel/lib/target/targets.dart @@ -447,6 +447,13 @@ abstract class Target { /// Targets can opt in to using this node for general inlining. bool get supportsFileUriExpression => false; + /// Whether this target supports capturing `Let` variables. + /// + /// If the target does not support capturing `Let` variables then a `Let` + /// expression whose variable may be captured in a nested function literal + /// will be lowered to a block expression with a variable declaration. + bool get supportsLetVariableCapture => true; + /// Bit mask of [LateLowering] values for the late lowerings that should /// be performed by the CFE. /// diff --git a/tests/language/anonymous_methods/block/error_test.dart b/tests/language/anonymous_methods/block/error_test.dart index 33759a92b51..89968218182 100644 --- a/tests/language/anonymous_methods/block/error_test.dart +++ b/tests/language/anonymous_methods/block/error_test.dart @@ -44,6 +44,19 @@ void main() { // [analyzer] COMPILE_TIME_ERROR.ANONYMOUS_METHOD_WRONG_PARAMETER_TYPE // [cfe] The receiver type 'String' must be assignable to the formal parameter type 'int' of an anonymous method. + // Using a void value as receiver. + StringBuffer('').{ return print('0'); }.toString(); +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT +// ^ +// [cfe] This expression has type 'void' and can't be used. + + StringBuffer('').{ return print('0'); }.{ print('1'); }; +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT +// ^ +// [cfe] This expression has type 'void' and can't be used. + // Break outside of loop/switch. 1.{ break; diff --git a/tests/language/anonymous_methods/expression/extension_member_test.dart b/tests/language/anonymous_methods/expression/extension_member_test.dart index 014da992eab..a4aa1f2872d 100644 --- a/tests/language/anonymous_methods/expression/extension_member_test.dart +++ b/tests/language/anonymous_methods/expression/extension_member_test.dart @@ -12,12 +12,31 @@ extension on int { int get g2 => this + '$this'.=> length; bool m1() { - final i = () { return this + '$this'.=> length + length; }(); + final i = () { return this + '$this'.=> this.length + length; }(); return i.isEven; } bool m2() { - final i = this + '$this'.=> () { return length + length; }(); + final i = this + '$this'.=> () { return this.length + length; }(); + return i.isEven; + } + + bool m3() { + final String? receiver = '$this'; + final i = (receiver?.=> () { return this.length + length; }()) ?? -1; + return i.isEven; + } + + bool m4() { + int i = -1; + '$this'..=> () { i = this.length + length; }(); + return i.isEven; + } + + bool m5() { + final String? receiver = '$this'; + int i = -1; + receiver?..=> () { i = this.length + length; }(); return i.isEven; } } @@ -27,4 +46,7 @@ void main() { Expect.equals(2, 1.g2); Expect.equals(false, 1.m1()); Expect.equals(false, 1.m2()); + Expect.equals(true, 1.m3()); + Expect.equals(true, 1.m4()); + Expect.equals(true, 1.m5()); }