Skip to content

Commit 8a4b95f

Browse files
chloestefantsovaCommit Queue
authored andcommitted
[cfe] Copy default values into redirecting factory parameters
Change-Id: Icae02993d15452ae8db8e9905ad77a2e5dfeae29 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432661 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 59d46be commit 8a4b95f

File tree

53 files changed

+175
-155
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+175
-155
lines changed

pkg/front_end/lib/src/fragment/factory/encoding.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,9 @@ class FactoryEncoding implements InferredTypeListener {
310310
}
311311
delayedDefaultValueCloners.add(new DelayedDefaultValueCloner(
312312
target!, _procedure,
313-
libraryBuilder: libraryBuilder, identicalSignatures: false));
313+
libraryBuilder: libraryBuilder,
314+
identicalSignatures: false,
315+
isOutlineNode: true));
314316
}
315317
}
316318

pkg/front_end/lib/src/kernel/body_builder.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5517,6 +5517,7 @@ class BodyBuilder extends StackListenerImpl
55175517
.withArguments(_context.redirectingFactoryTargetName),
55185518
initializer.fileOffset,
55195519
noLength);
5520+
variable.isErroneouslyInitialized = true;
55205521
} else {
55215522
if (!parameter.initializerWasInferred) {
55225523
variable.initializer = initializer..parent = variable;

pkg/front_end/lib/src/kernel/kernel_helper.dart

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,31 @@ class DelayedDefaultValueCloner {
175175
VariableDeclaration synthesizedParameter =
176176
_synthesized.positionalParameters[i];
177177
if (i < _original.positionalParameters.length) {
178-
_cloneInitializer(
179-
_original.positionalParameters[i], synthesizedParameter);
178+
if (i >= _synthesized.requiredParameterCount) {
179+
if (i < _original.requiredParameterCount) {
180+
// Coverage-ignore-block(suite): Not run.
181+
// Error case: use `null` as initializer.
182+
synthesizedParameter.initializer = new NullLiteral()
183+
..parent = synthesizedParameter;
184+
if (synthesizedParameter.type.nullability !=
185+
Nullability.nullable) {
186+
synthesizedParameter.isErroneouslyInitialized = true;
187+
}
188+
} else {
189+
_cloneInitializer(
190+
_original.positionalParameters[i], synthesizedParameter);
191+
}
192+
}
180193
} else {
181-
// Error case: use `null` as initializer.
182-
synthesizedParameter.initializer = new NullLiteral()
183-
..parent = synthesizedParameter;
194+
if (i >= _synthesized.requiredParameterCount) {
195+
// Error case: use `null` as initializer.
196+
synthesizedParameter.initializer = new NullLiteral()
197+
..parent = synthesizedParameter;
198+
if (synthesizedParameter.type.nullability != Nullability.nullable) {
199+
// Coverage-ignore-block(suite): Not run.
200+
synthesizedParameter.isErroneouslyInitialized = true;
201+
}
202+
}
184203
}
185204
}
186205
if (_synthesized.namedParameters.isNotEmpty) {
@@ -195,11 +214,20 @@ class DelayedDefaultValueCloner {
195214
VariableDeclaration? originalParameter =
196215
originalParameters[synthesizedParameter.name!];
197216
if (originalParameter != null) {
198-
_cloneInitializer(originalParameter, synthesizedParameter);
217+
if (!originalParameter.isRequired &&
218+
!synthesizedParameter.isRequired) {
219+
_cloneInitializer(originalParameter, synthesizedParameter);
220+
}
199221
} else {
200-
// Error case: use `null` as initializer.
201-
synthesizedParameter.initializer = new NullLiteral()
202-
..parent = synthesizedParameter;
222+
if (!synthesizedParameter.isRequired) {
223+
// Error case: use `null` as initializer.
224+
synthesizedParameter.initializer = new NullLiteral()
225+
..parent = synthesizedParameter;
226+
if (synthesizedParameter.type.nullability !=
227+
Nullability.nullable) {
228+
synthesizedParameter.isErroneouslyInitialized = true;
229+
}
230+
}
203231
}
204232
}
205233
}
@@ -214,6 +242,8 @@ class DelayedDefaultValueCloner {
214242
clonedParameter.initializer = cloner.clone(originalParameter.initializer!)
215243
..parent = clonedParameter;
216244
}
245+
clonedParameter.isErroneouslyInitialized |=
246+
originalParameter.isErroneouslyInitialized;
217247
}
218248

219249
void _cloneDefaultValueForSuperParameters(

pkg/front_end/test/coverage_suite_expected.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
680680
),
681681
// 100.0%.
682682
"package:front_end/src/kernel/body_builder.dart": (
683-
hitCount: 7215,
683+
hitCount: 7216,
684684
missCount: 0,
685685
),
686686
// 100.0%.
@@ -825,7 +825,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
825825
),
826826
// 100.0%.
827827
"package:front_end/src/kernel/kernel_helper.dart": (
828-
hitCount: 245,
828+
hitCount: 264,
829829
missCount: 0,
830830
),
831831
// 100.0%.
@@ -1026,7 +1026,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
10261026
),
10271027
// 100.0%.
10281028
"package:front_end/src/source/type_parameter_scope_builder.dart": (
1029-
hitCount: 1532,
1029+
hitCount: 1536,
10301030
missCount: 0,
10311031
),
10321032
// 100.0%.

pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.strong.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,25 @@ abstract class Link<T extends core::Object? = dynamic> extends core::Object {
5454
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:7:28: Error: Expected 0 type arguments.
5555
factory Link.create2() = LinkFactory<T, T>.create;
5656
^";
57-
static factory create3<T extends core::Object? = dynamic>(core::int i = #C1) → self::Link<self::Link::create3::T%>
57+
static factory create3<T extends core::Object? = dynamic>(core::int i) → self::Link<self::Link::create3::T%>
5858
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:8:33: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function(int)'.
5959
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6060
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6161
factory Link.create3(int i) = LinkFactory.create;
6262
^";
63-
static synthetic method _#create3#tearOff<T extends core::Object? = dynamic>(core::int i = #C1) → self::Link<self::Link::_#create3#tearOff::T%>
63+
static synthetic method _#create3#tearOff<T extends core::Object? = dynamic>(core::int i) → self::Link<self::Link::_#create3#tearOff::T%>
6464
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:8:33: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function(int)'.
6565
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6666
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6767
factory Link.create3(int i) = LinkFactory.create;
6868
^";
69-
static factory create4<T extends core::Object? = dynamic>({core::int i = #C1}) → self::Link<self::Link::create4::T%>
69+
static factory create4<T extends core::Object? = dynamic>({erroneously-initialized core::int i = #C1}) → self::Link<self::Link::create4::T%>
7070
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
7171
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7272
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7373
factory Link.create4({int i}) = LinkFactory.create;
7474
^";
75-
static synthetic method _#create4#tearOff<T extends core::Object? = dynamic>({core::int i = #C1}) → self::Link<self::Link::_#create4#tearOff::T%>
75+
static synthetic method _#create4#tearOff<T extends core::Object? = dynamic>({erroneously-initialized core::int i = #C1}) → self::Link<self::Link::_#create4#tearOff::T%>
7676
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
7777
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7878
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.

pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.strong.modular.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,25 @@ abstract class Link<T extends core::Object? = dynamic> extends core::Object {
5454
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:7:28: Error: Expected 0 type arguments.
5555
factory Link.create2() = LinkFactory<T, T>.create;
5656
^";
57-
static factory create3<T extends core::Object? = dynamic>(core::int i = #C1) → self::Link<self::Link::create3::T%>
57+
static factory create3<T extends core::Object? = dynamic>(core::int i) → self::Link<self::Link::create3::T%>
5858
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:8:33: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function(int)'.
5959
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6060
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6161
factory Link.create3(int i) = LinkFactory.create;
6262
^";
63-
static synthetic method _#create3#tearOff<T extends core::Object? = dynamic>(core::int i = #C1) → self::Link<self::Link::_#create3#tearOff::T%>
63+
static synthetic method _#create3#tearOff<T extends core::Object? = dynamic>(core::int i) → self::Link<self::Link::_#create3#tearOff::T%>
6464
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:8:33: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function(int)'.
6565
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6666
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6767
factory Link.create3(int i) = LinkFactory.create;
6868
^";
69-
static factory create4<T extends core::Object? = dynamic>({core::int i = #C1}) → self::Link<self::Link::create4::T%>
69+
static factory create4<T extends core::Object? = dynamic>({erroneously-initialized core::int i = #C1}) → self::Link<self::Link::create4::T%>
7070
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
7171
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7272
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7373
factory Link.create4({int i}) = LinkFactory.create;
7474
^";
75-
static synthetic method _#create4#tearOff<T extends core::Object? = dynamic>({core::int i = #C1}) → self::Link<self::Link::_#create4#tearOff::T%>
75+
static synthetic method _#create4#tearOff<T extends core::Object? = dynamic>({erroneously-initialized core::int i = #C1}) → self::Link<self::Link::_#create4#tearOff::T%>
7676
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
7777
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7878
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.

pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.strong.outline.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ abstract class Link<T extends core::Object? = dynamic> extends core::Object {
6161
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6262
factory Link.create3(int i) = LinkFactory.create;
6363
^";
64-
static factory create4<T extends core::Object? = dynamic>({core::int i = null}) → self::Link<self::Link::create4::T%>
64+
static factory create4<T extends core::Object? = dynamic>({erroneously-initialized core::int i = null}) → self::Link<self::Link::create4::T%>
6565
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
6666
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6767
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.

pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart.strong.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,25 @@ abstract class Link<T extends core::Object? = dynamic> extends core::Object {
5454
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:7:28: Error: Expected 0 type arguments.
5555
factory Link.create2() = LinkFactory<T, T>.create;
5656
^";
57-
static factory create3<T extends core::Object? = dynamic>(core::int i = #C1) → self::Link<self::Link::create3::T%>
57+
static factory create3<T extends core::Object? = dynamic>(core::int i) → self::Link<self::Link::create3::T%>
5858
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:8:33: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function(int)'.
5959
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6060
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6161
factory Link.create3(int i) = LinkFactory.create;
6262
^";
63-
static synthetic method _#create3#tearOff<T extends core::Object? = dynamic>(core::int i = #C1) → self::Link<self::Link::_#create3#tearOff::T%>
63+
static synthetic method _#create3#tearOff<T extends core::Object? = dynamic>(core::int i) → self::Link<self::Link::_#create3#tearOff::T%>
6464
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:8:33: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function(int)'.
6565
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6666
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
6767
factory Link.create3(int i) = LinkFactory.create;
6868
^";
69-
static factory create4<T extends core::Object? = dynamic>({core::int i = #C1}) → self::Link<self::Link::create4::T%>
69+
static factory create4<T extends core::Object? = dynamic>({erroneously-initialized core::int i = #C1}) → self::Link<self::Link::create4::T%>
7070
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
7171
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7272
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7373
factory Link.create4({int i}) = LinkFactory.create;
7474
^";
75-
static synthetic method _#create4#tearOff<T extends core::Object? = dynamic>({core::int i = #C1}) → self::Link<self::Link::_#create4#tearOff::T%>
75+
static synthetic method _#create4#tearOff<T extends core::Object? = dynamic>({erroneously-initialized core::int i = #C1}) → self::Link<self::Link::_#create4#tearOff::T%>
7676
return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart:9:35: Error: The constructor function type 'LinkFactory Function()' isn't a subtype of 'Link<T> Function({int i})'.
7777
- 'LinkFactory' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.
7878
- 'Link' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/invalid_redirect.dart'.

pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ class Class<T extends core::Object? = dynamic> extends core::Object implements s
6060
return new self::Class::•<self::Class::fact::T%>(field);
6161
static synthetic method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
6262
return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
63-
static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::redirectingFactory::T%> /* redirection-target: self::Class::•<self::Class::redirectingFactory::T%>*/
63+
static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%> /* redirection-target: self::Class::•<self::Class::redirectingFactory::T%>*/
6464
return new self::Class::•<self::Class::redirectingFactory::T%>(field);
65-
static synthetic method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
65+
static synthetic method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
6666
return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
6767
}
6868
abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/ {

pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.modular.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ class Class<T extends core::Object? = dynamic> extends core::Object implements s
6060
return new self::Class::•<self::Class::fact::T%>(field);
6161
static synthetic method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
6262
return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
63-
static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::redirectingFactory::T%> /* redirection-target: self::Class::•<self::Class::redirectingFactory::T%>*/
63+
static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%> /* redirection-target: self::Class::•<self::Class::redirectingFactory::T%>*/
6464
return new self::Class::•<self::Class::redirectingFactory::T%>(field);
65-
static synthetic method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
65+
static synthetic method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
6666
return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
6767
}
6868
abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/ {

0 commit comments

Comments
 (0)