Skip to content

Commit 8f8a63f

Browse files
stereotype441Commit Bot
authored and
Commit Bot
committed
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 dart-lang/language#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 <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent d2126a3 commit 8f8a63f

File tree

4 files changed

+9
-7
lines changed

4 files changed

+9
-7
lines changed

pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3595,7 +3595,9 @@ class TypeInferrerImpl implements TypeInferrer {
35953595

35963596
Expression _hoist(Expression expression, DartType type,
35973597
List<VariableDeclaration>? hoistedExpressions) {
3598-
if (hoistedExpressions != null && expression is! ThisExpression) {
3598+
if (hoistedExpressions != null &&
3599+
expression is! ThisExpression &&
3600+
expression is! FunctionExpression) {
35993601
VariableDeclaration variable = createVariable(expression, type);
36003602
hoistedExpressions.add(variable);
36013603
return createVariableGet(variable);

pkg/front_end/testcases/extensions/issue40596.dart.weak.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ extension Extension<T extends core::Object? = dynamic> on asy::Stream<T%> {
1111
}
1212
static method main() → void {
1313
asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
14-
let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
14+
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 {
1515
core::print(s);
16-
} in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
16+
});
1717
}
1818
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%> {
1919
return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {

pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ extension Extension<T extends core::Object? = dynamic> on asy::Stream<T%> {
1111
}
1212
static method main() → void {
1313
asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
14-
let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
14+
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 {
1515
core::print(s);
16-
} in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
16+
});
1717
}
1818
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%> {
1919
return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {

pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ extension Extension<T extends core::Object? = dynamic> on asy::Stream<T%> {
1111
}
1212
static method main() → void {
1313
asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
14-
let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
14+
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 {
1515
core::print(s);
16-
} in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
16+
});
1717
}
1818
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%> {
1919
return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {

0 commit comments

Comments
 (0)