From 281a8a5d2bb39ff9cff86d66e9662461555e994c Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Wed, 21 Sep 2022 08:49:16 +0000 Subject: [PATCH] [cfe] Implement RecordLiteral.transformOrRemoveChildren Closes #50004 Change-Id: Iaea68b563bd59bb3280bd6ffb86f18d50f3d2a4b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/260105 Reviewed-by: Chloe Stefantsova Commit-Queue: Johnni Winther --- pkg/front_end/testcases/records/issue50004.dart | 7 +++++++ .../testcases/records/issue50004.dart.strong.expect | 12 ++++++++++++ .../issue50004.dart.strong.transformed.expect | 12 ++++++++++++ .../records/issue50004.dart.textual_outline.expect | 1 + .../issue50004.dart.textual_outline_modelled.expect | 1 + .../testcases/records/issue50004.dart.weak.expect | 12 ++++++++++++ .../records/issue50004.dart.weak.modular.expect | 12 ++++++++++++ .../records/issue50004.dart.weak.outline.expect | 5 +++++ .../records/issue50004.dart.weak.transformed.expect | 12 ++++++++++++ .../records/record_literal.dart.strong.expect | 7 ++++++- .../record_literal.dart.strong.transformed.expect | 10 ++++++---- .../records/record_literal.dart.weak.expect | 7 ++++++- .../records/record_literal.dart.weak.modular.expect | 7 ++++++- .../record_literal.dart.weak.transformed.expect | 10 ++++++---- pkg/kernel/lib/ast.dart | 7 ++++++- 15 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 pkg/front_end/testcases/records/issue50004.dart create mode 100644 pkg/front_end/testcases/records/issue50004.dart.strong.expect create mode 100644 pkg/front_end/testcases/records/issue50004.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/records/issue50004.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/records/issue50004.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/records/issue50004.dart.weak.expect create mode 100644 pkg/front_end/testcases/records/issue50004.dart.weak.modular.expect create mode 100644 pkg/front_end/testcases/records/issue50004.dart.weak.outline.expect create mode 100644 pkg/front_end/testcases/records/issue50004.dart.weak.transformed.expect diff --git a/pkg/front_end/testcases/records/issue50004.dart b/pkg/front_end/testcases/records/issue50004.dart new file mode 100644 index 00000000000..147a0262e1c --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart @@ -0,0 +1,7 @@ +// Copyright (c) 2022, 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. + +main() { + var r1 = (1, const [42]); +} \ No newline at end of file diff --git a/pkg/front_end/testcases/records/issue50004.dart.strong.expect b/pkg/front_end/testcases/records/issue50004.dart.strong.expect new file mode 100644 index 00000000000..8fed9112176 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.strong.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method main() → dynamic { + (core::int, core::List) r1 = (1, #C2); +} + +constants { + #C1 = 42 + #C2 = [#C1] +} diff --git a/pkg/front_end/testcases/records/issue50004.dart.strong.transformed.expect b/pkg/front_end/testcases/records/issue50004.dart.strong.transformed.expect new file mode 100644 index 00000000000..8fed9112176 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.strong.transformed.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method main() → dynamic { + (core::int, core::List) r1 = (1, #C2); +} + +constants { + #C1 = 42 + #C2 = [#C1] +} diff --git a/pkg/front_end/testcases/records/issue50004.dart.textual_outline.expect b/pkg/front_end/testcases/records/issue50004.dart.textual_outline.expect new file mode 100644 index 00000000000..bae895adcb6 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.textual_outline.expect @@ -0,0 +1 @@ +main() {} diff --git a/pkg/front_end/testcases/records/issue50004.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/records/issue50004.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..bae895adcb6 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.textual_outline_modelled.expect @@ -0,0 +1 @@ +main() {} diff --git a/pkg/front_end/testcases/records/issue50004.dart.weak.expect b/pkg/front_end/testcases/records/issue50004.dart.weak.expect new file mode 100644 index 00000000000..66c8120d611 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.weak.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method main() → dynamic { + (core::int, core::List) r1 = (1, #C2); +} + +constants { + #C1 = 42 + #C2 = [#C1] +} diff --git a/pkg/front_end/testcases/records/issue50004.dart.weak.modular.expect b/pkg/front_end/testcases/records/issue50004.dart.weak.modular.expect new file mode 100644 index 00000000000..66c8120d611 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.weak.modular.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method main() → dynamic { + (core::int, core::List) r1 = (1, #C2); +} + +constants { + #C1 = 42 + #C2 = [#C1] +} diff --git a/pkg/front_end/testcases/records/issue50004.dart.weak.outline.expect b/pkg/front_end/testcases/records/issue50004.dart.weak.outline.expect new file mode 100644 index 00000000000..e2cba6be4d1 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.weak.outline.expect @@ -0,0 +1,5 @@ +library /*isNonNullableByDefault*/; +import self as self; + +static method main() → dynamic + ; diff --git a/pkg/front_end/testcases/records/issue50004.dart.weak.transformed.expect b/pkg/front_end/testcases/records/issue50004.dart.weak.transformed.expect new file mode 100644 index 00000000000..66c8120d611 --- /dev/null +++ b/pkg/front_end/testcases/records/issue50004.dart.weak.transformed.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method main() → dynamic { + (core::int, core::List) r1 = (1, #C2); +} + +constants { + #C1 = 42 + #C2 = [#C1] +} diff --git a/pkg/front_end/testcases/records/record_literal.dart.strong.expect b/pkg/front_end/testcases/records/record_literal.dart.strong.expect index e6cfefc636e..0c857e69ed2 100644 --- a/pkg/front_end/testcases/records/record_literal.dart.strong.expect +++ b/pkg/front_end/testcases/records/record_literal.dart.strong.expect @@ -26,7 +26,7 @@ static method method() → dynamic { (0, {b: 1}); ({a: 0, b: 1}); let final core::int #t1 = 0 in (1, {a: #t1}); - (core::int, core::String); + (#C1, #C2); } static method sorting() → dynamic { ({a: 0, b: 1, c: 2, d: 3}); @@ -40,3 +40,8 @@ static method sorting() → dynamic { let final core::int #t23 = 0 in let final core::int #t24 = 1 in let final core::int #t25 = 2 in (#t23, #t25, 3, {a: #t24, b: 4, c: 5}); let final core::int #t26 = 0 in let final core::int #t27 = 1 in let final core::int #t28 = 2 in (#t27, #t28, 3, {a: #t26, b: 4, c: 5}); } + +constants { + #C1 = TypeLiteralConstant(core::int) + #C2 = TypeLiteralConstant(core::String) +} diff --git a/pkg/front_end/testcases/records/record_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/records/record_literal.dart.strong.transformed.expect index 2f10b09d26a..cc62795601d 100644 --- a/pkg/front_end/testcases/records/record_literal.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/records/record_literal.dart.strong.transformed.expect @@ -26,7 +26,7 @@ static method method() → dynamic { (0, {b: 1}); ({a: 0, b: 1}); let final core::int #t1 = 0 in (1, {a: #t1}); - (core::int, core::String); + (#C1, #C2); } static method sorting() → dynamic { ({a: 0, b: 1, c: 2, d: 3}); @@ -41,11 +41,13 @@ static method sorting() → dynamic { let final core::int #t26 = 0 in let final core::int #t27 = 1 in let final core::int #t28 = 2 in (#t27, #t28, 3, {a: #t26, b: 4, c: 5}); } +constants { + #C1 = TypeLiteralConstant(core::int) + #C2 = TypeLiteralConstant(core::String) +} Extra constant evaluation status: Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:10:7 -> IntConstant(0) -Evaluated: TypeLiteral @ org-dartlang-testcase:///record_literal.dart:11:4 -> TypeLiteralConstant(int) -Evaluated: TypeLiteral @ org-dartlang-testcase:///record_literal.dart:11:9 -> TypeLiteralConstant(String) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:16:7 -> IntConstant(0) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:16:13 -> IntConstant(1) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:16:19 -> IntConstant(2) @@ -73,4 +75,4 @@ Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:23:10 -> I Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:24:10 -> IntConstant(1) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:24:13 -> IntConstant(2) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:24:7 -> IntConstant(0) -Extra constant evaluation: evaluated: 75, effectively constant: 30 +Extra constant evaluation: evaluated: 73, effectively constant: 28 diff --git a/pkg/front_end/testcases/records/record_literal.dart.weak.expect b/pkg/front_end/testcases/records/record_literal.dart.weak.expect index e6cfefc636e..f92f9ca6be8 100644 --- a/pkg/front_end/testcases/records/record_literal.dart.weak.expect +++ b/pkg/front_end/testcases/records/record_literal.dart.weak.expect @@ -26,7 +26,7 @@ static method method() → dynamic { (0, {b: 1}); ({a: 0, b: 1}); let final core::int #t1 = 0 in (1, {a: #t1}); - (core::int, core::String); + (#C1, #C2); } static method sorting() → dynamic { ({a: 0, b: 1, c: 2, d: 3}); @@ -40,3 +40,8 @@ static method sorting() → dynamic { let final core::int #t23 = 0 in let final core::int #t24 = 1 in let final core::int #t25 = 2 in (#t23, #t25, 3, {a: #t24, b: 4, c: 5}); let final core::int #t26 = 0 in let final core::int #t27 = 1 in let final core::int #t28 = 2 in (#t27, #t28, 3, {a: #t26, b: 4, c: 5}); } + +constants { + #C1 = TypeLiteralConstant(core::int*) + #C2 = TypeLiteralConstant(core::String*) +} diff --git a/pkg/front_end/testcases/records/record_literal.dart.weak.modular.expect b/pkg/front_end/testcases/records/record_literal.dart.weak.modular.expect index e6cfefc636e..f92f9ca6be8 100644 --- a/pkg/front_end/testcases/records/record_literal.dart.weak.modular.expect +++ b/pkg/front_end/testcases/records/record_literal.dart.weak.modular.expect @@ -26,7 +26,7 @@ static method method() → dynamic { (0, {b: 1}); ({a: 0, b: 1}); let final core::int #t1 = 0 in (1, {a: #t1}); - (core::int, core::String); + (#C1, #C2); } static method sorting() → dynamic { ({a: 0, b: 1, c: 2, d: 3}); @@ -40,3 +40,8 @@ static method sorting() → dynamic { let final core::int #t23 = 0 in let final core::int #t24 = 1 in let final core::int #t25 = 2 in (#t23, #t25, 3, {a: #t24, b: 4, c: 5}); let final core::int #t26 = 0 in let final core::int #t27 = 1 in let final core::int #t28 = 2 in (#t27, #t28, 3, {a: #t26, b: 4, c: 5}); } + +constants { + #C1 = TypeLiteralConstant(core::int*) + #C2 = TypeLiteralConstant(core::String*) +} diff --git a/pkg/front_end/testcases/records/record_literal.dart.weak.transformed.expect b/pkg/front_end/testcases/records/record_literal.dart.weak.transformed.expect index 63a54adf5e7..630e818cc97 100644 --- a/pkg/front_end/testcases/records/record_literal.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/records/record_literal.dart.weak.transformed.expect @@ -26,7 +26,7 @@ static method method() → dynamic { (0, {b: 1}); ({a: 0, b: 1}); let final core::int #t1 = 0 in (1, {a: #t1}); - (core::int, core::String); + (#C1, #C2); } static method sorting() → dynamic { ({a: 0, b: 1, c: 2, d: 3}); @@ -41,11 +41,13 @@ static method sorting() → dynamic { let final core::int #t26 = 0 in let final core::int #t27 = 1 in let final core::int #t28 = 2 in (#t27, #t28, 3, {a: #t26, b: 4, c: 5}); } +constants { + #C1 = TypeLiteralConstant(core::int*) + #C2 = TypeLiteralConstant(core::String*) +} Extra constant evaluation status: Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:10:7 -> IntConstant(0) -Evaluated: TypeLiteral @ org-dartlang-testcase:///record_literal.dart:11:4 -> TypeLiteralConstant(int*) -Evaluated: TypeLiteral @ org-dartlang-testcase:///record_literal.dart:11:9 -> TypeLiteralConstant(String*) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:16:7 -> IntConstant(0) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:16:13 -> IntConstant(1) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:16:19 -> IntConstant(2) @@ -73,4 +75,4 @@ Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:23:10 -> I Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:24:10 -> IntConstant(1) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:24:13 -> IntConstant(2) Evaluated: VariableGet @ org-dartlang-testcase:///record_literal.dart:24:7 -> IntConstant(0) -Extra constant evaluation: evaluated: 75, effectively constant: 30 +Extra constant evaluation: evaluated: 73, effectively constant: 28 diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart index 067c4ac643f..8660e20242e 100644 --- a/pkg/kernel/lib/ast.dart +++ b/pkg/kernel/lib/ast.dart @@ -8728,7 +8728,12 @@ class RecordLiteral extends Expression { } @override - void transformOrRemoveChildren(RemovingTransformer v) {} + void transformOrRemoveChildren(RemovingTransformer v) { + v.transformExpressionList(positional, this); + v.transformNamedExpressionList(named, this); + recordType = + v.visitDartType(recordType, cannotRemoveSentinel) as RecordType; + } @override String toString() {