Don't hoist function literals when reordering expressions to support "named arguments anywhere".

Hoisting function literals isn't necessary because evaluating a
function literal doesn't have any side effects.

This paves the way for adding support for
https://github.com/dart-lang/language/issues/731 (improved inference
for fold etc.), which will require deferring type analysis of function
literals.  By not hoisting them, we will be able to avoid a lot of
unnecessary complexity in the logic to defer them.

Change-Id: I0a49aa9f769f0506569e6029a3697898308600c2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/241007
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 72cd04e..3ec34d7 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -3595,7 +3595,9 @@
 
   Expression _hoist(Expression expression, DartType type,
       List<VariableDeclaration>? hoistedExpressions) {
-    if (hoistedExpressions != null && expression is! ThisExpression) {
+    if (hoistedExpressions != null &&
+        expression is! ThisExpression &&
+        expression is! FunctionExpression) {
       VariableDeclaration variable = createVariable(expression, type);
       hoistedExpressions.add(variable);
       return createVariableGet(variable);
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect
index ca760ff..23c03fe 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect
@@ -11,9 +11,9 @@
 }
 static method main() → void {
   asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
-  let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
+  let final asy::StreamController<core::String> #t1 = controller in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, (dynamic s) → Null {
     core::print(s);
-  } in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
+  });
 }
 static method Extension|call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|call::T%> #this, core::Function onData) → asy::StreamSubscription<self::Extension|call::T%> {
   return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
index ca760ff..23c03fe 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
@@ -11,9 +11,9 @@
 }
 static method main() → void {
   asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
-  let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
+  let final asy::StreamController<core::String> #t1 = controller in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, (dynamic s) → Null {
     core::print(s);
-  } in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
+  });
 }
 static method Extension|call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|call::T%> #this, core::Function onData) → asy::StreamSubscription<self::Extension|call::T%> {
   return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect
index ca760ff..23c03fe 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect
@@ -11,9 +11,9 @@
 }
 static method main() → void {
   asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
-  let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
+  let final asy::StreamController<core::String> #t1 = controller in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, (dynamic s) → Null {
     core::print(s);
-  } in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
+  });
 }
 static method Extension|call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|call::T%> #this, core::Function onData) → asy::StreamSubscription<self::Extension|call::T%> {
   return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {