Skip to content

Commit 843583f

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[cfe] Add some of the compile-time errors for super parameters
Part of #47525 Change-Id: Ic0ad44656f6b5f6fa56f8c130e3e44b8729a9659 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/223160 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 29f58b0 commit 843583f

18 files changed

+781
-132
lines changed

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

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,52 +1049,75 @@ class BodyBuilder extends ScopeListener<JumpTarget>
10491049
];
10501050
}
10511051

1052-
if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
1053-
List<VariableDeclaration>? positionalSuperParameters;
1054-
List<VariableDeclaration>? namedSuperParameters;
1055-
1056-
List<FormalParameterBuilder>? formals =
1057-
(member as ConstructorBuilder).formals;
1058-
if (formals != null) {
1059-
for (FormalParameterBuilder formal in formals) {
1060-
if (formal.isSuperInitializingFormal) {
1061-
if (formal.isNamed) {
1062-
(namedSuperParameters ??= <VariableDeclaration>[])
1063-
.add(formal.variable!);
1064-
} else {
1065-
(positionalSuperParameters ??= <VariableDeclaration>[])
1066-
.add(formal.variable!);
1067-
}
1068-
}
1069-
}
1070-
1052+
if (libraryBuilder.enableSuperParametersInLibrary) {
1053+
if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
10711054
SuperInitializer superInitializer =
10721055
initializers.last as SuperInitializer;
10731056
Arguments arguments = superInitializer.arguments;
1074-
if (positionalSuperParameters != null) {
1075-
if (arguments.positional.isNotEmpty) {
1076-
addProblem(fasta.messagePositionalSuperParametersAndArguments,
1077-
arguments.fileOffset, noLength,
1078-
context: <LocatedMessage>[
1079-
fasta.messageSuperInitializerParameter.withLocation(
1080-
uri, positionalSuperParameters.first.fileOffset, noLength)
1081-
]);
1082-
} else {
1083-
for (VariableDeclaration positional in positionalSuperParameters) {
1084-
arguments.positional.add(
1085-
new VariableGetImpl(positional, forNullGuardedAccess: false)
1086-
..fileOffset = positional.fileOffset);
1057+
1058+
List<VariableDeclaration>? positionalSuperParameters;
1059+
List<VariableDeclaration>? namedSuperParameters;
1060+
1061+
List<FormalParameterBuilder>? formals =
1062+
(member as ConstructorBuilder).formals;
1063+
if (formals != null) {
1064+
for (FormalParameterBuilder formal in formals) {
1065+
if (formal.isSuperInitializingFormal) {
1066+
if (formal.isNamed) {
1067+
(namedSuperParameters ??= <VariableDeclaration>[])
1068+
.add(formal.variable!);
1069+
} else {
1070+
(positionalSuperParameters ??= <VariableDeclaration>[])
1071+
.add(formal.variable!);
1072+
}
10871073
}
10881074
}
1089-
}
1090-
if (namedSuperParameters != null) {
1091-
// TODO(cstefantsova): Report name conflicts.
1092-
for (VariableDeclaration named in namedSuperParameters) {
1093-
arguments.named.add(new NamedExpression(named.name!,
1094-
new VariableGetImpl(named, forNullGuardedAccess: false))
1095-
..fileOffset = named.fileOffset);
1075+
1076+
if (positionalSuperParameters != null) {
1077+
if (arguments.positional.isNotEmpty) {
1078+
addProblem(fasta.messagePositionalSuperParametersAndArguments,
1079+
arguments.fileOffset, noLength,
1080+
context: <LocatedMessage>[
1081+
fasta.messageSuperInitializerParameter.withLocation(uri,
1082+
positionalSuperParameters.first.fileOffset, noLength)
1083+
]);
1084+
} else {
1085+
for (VariableDeclaration positional
1086+
in positionalSuperParameters) {
1087+
arguments.positional.add(
1088+
new VariableGetImpl(positional, forNullGuardedAccess: false)
1089+
..fileOffset = positional.fileOffset);
1090+
}
1091+
}
1092+
}
1093+
if (namedSuperParameters != null) {
1094+
// TODO(cstefantsova): Report name conflicts.
1095+
for (VariableDeclaration named in namedSuperParameters) {
1096+
arguments.named.add(new NamedExpression(
1097+
named.name!,
1098+
new VariableGetImpl(named, forNullGuardedAccess: false)
1099+
..fileOffset = named.fileOffset)
1100+
..fileOffset = named.fileOffset);
1101+
}
10961102
}
10971103
}
1104+
1105+
LocatedMessage? message = checkArgumentsForFunction(
1106+
superInitializer.target.function,
1107+
arguments,
1108+
arguments.fileOffset, <TypeParameter>[]);
1109+
if (message != null) {
1110+
initializers[initializers.length - 1] = buildInvalidInitializer(
1111+
buildUnresolvedError(
1112+
forest.createNullLiteral(superInitializer.fileOffset),
1113+
constructorNameForDiagnostics(
1114+
superInitializer.target.name.text),
1115+
arguments,
1116+
superInitializer.fileOffset,
1117+
isSuper: true,
1118+
message: message,
1119+
kind: UnresolvedKind.Constructor));
1120+
}
10981121
}
10991122
}
11001123

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
class A1 {
6+
final int foo;
7+
A1({required this.foo});
8+
}
9+
10+
class B1 extends A1 {
11+
B1({required super.foo}) : super(); // Ok.
12+
}
13+
14+
class C1 extends A1 {
15+
C1({required super.foo}) : super(foo: foo); // Error.
16+
}
17+
18+
class A2 {
19+
final int foo;
20+
final String bar;
21+
A2({required this.foo, required this.bar});
22+
}
23+
24+
class B2 extends A2 {
25+
B2() : super(foo: 42, bar: "bar", baz: false); // Error.
26+
}
27+
28+
class C2 extends A2 {
29+
C2({required super.foo}) : super(); // Error.
30+
C2.other({required super.foo}) : super(bar: 'bar'); // Ok.
31+
}
32+
33+
main() {}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
6+
// C1({required super.foo}) : super(foo: foo); // Error.
7+
// ^^^
8+
//
9+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
10+
// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
11+
// ^^^
12+
//
13+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
14+
// C2({required super.foo}) : super(); // Error.
15+
// ^
16+
//
17+
import self as self;
18+
import "dart:core" as core;
19+
20+
class A1 extends core::Object {
21+
final field core::int foo;
22+
constructor •({required core::int foo = #C1}) → self::A1
23+
: self::A1::foo = foo, super core::Object::•()
24+
;
25+
}
26+
class B1 extends self::A1 {
27+
constructor •({required dynamic foo = #C1}) → self::B1
28+
: super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
29+
;
30+
}
31+
class C1 extends self::A1 {
32+
constructor •({required dynamic foo = #C1}) → self::C1
33+
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
34+
C1({required super.foo}) : super(foo: foo); // Error.
35+
^^^" in block {
36+
foo;
37+
} =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
38+
;
39+
}
40+
class A2 extends core::Object {
41+
final field core::int foo;
42+
final field core::String bar;
43+
constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
44+
: self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
45+
;
46+
}
47+
class B2 extends self::A2 {
48+
constructor •() → self::B2
49+
: final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
50+
B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
51+
^^^"
52+
;
53+
}
54+
class C2 extends self::A2 {
55+
constructor •({required dynamic foo = #C1}) → self::C2
56+
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
57+
C2({required super.foo}) : super(); // Error.
58+
^"
59+
;
60+
constructor other({required dynamic foo = #C1}) → self::C2
61+
: super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
62+
;
63+
}
64+
static method main() → dynamic {}
65+
66+
constants {
67+
#C1 = null
68+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
6+
// C1({required super.foo}) : super(foo: foo); // Error.
7+
// ^^^
8+
//
9+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
10+
// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
11+
// ^^^
12+
//
13+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
14+
// C2({required super.foo}) : super(); // Error.
15+
// ^
16+
//
17+
import self as self;
18+
import "dart:core" as core;
19+
20+
class A1 extends core::Object {
21+
final field core::int foo;
22+
constructor •({required core::int foo = #C1}) → self::A1
23+
: self::A1::foo = foo, super core::Object::•()
24+
;
25+
}
26+
class B1 extends self::A1 {
27+
constructor •({required dynamic foo = #C1}) → self::B1
28+
: super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
29+
;
30+
}
31+
class C1 extends self::A1 {
32+
constructor •({required dynamic foo = #C1}) → self::C1
33+
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
34+
C1({required super.foo}) : super(foo: foo); // Error.
35+
^^^" in block {
36+
foo;
37+
} =>foo)
38+
;
39+
}
40+
class A2 extends core::Object {
41+
final field core::int foo;
42+
final field core::String bar;
43+
constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
44+
: self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
45+
;
46+
}
47+
class B2 extends self::A2 {
48+
constructor •() → self::B2
49+
: final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
50+
B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
51+
^^^"
52+
;
53+
}
54+
class C2 extends self::A2 {
55+
constructor •({required dynamic foo = #C1}) → self::C2
56+
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
57+
C2({required super.foo}) : super(); // Error.
58+
^"
59+
;
60+
constructor other({required dynamic foo = #C1}) → self::C2
61+
: super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
62+
;
63+
}
64+
static method main() → dynamic {}
65+
66+
constants {
67+
#C1 = null
68+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class A1 {
2+
final int foo;
3+
A1({required this.foo});
4+
}
5+
class B1 extends A1 {
6+
B1({required super.foo}) : super();
7+
}
8+
class C1 extends A1 {
9+
C1({required super.foo}) : super(foo: foo);
10+
}
11+
class A2 {
12+
final int foo;
13+
final String bar;
14+
A2({required this.foo, required this.bar});
15+
}
16+
class B2 extends A2 {
17+
B2() : super(foo: 42, bar: "bar", baz: false);
18+
}
19+
class C2 extends A2 {
20+
C2({required super.foo}) : super();
21+
C2.other({required super.foo}) : super(bar: 'bar');
22+
}
23+
main() {}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
6+
// C1({required super.foo}) : super(foo: foo); // Error.
7+
// ^^^
8+
//
9+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
10+
// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
11+
// ^^^
12+
//
13+
// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
14+
// C2({required super.foo}) : super(); // Error.
15+
// ^
16+
//
17+
import self as self;
18+
import "dart:core" as core;
19+
20+
class A1 extends core::Object {
21+
final field core::int foo;
22+
constructor •({required core::int foo = #C1}) → self::A1
23+
: self::A1::foo = foo, super core::Object::•()
24+
;
25+
}
26+
class B1 extends self::A1 {
27+
constructor •({required dynamic foo = #C1}) → self::B1
28+
: super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
29+
;
30+
}
31+
class C1 extends self::A1 {
32+
constructor •({required dynamic foo = #C1}) → self::C1
33+
: super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
34+
C1({required super.foo}) : super(foo: foo); // Error.
35+
^^^" in block {
36+
foo;
37+
} =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
38+
;
39+
}
40+
class A2 extends core::Object {
41+
final field core::int foo;
42+
final field core::String bar;
43+
constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
44+
: self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
45+
;
46+
}
47+
class B2 extends self::A2 {
48+
constructor •() → self::B2
49+
: final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
50+
B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
51+
^^^"
52+
;
53+
}
54+
class C2 extends self::A2 {
55+
constructor •({required dynamic foo = #C1}) → self::C2
56+
: final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
57+
C2({required super.foo}) : super(); // Error.
58+
^"
59+
;
60+
constructor other({required dynamic foo = #C1}) → self::C2
61+
: super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
62+
;
63+
}
64+
static method main() → dynamic {}
65+
66+
constants {
67+
#C1 = null
68+
}

0 commit comments

Comments
 (0)