From 305facf09a11e7150d176b35fd5e98af4ec7ba55 Mon Sep 17 00:00:00 2001 From: "Sergey G. Grekhov" <sgrekhov22@gmail.com> Date: Tue, 16 May 2023 11:51:57 +0300 Subject: [PATCH] #1400. Inline classes syntax tests updated and missing one added (#2048) Update inline class syntax tests, add one missing test --- .../Inline-classes/inline_class_lib.dart | 6 + .../Inline-classes/syntax_A01_t01.dart | 2 +- .../Inline-classes/syntax_A01_t02.dart | 2 +- .../Inline-classes/syntax_A01_t03.dart | 2 +- .../Inline-classes/syntax_A01_t04.dart | 2 +- .../Inline-classes/syntax_A02_t01.dart | 3 +- .../Inline-classes/syntax_A02_t02.dart | 3 +- .../Inline-classes/syntax_A02_t03.dart | 2 +- .../Inline-classes/syntax_A02_t04.dart | 3 +- .../Inline-classes/syntax_A02_t05.dart | 3 +- .../Inline-classes/syntax_A02_t06.dart | 3 +- .../Inline-classes/syntax_A02_t07.dart | 30 ++ .../Inline-classes/syntax_A02_t08.dart | 119 ++++++++ .../Inline-classes/syntax_A02_t09.dart | 115 +++++++ .../Inline-classes/syntax_A02_t10.dart | 36 +++ .../Inline-classes/syntax_A02_t11.dart | 37 +++ .../Inline-classes/syntax_A02_t12.dart | 141 +++++++++ .../Inline-classes/syntax_A02_t13.dart | 285 ++++++++++++++++++ .../Inline-classes/syntax_A03_t01.dart | 2 +- .../Inline-classes/syntax_A03_t02.dart | 4 +- .../Inline-classes/syntax_A03_t03.dart | 2 +- .../Inline-classes/syntax_A03_t04.dart | 4 +- .../Inline-classes/syntax_A03_t05.dart | 4 +- .../Inline-classes/syntax_A04_t01.dart | 6 +- .../Inline-classes/syntax_A04_t02.dart | 2 +- .../Inline-classes/syntax_A04_t03.dart | 5 +- .../Inline-classes/syntax_A04_t04.dart | 2 +- .../Inline-classes/syntax_A05_t01.dart | 55 ++++ .../Inline-classes/syntax_A06_t01.dart | 55 ++-- .../Inline-classes/syntax_A07_t01.dart | 64 ---- 30 files changed, 881 insertions(+), 118 deletions(-) create mode 100644 LanguageFeatures/Inline-classes/syntax_A02_t07.dart create mode 100644 LanguageFeatures/Inline-classes/syntax_A02_t08.dart create mode 100644 LanguageFeatures/Inline-classes/syntax_A02_t09.dart create mode 100644 LanguageFeatures/Inline-classes/syntax_A02_t10.dart create mode 100644 LanguageFeatures/Inline-classes/syntax_A02_t11.dart create mode 100644 LanguageFeatures/Inline-classes/syntax_A02_t12.dart create mode 100644 LanguageFeatures/Inline-classes/syntax_A02_t13.dart create mode 100644 LanguageFeatures/Inline-classes/syntax_A05_t01.dart delete mode 100644 LanguageFeatures/Inline-classes/syntax_A07_t01.dart diff --git a/LanguageFeatures/Inline-classes/inline_class_lib.dart b/LanguageFeatures/Inline-classes/inline_class_lib.dart index cac9e5d0a4..8ea538428e 100644 --- a/LanguageFeatures/Inline-classes/inline_class_lib.dart +++ b/LanguageFeatures/Inline-classes/inline_class_lib.dart @@ -2,6 +2,7 @@ // 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. +/// @description Helper library for testing inline classes /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class @@ -9,3 +10,8 @@ library inline_class_lib; int x = 42; + +final inline class FinalInlineClass { + final int x; + const FinalInlineClass([this.x = 0]); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A01_t01.dart b/LanguageFeatures/Inline-classes/syntax_A01_t01.dart index 8aa892cbb7..af5bde5228 100644 --- a/LanguageFeatures/Inline-classes/syntax_A01_t01.dart +++ b/LanguageFeatures/Inline-classes/syntax_A01_t01.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A01_t02.dart b/LanguageFeatures/Inline-classes/syntax_A01_t02.dart index e419ebf01e..38d489b1a0 100644 --- a/LanguageFeatures/Inline-classes/syntax_A01_t02.dart +++ b/LanguageFeatures/Inline-classes/syntax_A01_t02.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A01_t03.dart b/LanguageFeatures/Inline-classes/syntax_A01_t03.dart index 68ceef36c0..fcac3ccb1f 100644 --- a/LanguageFeatures/Inline-classes/syntax_A01_t03.dart +++ b/LanguageFeatures/Inline-classes/syntax_A01_t03.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A01_t04.dart b/LanguageFeatures/Inline-classes/syntax_A01_t04.dart index dc11fdf027..9fb63620a5 100644 --- a/LanguageFeatures/Inline-classes/syntax_A01_t04.dart +++ b/LanguageFeatures/Inline-classes/syntax_A01_t04.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t01.dart b/LanguageFeatures/Inline-classes/syntax_A02_t01.dart index a1f2d14347..5670b25fe0 100644 --- a/LanguageFeatures/Inline-classes/syntax_A02_t01.dart +++ b/LanguageFeatures/Inline-classes/syntax_A02_t01.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -15,7 +15,6 @@ /// /// @description Checks that an inline class declaration may contain different /// constructors -/// /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t02.dart b/LanguageFeatures/Inline-classes/syntax_A02_t02.dart index bff12b0813..5b44db2e92 100644 --- a/LanguageFeatures/Inline-classes/syntax_A02_t02.dart +++ b/LanguageFeatures/Inline-classes/syntax_A02_t02.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -15,7 +15,6 @@ /// /// @description Checks that an inline class declaration may contain different /// constructors with optional parameters -/// /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t03.dart b/LanguageFeatures/Inline-classes/syntax_A02_t03.dart index 15c856e4eb..4f31880d79 100644 --- a/LanguageFeatures/Inline-classes/syntax_A02_t03.dart +++ b/LanguageFeatures/Inline-classes/syntax_A02_t03.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t04.dart b/LanguageFeatures/Inline-classes/syntax_A02_t04.dart index 9b42db1a30..4c63740102 100644 --- a/LanguageFeatures/Inline-classes/syntax_A02_t04.dart +++ b/LanguageFeatures/Inline-classes/syntax_A02_t04.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -15,7 +15,6 @@ /// /// @description Checks that an inline class declaration may contain factory /// constructors -/// /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t05.dart b/LanguageFeatures/Inline-classes/syntax_A02_t05.dart index 14f21db0db..a550070fd5 100644 --- a/LanguageFeatures/Inline-classes/syntax_A02_t05.dart +++ b/LanguageFeatures/Inline-classes/syntax_A02_t05.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -15,7 +15,6 @@ /// /// @description Checks that an inline class declaration may contain constant /// constructors -/// /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t06.dart b/LanguageFeatures/Inline-classes/syntax_A02_t06.dart index 184929ef67..ac516cba4e 100644 --- a/LanguageFeatures/Inline-classes/syntax_A02_t06.dart +++ b/LanguageFeatures/Inline-classes/syntax_A02_t06.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -15,7 +15,6 @@ /// /// @description Checks that it is a compile-time error if constant constructor /// of an inline class is called with not a potentially constant expression -/// /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t07.dart b/LanguageFeatures/Inline-classes/syntax_A02_t07.dart new file mode 100644 index 0000000000..95c00fbc88 --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A02_t07.dart @@ -0,0 +1,30 @@ +// Copyright (c) 2023, 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 A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// +/// @description Checks that an inline class can be declared as `final` +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +import "../../Utils/expect.dart"; + +final inline class FIC { + final int id; + const FIC(this.id); +} + +main() { + Expect.equals(1, FIC(1).id); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t08.dart b/LanguageFeatures/Inline-classes/syntax_A02_t08.dart new file mode 100644 index 0000000000..c75c7755c1 --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A02_t08.dart @@ -0,0 +1,119 @@ +// Copyright (c) 2023, 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 A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// +/// @description Checks that it is a compile-time error to extend, implement (by +/// non-inline class) or declare a mixin on a `final inline` class even in the +/// same library where it is defined +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +final inline class FinalInlineClass { + final int x; + const FinalInlineClass([this.x = 0]); +} + +class ClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +base class BaseClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +interface class InterfaceClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +final class FinalClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +sealed class SealedClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified const SC(int id): super(id); + +abstract class AbstractClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract base class AbstractBaseClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract interface class AbstractInterfaceClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract final class AbstractFinalClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +mixin class MixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +base mixin class BaseMixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract mixin class AbstractMixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract base mixin class AbstractBaseMixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +mixin Mixin on FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +base mixin BaseMixin on FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +main() { + print(ClassExtendsFinal); + print(BaseClassExtendsFinal); + print(InterfaceClassExtendsFinal); + print(FinalClassExtendsFinal); + print(SealedClassExtendsFinal); + print(AbstractClassExtendsFinal); + print(AbstractBaseClassExtendsFinal); + print(AbstractInterfaceClassExtendsFinal); + print(AbstractFinalClassExtendsFinal); + print(MixinClassExtendsFinal); + print(BaseMixinClassExtendsFinal); + print(AbstractMixinClassExtendsFinal); + print(AbstractBaseMixinClassExtendsFinal); + print(Mixin); + print(BaseMixin); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t09.dart b/LanguageFeatures/Inline-classes/syntax_A02_t09.dart new file mode 100644 index 0000000000..38d4a6eb85 --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A02_t09.dart @@ -0,0 +1,115 @@ +// Copyright (c) 2023, 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 A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// +/// @description Checks that it is a compile-time error if a `final inline` +/// class is extended outside of the library where it is defined +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +import "inline_class_lib.dart"; + +class ClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +base class BaseClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +interface class InterfaceClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +final class FinalClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +sealed class SealedClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified const SC(int id): super(id); + +abstract class AbstractClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract base class AbstractBaseClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract interface class AbstractInterfaceClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract final class AbstractFinalClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +mixin class MixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +base mixin class BaseMixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract mixin class AbstractMixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +abstract base mixin class AbstractBaseMixinClassExtendsFinal extends FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +mixin Mixin on FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +base mixin BaseMixin on FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +main() { + print(ClassExtendsFinal); + print(BaseClassExtendsFinal); + print(InterfaceClassExtendsFinal); + print(FinalClassExtendsFinal); + print(SealedClassExtendsFinal); + print(AbstractClassExtendsFinal); + print(AbstractBaseClassExtendsFinal); + print(AbstractInterfaceClassExtendsFinal); + print(AbstractFinalClassExtendsFinal); + print(MixinClassExtendsFinal); + print(BaseMixinClassExtendsFinal); + print(AbstractMixinClassExtendsFinal); + print(AbstractBaseMixinClassExtendsFinal); + print(Mixin); + print(BaseMixin); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t10.dart b/LanguageFeatures/Inline-classes/syntax_A02_t10.dart new file mode 100644 index 0000000000..fd10a157bf --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A02_t10.dart @@ -0,0 +1,36 @@ +// Copyright (c) 2023, 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 A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// +/// @description Checks that it is a compile-time error if a `final inline` +/// class is extended by another `final inline` class in the same library +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +final inline class FIC { + final int id ; + const FIC(this.id); +} + +final inline class FIC2 extends FIC { +// ^^^ +// [analyzer] unspecified +// [cfe] unspecified + const FIC2(int id): super(id); +} + +main() { + print(FIC2); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t11.dart b/LanguageFeatures/Inline-classes/syntax_A02_t11.dart new file mode 100644 index 0000000000..77d271e306 --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A02_t11.dart @@ -0,0 +1,37 @@ +// Copyright (c) 2023, 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 A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// +/// @description Checks that it is not an error if a `final inline` class is +/// implemented by another `final inline` class in the same library +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +import "../../Utils/expect.dart"; + +final inline class FIC { + final int id ; + const FIC(this.id); +} + +final inline class FIC2 implements FIC { + final int id; + FIC2(this.id); +} + +main() { + Expect.equals(1, FIC(1).id); + Expect.equals(2, FIC2(2).id); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t12.dart b/LanguageFeatures/Inline-classes/syntax_A02_t12.dart new file mode 100644 index 0000000000..354a009441 --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A02_t12.dart @@ -0,0 +1,141 @@ +// Copyright (c) 2023, 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 A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// +/// @description Checks that it is a compile-time error if a `final inline` +/// class is implemented outside of the library where it is defined +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +import "inline_class_lib.dart"; + +class ClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +base class BaseClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +interface class InterfaceClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +final class FinalClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +sealed class SealedClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified const SC(int id): super(id); + int get x => 0; +} + +abstract class AbstractClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +abstract base class AbstractBaseClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +abstract interface class AbstractInterfaceClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +abstract final class AbstractFinalClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +mixin class MixinClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +base mixin class BaseMixinClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +abstract mixin class AbstractMixinClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +abstract base mixin class AbstractBaseMixinClassImplementsFinal implements FinalInlineClass { +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + int get x => 0; +} + +mixin Mixin implements FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +base mixin BaseMixin implements FinalInlineClass {} +// ^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + +main() { + print(ClassImplementsFinal); + print(BaseClassImplementsFinal); + print(InterfaceClassImplementsFinal); + print(FinalClassImplementsFinal); + print(SealedClassImplementsFinal); + print(AbstractClassImplementsFinal); + print(AbstractBaseClassImplementsFinal); + print(AbstractInterfaceClassImplementsFinal); + print(AbstractFinalClassImplementsFinal); + print(MixinClassImplementsFinal); + print(BaseMixinClassImplementsFinal); + print(AbstractMixinClassImplementsFinal); + print(AbstractBaseMixinClassImplementsFinal); + print(Mixin); + print(BaseMixin); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A02_t13.dart b/LanguageFeatures/Inline-classes/syntax_A02_t13.dart new file mode 100644 index 0000000000..fbb43b228a --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A02_t13.dart @@ -0,0 +1,285 @@ +// Copyright (c) 2023, 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 A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// +/// @description Checks that it is a compile-time error if an `inline` class has +/// a modifier which is not `final` +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +base inline class BaseInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + BaseInlineClass1(this.id); +} + +inline base class BaseInlineClass2 { +// ^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + BaseInlineClass2(this.id); +} + +interface inline class InterfaceInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + InterfaceInlineClass1(this.id); +} + +inline interface class InterfaceInlineClass2 { +// ^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + InterfaceInlineClass2(this.id); +} + +sealed inline class SealedInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + SealedInlineClass1(this.id); +} + +inline sealed class SealedInlineClass2 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + SealedInlineClass2(this.id); +} + +abstract inline class AbstractInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractInlineClass1(this.id); +} + +inline abstract class AbstractInlineClass2 { +// ^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractInlineClass2(this.id); +} + +abstract base inline class AbstractBaseInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractBaseInlineClass1(this.id); +} + +abstract inline base class AbstractBaseInlineClass2 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractBaseInlineClass2(this.id); +} + +inline abstract base class AbstractBaseInlineClass3 { +// ^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractBaseInlineClass3(this.id); +} + +abstract interface inline class AbstractInterfaceInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractInterfaceInlineClass1(this.id); +} + +abstract inline interface class AbstractInterfaceInlineClass2 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractInterfaceInlineClass2(this.id); +} + +inline abstract interface class AbstractInterfaceInlineClass3 { +// ^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractInterfaceInlineClass3(this.id); +} + +abstract final inline class AbstractFinalInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractFinalInlineClass1(this.id); +} + +abstract inline final class AbstractFinalInlineClass2 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractFinalInlineClass2(this.id); +} + +inline abstract final class AbstractFinalInlineClass3 { +// ^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractFinalInlineClass3(this.id); +} + + +mixin inline class MixinInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + MixinInlineClass1(this.id); +} + +inline mixin class MixinInlineClass2 { +// ^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + MixinInlineClass2(this.id); +} + +base mixin inline class BaseMixinInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + BaseMixinInlineClass(this.id); +} + +base inline mixin class BaseMixinInlineClass2 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + BaseMixinInlineClass2(this.id); +} + +inline base mixin class BaseMixinInlineClass3 { +// ^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + BaseMixinInlineClass3(this.id); +} + +abstract mixin inline class AbstractMixinInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractMixinInlineClass1(this.id); +} + +abstract inline mixin class AbstractMixinInlineClass2 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractMixinInlineClass2(this.id); +} + +inline abstract mixin class AbstractMixinInlineClass3 { +// ^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractMixinInlineClass3(this.id); +} + +abstract base mixin inline class AbstractBaseMixinInlineClass1 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractBaseMixinInlineClass1(this.id); +} + +abstract base inline mixin class AbstractBaseMixinInlineClass2 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractBaseMixinInlineClass2(this.id); +} + +abstract inline base mixin class AbstractBaseMixinInlineClass3 { +// ^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractBaseMixinInlineClass3(this.id); +} + +inline abstract base mixin class AbstractBaseMixinInlineClass4 { +// ^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified + final int id; + AbstractBaseMixinInlineClass4(this.id); +} + +main() { + print(BaseInlineClass1); + print(BaseInlineClass2); + print(InterfaceInlineClass1); + print(InterfaceInlineClass2); + print(SealedInlineClass1); + print(SealedInlineClass2); + print(AbstractInlineClass1); + print(AbstractInlineClass2); + print(AbstractBaseInlineClass1); + print(AbstractBaseInlineClass2); + print(AbstractBaseInlineClass3); + print(AbstractInterfaceInlineClass1); + print(AbstractInterfaceInlineClass2); + print(AbstractInterfaceInlineClass3); + print(AbstractFinalInlineClass1); + print(AbstractFinalInlineClass2); + print(AbstractFinalInlineClass3); + print(MixinInlineClass1); + print(MixinInlineClass2); + print(BaseMixinInlineClass1); + print(BaseMixinInlineClass2); + print(BaseMixinInlineClass3); + print(AbstractMixinInlineClass1); + print(AbstractMixinInlineClass2); + print(AbstractMixinInlineClass3); + print(AbstractBaseMixinInlineClass1); + print(AbstractBaseMixinInlineClass2); + print(AbstractBaseMixinInlineClass3); + print(AbstractBaseMixinInlineClass4); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A03_t01.dart b/LanguageFeatures/Inline-classes/syntax_A03_t01.dart index a2663f7fd6..7724956a86 100644 --- a/LanguageFeatures/Inline-classes/syntax_A03_t01.dart +++ b/LanguageFeatures/Inline-classes/syntax_A03_t01.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A03_t02.dart b/LanguageFeatures/Inline-classes/syntax_A03_t02.dart index 2cd4e98c60..4f555dc84d 100644 --- a/LanguageFeatures/Inline-classes/syntax_A03_t02.dart +++ b/LanguageFeatures/Inline-classes/syntax_A03_t02.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -20,7 +20,7 @@ /// otherwise a compile-time error occurs. /// /// @description Checks that it is a compile-time error if an inline class -/// declares an instance variable but this variable is not final +/// declares an instance variable but this variable is not `final` /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A03_t03.dart b/LanguageFeatures/Inline-classes/syntax_A03_t03.dart index 442e8a03ce..67ecc9145a 100644 --- a/LanguageFeatures/Inline-classes/syntax_A03_t03.dart +++ b/LanguageFeatures/Inline-classes/syntax_A03_t03.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A03_t04.dart b/LanguageFeatures/Inline-classes/syntax_A03_t04.dart index 07e1e53abf..4e6d641e1f 100644 --- a/LanguageFeatures/Inline-classes/syntax_A03_t04.dart +++ b/LanguageFeatures/Inline-classes/syntax_A03_t04.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -20,7 +20,7 @@ /// otherwise a compile-time error occurs. /// /// @description Checks that it is a compile-time error if an inline class -/// declares a late instance variable +/// declares a `late` instance variable /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A03_t05.dart b/LanguageFeatures/Inline-classes/syntax_A03_t05.dart index ae15fffde7..fa118b3cca 100644 --- a/LanguageFeatures/Inline-classes/syntax_A03_t05.dart +++ b/LanguageFeatures/Inline-classes/syntax_A03_t05.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -20,7 +20,7 @@ /// otherwise a compile-time error occurs. /// /// @description Checks that it is not an error if an inline class declares one -/// final instance variable +/// `final` instance variable /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A04_t01.dart b/LanguageFeatures/Inline-classes/syntax_A04_t01.dart index 48d7459816..4c2a23702f 100644 --- a/LanguageFeatures/Inline-classes/syntax_A04_t01.dart +++ b/LanguageFeatures/Inline-classes/syntax_A04_t01.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -17,8 +17,8 @@ /// of the unique final instance variable that it declares, and the type of the /// representation is the declared type of id. /// -/// @description Checks that static type of id is its declared type and there is -/// a getter named id +/// @description Checks that static type of `id` is its declared type and there +/// is a getter named `id` /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A04_t02.dart b/LanguageFeatures/Inline-classes/syntax_A04_t02.dart index de20175a51..70f04979ef 100644 --- a/LanguageFeatures/Inline-classes/syntax_A04_t02.dart +++ b/LanguageFeatures/Inline-classes/syntax_A04_t02.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A04_t03.dart b/LanguageFeatures/Inline-classes/syntax_A04_t03.dart index 1fd740aa05..c67ae0a833 100644 --- a/LanguageFeatures/Inline-classes/syntax_A04_t03.dart +++ b/LanguageFeatures/Inline-classes/syntax_A04_t03.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' @@ -16,8 +16,7 @@ /// The name of the representation in an inline class declaration is the name id /// of the unique final instance variable that it declares, and the type of the /// representation is the declared type of id. -/// -/// @description Checks that static type of id is its declared type +/// @description Checks that static type of `id` is its declared type /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class diff --git a/LanguageFeatures/Inline-classes/syntax_A04_t04.dart b/LanguageFeatures/Inline-classes/syntax_A04_t04.dart index a8e9b7213f..24cc1a7e87 100644 --- a/LanguageFeatures/Inline-classes/syntax_A04_t04.dart +++ b/LanguageFeatures/Inline-classes/syntax_A04_t04.dart @@ -6,7 +6,7 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' diff --git a/LanguageFeatures/Inline-classes/syntax_A05_t01.dart b/LanguageFeatures/Inline-classes/syntax_A05_t01.dart new file mode 100644 index 0000000000..13ff6c3377 --- /dev/null +++ b/LanguageFeatures/Inline-classes/syntax_A05_t01.dart @@ -0,0 +1,55 @@ +// 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. + +/// @assertion A rule for <inlineClassDeclaration> is added to the grammar, +/// along with some rules for elements used in inline class declarations: +/// +/// <inlineClassDeclaration> ::= +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// '{' +/// (<metadata> <inlineMemberDeclaration>)* +/// '}' +/// +/// <inlineMemberDeclaration> ::= <classMemberDefinition> +/// ... +/// A compile-time error occurs if an inline class declaration declares an +/// abstract member. +/// +/// @description Checks that it is a compile-time error if an inline class +/// declares an abstract member +/// @author sgrekhov22@gmail.com + +// SharedOptions=--enable-experiment=inline-class + +inline class IC1 { + final int id; + + IC1(this.id); + void foo(); +//^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +inline class IC2 { + final int id = 42; + int get value; +//^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +inline class IC3 { + final int id = 42; + void set value(int val); +//^^^^^^^^^^^^^^^^^^^^^^^ +// [analyzer] unspecified +// [cfe] unspecified +} + +main() { + print(IC1); + print(IC2); + print(IC3); +} diff --git a/LanguageFeatures/Inline-classes/syntax_A06_t01.dart b/LanguageFeatures/Inline-classes/syntax_A06_t01.dart index d05be07273..c5b4e93d4b 100644 --- a/LanguageFeatures/Inline-classes/syntax_A06_t01.dart +++ b/LanguageFeatures/Inline-classes/syntax_A06_t01.dart @@ -6,50 +6,59 @@ /// along with some rules for elements used in inline class declarations: /// /// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? +/// 'final'? 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? /// '{' /// (<metadata> <inlineMemberDeclaration>)* /// '}' /// /// <inlineMemberDeclaration> ::= <classMemberDefinition> /// ... -/// A compile-time error occurs if an inline class declaration declares an -/// abstract member. +/// There are no special rules for static members in inline classes. They can be +/// declared and called or torn off as usual, e.g., Inline.myStaticMethod(42) /// -/// @description Checks that it is a compile-time error if an inline class -/// declares an abstract member +/// @description Checks that inline classes may have static members. Note that +/// static members are declared before instance members (and before the unique +/// instance variable). This is not likely to be the style which is recommended, +/// but it should be used in at least one test. /// @author sgrekhov22@gmail.com // SharedOptions=--enable-experiment=inline-class +import "../../Utils/expect.dart"; + inline class IC1 { + static int get staticGetter => 42; final int id; - IC1(this.id); - void foo(); -//^^^^^^^^^^^ -// [analyzer] unspecified -// [cfe] unspecified } inline class IC2 { - final int id = 42; - int get value; -//^^^^^^^^^^^^^ -// [analyzer] unspecified -// [cfe] unspecified + static int _v; + static void set staticSetter(int val) { + _v = val; + } + final int id; + IC2(this.id); } inline class IC3 { - final int id = 42; - void set value(int val); -//^^^^^^^^^^^^^^^^^^^^^^^ -// [analyzer] unspecified -// [cfe] unspecified + static int staticMethod(int val) => val; + final int id; + IC3(this.id); +} + +inline class IC4 { + static int staticVar = 0; + final int id; + IC4(this.id); } main() { - print(IC1); - print(IC2); - print(IC3); + Expect.equals(42, IC1.staticGetter); + IC2.staticSetter = -42; + Expect.equals(-42, IC2._v); + Expect.equals(2, IC3.staticMethod(2)); + Expect.equals(0, IC4.staticVar); + IC4.staticVar = 1; + Expect.equals(1, IC4.staticVar); } diff --git a/LanguageFeatures/Inline-classes/syntax_A07_t01.dart b/LanguageFeatures/Inline-classes/syntax_A07_t01.dart deleted file mode 100644 index 3cdbbbf6c9..0000000000 --- a/LanguageFeatures/Inline-classes/syntax_A07_t01.dart +++ /dev/null @@ -1,64 +0,0 @@ -// 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. - -/// @assertion A rule for <inlineClassDeclaration> is added to the grammar, -/// along with some rules for elements used in inline class declarations: -/// -/// <inlineClassDeclaration> ::= -/// 'inline' 'class' <typeIdentifier> <typeParameters>? <interfaces>? -/// '{' -/// (<metadata> <inlineMemberDeclaration>)* -/// '}' -/// -/// <inlineMemberDeclaration> ::= <classMemberDefinition> -/// ... -/// There are no special rules for static members in inline classes. They can be -/// declared and called or torn off as usual, e.g., Inline.myStaticMethod(42) -/// -/// @description Checks that inline classes may have static members. Note that -/// static members are declared before instance members (and before the unique -/// instance variable). This is not likely to be the style which is recommended, -/// but it should be used in at least one test. -/// @author sgrekhov22@gmail.com - -// SharedOptions=--enable-experiment=inline-class - -import "../../Utils/expect.dart"; - -inline class IC1 { - static int get staticGetter => 42; - final int id; - IC1(this.id); -} - -inline class IC2 { - static int _v; - static void set staticSetter(int val) { - _v = val; - } - final int id; - IC2(this.id); -} - -inline class IC3 { - static int staticMethod(int val) => val; - final int id; - IC3(this.id); -} - -inline class IC4 { - static int staticVar = 0; - final int id; - IC4(this.id); -} - -main() { - Expect.equals(42, IC1.staticGetter); - IC2.staticSetter = -42; - Expect.equals(-42, IC2._v); - Expect.equals(2, IC3.staticMethod(2)); - Expect.equals(0, IC4.staticVar); - IC4.staticVar = 1; - Expect.equals(1, IC4.staticVar); -}