Skip to content

Commit

Permalink
#1400. Inline classes syntax tests updated and missing one added (#2048)
Browse files Browse the repository at this point in the history
Update inline class syntax tests, add one missing test
  • Loading branch information
sgrekhov authored May 16, 2023
1 parent e113ced commit 305facf
Show file tree
Hide file tree
Showing 30 changed files with 881 additions and 118 deletions.
6 changes: 6 additions & 0 deletions LanguageFeatures/Inline-classes/inline_class_lib.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@
// 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 [email protected]
// SharedOptions=--enable-experiment=inline-class

library inline_class_lib;

int x = 42;

final inline class FinalInlineClass {
final int x;
const FinalInlineClass([this.x = 0]);
}
2 changes: 1 addition & 1 deletion LanguageFeatures/Inline-classes/syntax_A01_t01.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand Down
2 changes: 1 addition & 1 deletion LanguageFeatures/Inline-classes/syntax_A01_t02.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand Down
2 changes: 1 addition & 1 deletion LanguageFeatures/Inline-classes/syntax_A01_t03.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand Down
2 changes: 1 addition & 1 deletion LanguageFeatures/Inline-classes/syntax_A01_t04.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand Down
3 changes: 1 addition & 2 deletions LanguageFeatures/Inline-classes/syntax_A02_t01.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand All @@ -15,7 +15,6 @@
///
/// @description Checks that an inline class declaration may contain different
/// constructors
///
/// @author [email protected]
// SharedOptions=--enable-experiment=inline-class
Expand Down
3 changes: 1 addition & 2 deletions LanguageFeatures/Inline-classes/syntax_A02_t02.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand All @@ -15,7 +15,6 @@
///
/// @description Checks that an inline class declaration may contain different
/// constructors with optional parameters
///
/// @author [email protected]
// SharedOptions=--enable-experiment=inline-class
Expand Down
2 changes: 1 addition & 1 deletion LanguageFeatures/Inline-classes/syntax_A02_t03.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand Down
3 changes: 1 addition & 2 deletions LanguageFeatures/Inline-classes/syntax_A02_t04.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand All @@ -15,7 +15,6 @@
///
/// @description Checks that an inline class declaration may contain factory
/// constructors
///
/// @author [email protected]
// SharedOptions=--enable-experiment=inline-class
Expand Down
3 changes: 1 addition & 2 deletions LanguageFeatures/Inline-classes/syntax_A02_t05.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand All @@ -15,7 +15,6 @@
///
/// @description Checks that an inline class declaration may contain constant
/// constructors
///
/// @author [email protected]
// SharedOptions=--enable-experiment=inline-class
Expand Down
3 changes: 1 addition & 2 deletions LanguageFeatures/Inline-classes/syntax_A02_t06.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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>)*
/// '}'
Expand All @@ -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 [email protected]
// SharedOptions=--enable-experiment=inline-class
Expand Down
30 changes: 30 additions & 0 deletions LanguageFeatures/Inline-classes/syntax_A02_t07.dart
Original file line number Diff line number Diff line change
@@ -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 [email protected]
// 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);
}
119 changes: 119 additions & 0 deletions LanguageFeatures/Inline-classes/syntax_A02_t08.dart
Original file line number Diff line number Diff line change
@@ -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 [email protected]
// 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);
}
Loading

0 comments on commit 305facf

Please sign in to comment.