From b3acc75fcffc332b87f8f688b96e7c799a5fb57c Mon Sep 17 00:00:00 2001 From: sgrekhov Date: Wed, 22 Oct 2025 18:20:29 +0300 Subject: [PATCH 1/6] #3329. Add tests for "corresponding public name" --- .../static_semantics_A01_t01.dart | 59 ++++++++++++++ .../static_semantics_A01_t02.dart | 59 ++++++++++++++ .../static_semantics_A01_t03.dart | 78 +++++++++++++++++++ .../static_semantics_A02_t01.dart | 65 ++++++++++++++++ .../static_semantics_A02_t02.dart | 69 ++++++++++++++++ 5 files changed, 330 insertions(+) create mode 100644 LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart create mode 100644 LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart create mode 100644 LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart create mode 100644 LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart create mode 100644 LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart new file mode 100644 index 0000000000..4b2741d277 --- /dev/null +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart @@ -0,0 +1,59 @@ +// Copyright (c) 2025, 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. + +/// @assertion Given a named initializing formal or field parameter (for a +/// primary constructor) with private name `p` in constructor `C`: +/// - If `p` has no corresponding public name `n`, then compile-time error. +/// +/// @description Check that it is a compile-time error if a named initializing +/// formal parameter with private name has no corresponding public name. +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=private-named-parameters + +class C { + String __p; + C({this._p = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + C._({required this._p}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +extension type ET._(String __p) { + ET({this._p = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + ET.named({required this._p}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +enum E { + e0; + + final String __p; + const E({this._p = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + const E.named({required this._p}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +main() { + print(C); + print(ET); + print(E); +} diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart new file mode 100644 index 0000000000..62952a33f3 --- /dev/null +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart @@ -0,0 +1,59 @@ +// Copyright (c) 2025, 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. + +/// @assertion Given a named initializing formal or field parameter (for a +/// primary constructor) with private name `p` in constructor `C`: +/// - If `p` has no corresponding public name `n`, then compile-time error. +/// +/// @description Check that it is a compile-time error if a named initializing +/// formal parameter with private name has no corresponding public name. +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=private-named-parameters + +class C { + String _1; + C({this._1 = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + C._({required this._1}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +extension type ET._(String _1) { + ET({this._1 = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + ET.named({required this._1}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +enum E { + e0; + + final String _1; + const E({this._1 = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + const E.named({required this._1}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +main() { + print(C); + print(ET); + print(E); +} diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart new file mode 100644 index 0000000000..7b65cbbc0e --- /dev/null +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart @@ -0,0 +1,78 @@ +// Copyright (c) 2025, 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. + +/// @assertion Given a named initializing formal or field parameter (for a +/// primary constructor) with private name `p` in constructor `C`: +/// - If `p` has no corresponding public name `n`, then compile-time error. +/// +/// @description Check that it is a compile-time error if a named formal +/// parameter of a declaring constructor with private name has no corresponding +/// public name. +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=private-named-parameters,declaring-constructors + +class C1({var String __p}) { +// ^^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +class C2({required final String _1}) { +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +class C3 { + this({required final String __p}); +// ^^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +class C4 { + this({var String _1 = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +extension type ET1 { + this({final String __p = ""}); +} + +extension type ET2 { + this({final String _1 = ""}); +} + +enum E1({required final String __p}) { +// ^^^ +// [analyzer] unspecified +// [cfe] unspecified + e0(_p: ""); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +enum E2 { + e0; + + const this({final String _1 = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +main() { + print(C1); + print(C2); + print(C3); + print(C4); + print(ET1); + print(ET2); + print(E1); + print(E2); +} diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart new file mode 100644 index 0000000000..8c1fc1eed2 --- /dev/null +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart @@ -0,0 +1,65 @@ +// Copyright (c) 2025, 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. + +/// @assertion Given a named initializing formal or field parameter (for a +/// primary constructor) with private name `p` in constructor `C`: +/// - If `p` has no corresponding public name `n`, then compile-time error. You +/// can't use a private name for a named parameter unless there is a valid +/// public name that could be used at the call site. +/// - If any other parameter in `C` has declared name `p` or `n`, then +/// compile-time error. +/// +/// @description Check that it is a compile-time error if any other parameter in +/// `C` has declared name `p` or `n`. +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=private-named-parameters + +class C { + String _p; + String p; + C({this._p = "", int? _p}) : p = ""; +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + C._({required this._p, this.p}); +// ^ +// [analyzer] unspecified +// [cfe] unspecified +} + +extension type ET._(String _p) { + ET({this._p = "", int _p = 0}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + ET.named({required this._p, int? p}); +// ^ +// [analyzer] unspecified +// [cfe] unspecified +} + +enum E { + e0; + + final String _p; + final int? p; + const E({this._p = "", int? _p}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + + const E.named({required this._p, this.p}); +// ^ +// [analyzer] unspecified +// [cfe] unspecified +} + +main() { + print(C); + print(ET); + print(E); +} diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart new file mode 100644 index 0000000000..3984ed54cf --- /dev/null +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart @@ -0,0 +1,69 @@ +// Copyright (c) 2025, 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. + +/// @assertion Given a named initializing formal or field parameter (for a +/// primary constructor) with private name `p` in constructor `C`: +/// - If `p` has no corresponding public name `n`, then compile-time error. You +/// can't use a private name for a named parameter unless there is a valid +/// public name that could be used at the call site. +/// - If any other parameter in `C` has declared name `p` or `n`, then +/// compile-time error. +/// +/// @description Check that it is a compile-time error if any other parameter in +/// `C` has declared name `p` or `n`. +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=private-named-parameters,declaring-constructors + +class C1({var String _p = "", int? _p}) { +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +class C2 { + this({final String _p = "", int p = 0}); +// ^ +// [analyzer] unspecified +// [cfe] unspecified +} + +extension type ET1 { + this({final String _p = "", int _p = 0}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +extension type ET2 { + this({final String _p = "", int p = 0}); +// ^ +// [analyzer] unspecified +// [cfe] unspecified +} + +enum E1({final String _p = "", int? _p}) { +// ^^ +// [analyzer] unspecified +// [cfe] unspecified + e0; +} + +enum E2 { + e0; + + const this({final String _p = "", final int? p}); +// ^ +// [analyzer] unspecified +// [cfe] unspecified +} + +main() { + print(C1); + print(C2); + print(ET1); + print(ET2); + print(E1); + print(E2); +} From 8f0a546a9fd903ec53f1b012193a17251701e61f Mon Sep 17 00:00:00 2001 From: sgrekhov Date: Tue, 28 Oct 2025 15:47:21 +0200 Subject: [PATCH 2/6] Implement review recommendations --- .../static_semantics_A01_t01.dart | 24 +++++++++---------- .../static_semantics_A01_t02.dart | 2 +- .../static_semantics_A01_t03.dart | 4 ++-- .../static_semantics_A02_t01.dart | 14 +++++------ .../static_semantics_A02_t02.dart | 10 ++++---- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart index 4b2741d277..8566512493 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart @@ -7,32 +7,32 @@ /// - If `p` has no corresponding public name `n`, then compile-time error. /// /// @description Check that it is a compile-time error if a named initializing -/// formal parameter with private name has no corresponding public name. +/// formal parameter has a private name that has no corresponding public name. /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=private-named-parameters class C { String __p; - C({this._p = ""}); -// ^^ + C({this.__p = ""}); +// ^^^ // [analyzer] unspecified // [cfe] unspecified - C._({required this._p}); -// ^^ + C._({required this.__p}); +// ^^^ // [analyzer] unspecified // [cfe] unspecified } extension type ET._(String __p) { - ET({this._p = ""}); -// ^^ + ET({this.__p = ""}); +// ^^^ // [analyzer] unspecified // [cfe] unspecified - ET.named({required this._p}); -// ^^ + ET.named({required this.__p}); +// ^^^ // [analyzer] unspecified // [cfe] unspecified } @@ -41,13 +41,13 @@ enum E { e0; final String __p; - const E({this._p = ""}); + const E({this.__p = ""}); // ^^ // [analyzer] unspecified // [cfe] unspecified - const E.named({required this._p}); -// ^^ + const E.named({required this.__p}); +// ^^^ // [analyzer] unspecified // [cfe] unspecified } diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart index 62952a33f3..01fa774fa2 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t02.dart @@ -7,7 +7,7 @@ /// - If `p` has no corresponding public name `n`, then compile-time error. /// /// @description Check that it is a compile-time error if a named initializing -/// formal parameter with private name has no corresponding public name. +/// formal parameter has a private name that has no corresponding public name. /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=private-named-parameters diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart index 7b65cbbc0e..2cf96aeb58 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart @@ -7,8 +7,8 @@ /// - If `p` has no corresponding public name `n`, then compile-time error. /// /// @description Check that it is a compile-time error if a named formal -/// parameter of a declaring constructor with private name has no corresponding -/// public name. +/// parameter of a declaring constructor has a private name with no +/// corresponding public name. /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=private-named-parameters,declaring-constructors diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart index 8c1fc1eed2..72fd1fbc66 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart @@ -19,8 +19,8 @@ class C { String _p; String p; - C({this._p = "", int? _p}) : p = ""; -// ^^ + C(int? _p, {this._p = "", }) : p = ""; +// ^^ // [analyzer] unspecified // [cfe] unspecified @@ -31,8 +31,8 @@ class C { } extension type ET._(String _p) { - ET({this._p = "", int _p = 0}); -// ^^ + ET(int _p = 0, {this._p = "", }); +// ^^ // [analyzer] unspecified // [cfe] unspecified @@ -43,12 +43,12 @@ extension type ET._(String _p) { } enum E { - e0; + e0(1); final String _p; final int? p; - const E({this._p = "", int? _p}); -// ^^ + const E(int? _p, {this._p = ""}); +// ^^ // [analyzer] unspecified // [cfe] unspecified diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart index 3984ed54cf..bfdd5a7678 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart @@ -16,8 +16,8 @@ // SharedOptions=--enable-experiment=private-named-parameters,declaring-constructors -class C1({var String _p = "", int? _p}) { -// ^^ +class C1(int? _p, {var String _p = "", }) { +// ^^ // [analyzer] unspecified // [cfe] unspecified } @@ -30,7 +30,7 @@ class C2 { } extension type ET1 { - this({final String _p = "", int _p = 0}); + this(int _p = 0, {final String _p = ""}); // ^^ // [analyzer] unspecified // [cfe] unspecified @@ -43,8 +43,8 @@ extension type ET2 { // [cfe] unspecified } -enum E1({final String _p = "", int? _p}) { -// ^^ +enum E1(int? _p, {final String _p = ""}) { +// ^^ // [analyzer] unspecified // [cfe] unspecified e0; From 357119a0e462593d25bf29e9e8841631ac2eb144 Mon Sep 17 00:00:00 2001 From: "Sergey G. Grekhov" Date: Tue, 28 Oct 2025 16:00:38 +0200 Subject: [PATCH 3/6] Fix syntax errors --- .../Private-named-parameters/static_semantics_A02_t01.dart | 4 ++-- .../Private-named-parameters/static_semantics_A02_t02.dart | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart index 72fd1fbc66..014b1a4ffa 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart @@ -31,8 +31,8 @@ class C { } extension type ET._(String _p) { - ET(int _p = 0, {this._p = "", }); -// ^^ + ET(int _p, {this._p = ""}); +// ^^ // [analyzer] unspecified // [cfe] unspecified diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart index bfdd5a7678..fa241f958a 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t02.dart @@ -16,7 +16,7 @@ // SharedOptions=--enable-experiment=private-named-parameters,declaring-constructors -class C1(int? _p, {var String _p = "", }) { +class C1(int? _p, {var String _p = ""}) { // ^^ // [analyzer] unspecified // [cfe] unspecified @@ -30,8 +30,8 @@ class C2 { } extension type ET1 { - this(int _p = 0, {final String _p = ""}); -// ^^ + this(int _p, {final String _p = ""}); +// ^^ // [analyzer] unspecified // [cfe] unspecified } From e6dd5e25f5fea70904b4de77b8b65a1d8ccc0752 Mon Sep 17 00:00:00 2001 From: sgrekhov Date: Wed, 29 Oct 2025 11:10:15 +0200 Subject: [PATCH 4/6] Make static_semantics_A01_t01.dart stronger --- .../Private-named-parameters/static_semantics_A01_t01.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart index 8566512493..bca0eb8a6c 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart @@ -13,7 +13,7 @@ // SharedOptions=--enable-experiment=private-named-parameters class C { - String __p; + String _p; C({this.__p = ""}); // ^^^ // [analyzer] unspecified @@ -25,7 +25,7 @@ class C { // [cfe] unspecified } -extension type ET._(String __p) { +extension type ET._(String _p) { ET({this.__p = ""}); // ^^^ // [analyzer] unspecified @@ -40,7 +40,7 @@ extension type ET._(String __p) { enum E { e0; - final String __p; + final String _p; const E({this.__p = ""}); // ^^ // [analyzer] unspecified From 74f69c83f14599e20c69a30f8694d7300a5b8c7e Mon Sep 17 00:00:00 2001 From: sgrekhov Date: Wed, 29 Oct 2025 11:15:21 +0200 Subject: [PATCH 5/6] Add missing expected errors --- .../Private-named-parameters/static_semantics_A01_t03.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart index 2cf96aeb58..6074a54bc2 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t03.dart @@ -41,10 +41,16 @@ class C4 { extension type ET1 { this({final String __p = ""}); +// ^^^ +// [analyzer] unspecified +// [cfe] unspecified } extension type ET2 { this({final String _1 = ""}); +// ^^ +// [analyzer] unspecified +// [cfe] unspecified } enum E1({required final String __p}) { From 65534c0981effa0a6e4cbbb84c5eb57eb0a23652 Mon Sep 17 00:00:00 2001 From: sgrekhov Date: Wed, 29 Oct 2025 16:52:59 +0200 Subject: [PATCH 6/6] Implement review recommendations --- .../Private-named-parameters/static_semantics_A01_t01.dart | 6 +++--- .../Private-named-parameters/static_semantics_A02_t01.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart index bca0eb8a6c..8566512493 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A01_t01.dart @@ -13,7 +13,7 @@ // SharedOptions=--enable-experiment=private-named-parameters class C { - String _p; + String __p; C({this.__p = ""}); // ^^^ // [analyzer] unspecified @@ -25,7 +25,7 @@ class C { // [cfe] unspecified } -extension type ET._(String _p) { +extension type ET._(String __p) { ET({this.__p = ""}); // ^^^ // [analyzer] unspecified @@ -40,7 +40,7 @@ extension type ET._(String _p) { enum E { e0; - final String _p; + final String __p; const E({this.__p = ""}); // ^^ // [analyzer] unspecified diff --git a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart index 014b1a4ffa..fffdc0743e 100644 --- a/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart +++ b/LanguageFeatures/Private-named-parameters/static_semantics_A02_t01.dart @@ -19,7 +19,7 @@ class C { String _p; String p; - C(int? _p, {this._p = "", }) : p = ""; + C(int? _p, {this._p = ""}) : p = ""; // ^^ // [analyzer] unspecified // [cfe] unspecified