Skip to content

Commit 1117dce

Browse files
chloestefantsovaCommit Queue
authored andcommitted
[model] Mark erroneously initialized optional parameters as such
This adds the flag isErroneouslyInitialized to the VariableDeclaration AST node in Kernel. The flag is set to true whenever it is concluded during compilation that the initializer contains errors is erroneous for the parameter in any other way, for exaple, due to a type mismatch. Change-Id: I1b3c9c662974fb9537ab4f89b58dd004979feebe Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431862 Commit-Queue: Chloe Stefantsova <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent c21beef commit 1117dce

File tree

74 files changed

+1307
-207
lines changed

Some content is hidden

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

74 files changed

+1307
-207
lines changed

pkg/front_end/lib/src/builder/formal_parameter_builder.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart'
66
show FormalParameterKind;
77
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
88
import 'package:kernel/ast.dart'
9-
show DartType, DynamicType, Expression, NullLiteral, VariableDeclaration;
9+
show
10+
DartType,
11+
DynamicType,
12+
Expression,
13+
InvalidExpression,
14+
NullLiteral,
15+
VariableDeclaration;
1016
import 'package:kernel/class_hierarchy.dart';
1117

1218
import '../base/constant_context.dart' show ConstantContext;
@@ -282,6 +288,9 @@ class FormalParameterBuilder extends NamedBuilderImpl
282288
initializer = bodyBuilder.typeInferrer.inferParameterInitializer(
283289
bodyBuilder, initializer, variable!.type, hasDeclaredInitializer);
284290
variable!.initializer = initializer..parent = variable;
291+
if (initializer is InvalidExpression) {
292+
variable!.isErroneouslyInitialized = true;
293+
}
285294
initializerWasInferred = true;
286295
bodyBuilder.performBacklogComputations();
287296
} else if (kind.isOptional) {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,9 @@ class BodyBuilder extends StackListenerImpl
12421242
originParameter.type,
12431243
parameter.hasDeclaredInitializer);
12441244
originParameter.initializer = initializer..parent = originParameter;
1245+
if (initializer is InvalidExpression) {
1246+
originParameter.isErroneouslyInitialized = true;
1247+
}
12451248
parameter.initializerWasInferred = true;
12461249
}
12471250
VariableDeclaration? tearOffParameter =

pkg/front_end/lib/src/source/source_library_builder.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,6 +1424,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
14241424
formal.fileOffset,
14251425
formal.name.length,
14261426
formal.fileUri);
1427+
formal.variable?.isErroneouslyInitialized = true;
14271428
}
14281429
}
14291430
}

pkg/front_end/testcases/extension_types/issue56402.dart.strong.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ static extension-type-member method E|constructor#(core::int x) → self::E% /*
4040
}
4141
static extension-type-member synthetic method E|constructor#_#new#tearOff(core::int x) → self::E% /* erasure=core::int, declared=! */
4242
return self::E|constructor#(x);
43-
static extension-type-member method E|constructor#testPositional([core::int x = #C1, core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */ {
43+
static extension-type-member method E|constructor#testPositional([erroneously-initialized core::int x = #C1, erroneously-initialized core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */ {
4444
lowered final self::E% /* erasure=core::int, declared=! */ #this = x;
4545
return #this;
4646
}
4747
static extension-type-member synthetic method E|constructor#_#testPositional#tearOff([core::int x = #C1, core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */
4848
return self::E|constructor#testPositional(x, y);
49-
static extension-type-member method E|constructor#testNamed({core::int x = #C1, core::String y = #C1}) → self::E% /* erasure=core::int, declared=! */ {
49+
static extension-type-member method E|constructor#testNamed({erroneously-initialized core::int x = #C1, erroneously-initialized core::String y = #C1}) → self::E% /* erasure=core::int, declared=! */ {
5050
lowered final self::E% /* erasure=core::int, declared=! */ #this = x;
5151
return #this;
5252
}

pkg/front_end/testcases/extension_types/issue56402.dart.strong.modular.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ static extension-type-member method E|constructor#(core::int x) → self::E% /*
4040
}
4141
static extension-type-member synthetic method E|constructor#_#new#tearOff(core::int x) → self::E% /* erasure=core::int, declared=! */
4242
return self::E|constructor#(x);
43-
static extension-type-member method E|constructor#testPositional([core::int x = #C1, core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */ {
43+
static extension-type-member method E|constructor#testPositional([erroneously-initialized core::int x = #C1, erroneously-initialized core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */ {
4444
lowered final self::E% /* erasure=core::int, declared=! */ #this = x;
4545
return #this;
4646
}
4747
static extension-type-member synthetic method E|constructor#_#testPositional#tearOff([core::int x = #C1, core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */
4848
return self::E|constructor#testPositional(x, y);
49-
static extension-type-member method E|constructor#testNamed({core::int x = #C1, core::String y = #C1}) → self::E% /* erasure=core::int, declared=! */ {
49+
static extension-type-member method E|constructor#testNamed({erroneously-initialized core::int x = #C1, erroneously-initialized core::String y = #C1}) → self::E% /* erasure=core::int, declared=! */ {
5050
lowered final self::E% /* erasure=core::int, declared=! */ #this = x;
5151
return #this;
5252
}

pkg/front_end/testcases/extension_types/issue56402.dart.strong.outline.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ static extension-type-member method E|constructor#(core::int x) → self::E% /*
3838
;
3939
static extension-type-member synthetic method E|constructor#_#new#tearOff(core::int x) → self::E% /* erasure=core::int, declared=! */
4040
return self::E|constructor#(x);
41-
static extension-type-member method E|constructor#testPositional([core::int x = null, core::int y = null]) → self::E% /* erasure=core::int, declared=! */
41+
static extension-type-member method E|constructor#testPositional([erroneously-initialized core::int x = null, erroneously-initialized core::int y = null]) → self::E% /* erasure=core::int, declared=! */
4242
;
4343
static extension-type-member synthetic method E|constructor#_#testPositional#tearOff([core::int x, core::int y]) → self::E% /* erasure=core::int, declared=! */
4444
return self::E|constructor#testPositional(x, y);
45-
static extension-type-member method E|constructor#testNamed({core::int x = null, core::String y = null}) → self::E% /* erasure=core::int, declared=! */
45+
static extension-type-member method E|constructor#testNamed({erroneously-initialized core::int x = null, erroneously-initialized core::String y = null}) → self::E% /* erasure=core::int, declared=! */
4646
;
4747
static extension-type-member synthetic method E|constructor#_#testNamed#tearOff({core::int x, core::String y}) → self::E% /* erasure=core::int, declared=! */
4848
return self::E|constructor#testNamed(x: x, y: y);

pkg/front_end/testcases/extension_types/issue56402.dart.strong.transformed.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ static extension-type-member method E|constructor#(core::int x) → self::E% /*
4040
}
4141
static extension-type-member synthetic method E|constructor#_#new#tearOff(core::int x) → self::E% /* erasure=core::int, declared=! */
4242
return self::E|constructor#(x);
43-
static extension-type-member method E|constructor#testPositional([core::int x = #C1, core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */ {
43+
static extension-type-member method E|constructor#testPositional([erroneously-initialized core::int x = #C1, erroneously-initialized core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */ {
4444
lowered final self::E% /* erasure=core::int, declared=! */ #this = x;
4545
return #this;
4646
}
4747
static extension-type-member synthetic method E|constructor#_#testPositional#tearOff([core::int x = #C1, core::int y = #C1]) → self::E% /* erasure=core::int, declared=! */
4848
return self::E|constructor#testPositional(x, y);
49-
static extension-type-member method E|constructor#testNamed({core::int x = #C1, core::String y = #C1}) → self::E% /* erasure=core::int, declared=! */ {
49+
static extension-type-member method E|constructor#testNamed({erroneously-initialized core::int x = #C1, erroneously-initialized core::String y = #C1}) → self::E% /* erasure=core::int, declared=! */ {
5050
lowered final self::E% /* erasure=core::int, declared=! */ #this = x;
5151
return #this;
5252
}

pkg/front_end/testcases/extension_types/nullability.dart.strong.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ static method testNotNullable(self::E1<core::num?>% /* erasure=core::num?, decla
267267
e4NNNullable = null;
268268
e5NNNullable = null;
269269
}
270-
static method testOptionalPositional([self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableOP = #C1, self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleOP = #C1, self::E2% /* erasure=core::Object?, declared=! */ e2OP = #C1, self::E3% /* erasure=core::String?, declared=! */ e3OP = #C1, self::E4% /* erasure=core::int, declared=! */ e4OP = #C1, self::E5% /* erasure=core::Object?, declared=! */ e5OP = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableOPNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleOPNullable = #C1, self::E2? /* erasure=core::Object? */ e2OPNullable = #C1, self::E3? /* erasure=core::String? */ e3OPNullable = #C1, self::E4? /* erasure=core::int? */ e4OPNullable = #C1, self::E5? /* erasure=core::Object? */ e5OPNullable = #C1]) → dynamic {}
271-
static method testNamedNotRequired({self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableNNR = #C1, self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleNNR = #C1, self::E2% /* erasure=core::Object?, declared=! */ e2NNR = #C1, self::E3% /* erasure=core::String?, declared=! */ e3NNR = #C1, self::E4% /* erasure=core::int, declared=! */ e4NNR = #C1, self::E5% /* erasure=core::Object?, declared=! */ e5NNR = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableNNRNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleNNRNullable = #C1, self::E2? /* erasure=core::Object? */ e2NNRNullable = #C1, self::E3? /* erasure=core::String? */ e3NNRNullable = #C1, self::E4? /* erasure=core::int? */ e4NNRNullable = #C1, self::E5? /* erasure=core::Object? */ e5NNRNullable = #C1}) → dynamic {}
270+
static method testOptionalPositional([erroneously-initialized self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableOP = #C1, erroneously-initialized self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleOP = #C1, erroneously-initialized self::E2% /* erasure=core::Object?, declared=! */ e2OP = #C1, erroneously-initialized self::E3% /* erasure=core::String?, declared=! */ e3OP = #C1, erroneously-initialized self::E4% /* erasure=core::int, declared=! */ e4OP = #C1, erroneously-initialized self::E5% /* erasure=core::Object?, declared=! */ e5OP = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableOPNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleOPNullable = #C1, self::E2? /* erasure=core::Object? */ e2OPNullable = #C1, self::E3? /* erasure=core::String? */ e3OPNullable = #C1, self::E4? /* erasure=core::int? */ e4OPNullable = #C1, self::E5? /* erasure=core::Object? */ e5OPNullable = #C1]) → dynamic {}
271+
static method testNamedNotRequired({erroneously-initialized self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableNNR = #C1, erroneously-initialized self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleNNR = #C1, erroneously-initialized self::E2% /* erasure=core::Object?, declared=! */ e2NNR = #C1, erroneously-initialized self::E3% /* erasure=core::String?, declared=! */ e3NNR = #C1, erroneously-initialized self::E4% /* erasure=core::int, declared=! */ e4NNR = #C1, erroneously-initialized self::E5% /* erasure=core::Object?, declared=! */ e5NNR = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableNNRNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleNNRNullable = #C1, self::E2? /* erasure=core::Object? */ e2NNRNullable = #C1, self::E3? /* erasure=core::String? */ e3NNRNullable = #C1, self::E4? /* erasure=core::int? */ e4NNRNullable = #C1, self::E5? /* erasure=core::Object? */ e5NNRNullable = #C1}) → dynamic {}
272272

273273
constants {
274274
#C1 = null

pkg/front_end/testcases/extension_types/nullability.dart.strong.modular.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ static method testNotNullable(self::E1<core::num?>% /* erasure=core::num?, decla
267267
e4NNNullable = null;
268268
e5NNNullable = null;
269269
}
270-
static method testOptionalPositional([self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableOP = #C1, self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleOP = #C1, self::E2% /* erasure=core::Object?, declared=! */ e2OP = #C1, self::E3% /* erasure=core::String?, declared=! */ e3OP = #C1, self::E4% /* erasure=core::int, declared=! */ e4OP = #C1, self::E5% /* erasure=core::Object?, declared=! */ e5OP = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableOPNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleOPNullable = #C1, self::E2? /* erasure=core::Object? */ e2OPNullable = #C1, self::E3? /* erasure=core::String? */ e3OPNullable = #C1, self::E4? /* erasure=core::int? */ e4OPNullable = #C1, self::E5? /* erasure=core::Object? */ e5OPNullable = #C1]) → dynamic {}
271-
static method testNamedNotRequired({self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableNNR = #C1, self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleNNR = #C1, self::E2% /* erasure=core::Object?, declared=! */ e2NNR = #C1, self::E3% /* erasure=core::String?, declared=! */ e3NNR = #C1, self::E4% /* erasure=core::int, declared=! */ e4NNR = #C1, self::E5% /* erasure=core::Object?, declared=! */ e5NNR = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableNNRNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleNNRNullable = #C1, self::E2? /* erasure=core::Object? */ e2NNRNullable = #C1, self::E3? /* erasure=core::String? */ e3NNRNullable = #C1, self::E4? /* erasure=core::int? */ e4NNRNullable = #C1, self::E5? /* erasure=core::Object? */ e5NNRNullable = #C1}) → dynamic {}
270+
static method testOptionalPositional([erroneously-initialized self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableOP = #C1, erroneously-initialized self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleOP = #C1, erroneously-initialized self::E2% /* erasure=core::Object?, declared=! */ e2OP = #C1, erroneously-initialized self::E3% /* erasure=core::String?, declared=! */ e3OP = #C1, erroneously-initialized self::E4% /* erasure=core::int, declared=! */ e4OP = #C1, erroneously-initialized self::E5% /* erasure=core::Object?, declared=! */ e5OP = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableOPNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleOPNullable = #C1, self::E2? /* erasure=core::Object? */ e2OPNullable = #C1, self::E3? /* erasure=core::String? */ e3OPNullable = #C1, self::E4? /* erasure=core::int? */ e4OPNullable = #C1, self::E5? /* erasure=core::Object? */ e5OPNullable = #C1]) → dynamic {}
271+
static method testNamedNotRequired({erroneously-initialized self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableNNR = #C1, erroneously-initialized self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleNNR = #C1, erroneously-initialized self::E2% /* erasure=core::Object?, declared=! */ e2NNR = #C1, erroneously-initialized self::E3% /* erasure=core::String?, declared=! */ e3NNR = #C1, erroneously-initialized self::E4% /* erasure=core::int, declared=! */ e4NNR = #C1, erroneously-initialized self::E5% /* erasure=core::Object?, declared=! */ e5NNR = #C1, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableNNRNullable = #C1, self::E1<core::double>? /* erasure=core::double? */ e1doubleNNRNullable = #C1, self::E2? /* erasure=core::Object? */ e2NNRNullable = #C1, self::E3? /* erasure=core::String? */ e3NNRNullable = #C1, self::E4? /* erasure=core::int? */ e4NNRNullable = #C1, self::E5? /* erasure=core::Object? */ e5NNRNullable = #C1}) → dynamic {}
272272

273273
constants {
274274
#C1 = null

pkg/front_end/testcases/extension_types/nullability.dart.strong.outline.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ static method testNotNonNullable(self::E1<core::num?>% /* erasure=core::num?, de
130130
;
131131
static method testNotNullable(self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableNN, self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleNN, self::E2% /* erasure=core::Object?, declared=! */ e2NN, self::E3% /* erasure=core::String?, declared=! */ e3NN, self::E4% /* erasure=core::int, declared=! */ e4NN, self::E5% /* erasure=core::Object?, declared=! */ e5NN, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableNNNullable, self::E1<core::double>? /* erasure=core::double? */ e1doubleNNNullable, self::E2? /* erasure=core::Object? */ e2NNNullable, self::E3? /* erasure=core::String? */ e3NNNullable, self::E4? /* erasure=core::int? */ e4NNNullable, self::E5? /* erasure=core::Object? */ e5NNNullable) → dynamic
132132
;
133-
static method testOptionalPositional([self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableOP, self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleOP, self::E2% /* erasure=core::Object?, declared=! */ e2OP, self::E3% /* erasure=core::String?, declared=! */ e3OP, self::E4% /* erasure=core::int, declared=! */ e4OP, self::E5% /* erasure=core::Object?, declared=! */ e5OP, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableOPNullable, self::E1<core::double>? /* erasure=core::double? */ e1doubleOPNullable, self::E2? /* erasure=core::Object? */ e2OPNullable, self::E3? /* erasure=core::String? */ e3OPNullable, self::E4? /* erasure=core::int? */ e4OPNullable, self::E5? /* erasure=core::Object? */ e5OPNullable]) → dynamic
133+
static method testOptionalPositional([erroneously-initialized self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableOP, erroneously-initialized self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleOP, erroneously-initialized self::E2% /* erasure=core::Object?, declared=! */ e2OP, erroneously-initialized self::E3% /* erasure=core::String?, declared=! */ e3OP, erroneously-initialized self::E4% /* erasure=core::int, declared=! */ e4OP, erroneously-initialized self::E5% /* erasure=core::Object?, declared=! */ e5OP, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableOPNullable, self::E1<core::double>? /* erasure=core::double? */ e1doubleOPNullable, self::E2? /* erasure=core::Object? */ e2OPNullable, self::E3? /* erasure=core::String? */ e3OPNullable, self::E4? /* erasure=core::int? */ e4OPNullable, self::E5? /* erasure=core::Object? */ e5OPNullable]) → dynamic
134134
;
135-
static method testNamedNotRequired({self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableNNR, self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleNNR, self::E2% /* erasure=core::Object?, declared=! */ e2NNR, self::E3% /* erasure=core::String?, declared=! */ e3NNR, self::E4% /* erasure=core::int, declared=! */ e4NNR, self::E5% /* erasure=core::Object?, declared=! */ e5NNR, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableNNRNullable, self::E1<core::double>? /* erasure=core::double? */ e1doubleNNRNullable, self::E2? /* erasure=core::Object? */ e2NNRNullable, self::E3? /* erasure=core::String? */ e3NNRNullable, self::E4? /* erasure=core::int? */ e4NNRNullable, self::E5? /* erasure=core::Object? */ e5NNRNullable}) → dynamic
135+
static method testNamedNotRequired({erroneously-initialized self::E1<core::num?>% /* erasure=core::num?, declared=! */ e1numNullableNNR, erroneously-initialized self::E1<core::double>% /* erasure=core::double, declared=! */ e1doubleNNR, erroneously-initialized self::E2% /* erasure=core::Object?, declared=! */ e2NNR, erroneously-initialized self::E3% /* erasure=core::String?, declared=! */ e3NNR, erroneously-initialized self::E4% /* erasure=core::int, declared=! */ e4NNR, erroneously-initialized self::E5% /* erasure=core::Object?, declared=! */ e5NNR, self::E1<core::num?>? /* erasure=core::num? */ e1numNullableNNRNullable, self::E1<core::double>? /* erasure=core::double? */ e1doubleNNRNullable, self::E2? /* erasure=core::Object? */ e2NNRNullable, self::E3? /* erasure=core::String? */ e3NNRNullable, self::E4? /* erasure=core::int? */ e4NNRNullable, self::E5? /* erasure=core::Object? */ e5NNRNullable}) → dynamic
136136
;

0 commit comments

Comments
 (0)