Skip to content

Commit

Permalink
dart-lang#1959. More valid combinations of modifiers tests added
Browse files Browse the repository at this point in the history
  • Loading branch information
sgrekhov committed Apr 20, 2023
1 parent 519aa1f commit 1106dde
Show file tree
Hide file tree
Showing 78 changed files with 2,672 additions and 603 deletions.
11 changes: 10 additions & 1 deletion LanguageFeatures/Class-modifiers/class_modifiers_lib.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ class Class {}
base class BaseClass {}
interface class InterfaceClass {}
final class FinalClass {}
abstract class AbstractClass {}
sealed class SealedClass {}
abstract class AbstractClass {}
abstract base class AbstractBaseClass {}
abstract interface class AbstractInterfaceClass {}
abstract final class AbstractFinalClass {}
Expand Down Expand Up @@ -58,4 +58,13 @@ mixin MixinOnSealed on SealedClass {}
class ExtendsAbstractClass1 extends AbstractClass {}
class ExtendsAbstractClass2 extends AbstractClass {}

base class BaseClassExtendsAbstractBaseClass1 extends AbstractBaseClass {}
base class BaseClassExtendsAbstractBaseClass2 extends AbstractBaseClass {}

class ExtendsAbstractInterfaceClass1 extends AbstractInterfaceClass {} // reopen
interface class ExtendsAbstractInterfaceClass2 extends AbstractInterfaceClass {}

final class ExtendsAbstractFinalClass1 extends AbstractFinalClass {}
final class ExtendsAbstractFinalClass2 extends AbstractFinalClass {}

ExtendsSealedClass extendsSealedClass = ExtendsSealedClass();
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
/// implemented or mixed in and is not exhaustive
///
/// @description Check that it is not an error to extend an
/// `abstract base class` (by `base/final/sealed`) or declare mixin `on` it, in
/// the same library where it is defined
/// `abstract base class` (by `base/final/sealed`) outside of the library where
/// it is defined (other cases tested in `basic_restrictions_A04_t*`)
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

abstract base class AbstractBaseClass {}
import "class_modifiers_lib.dart";

base class BaseClassExtendsAbstractBaseClass extends AbstractBaseClass {}

Expand All @@ -26,13 +26,10 @@ abstract base class AbstractBaseClassExtendsAbstractBaseClass
abstract final class AbstractFinalClassExtendsAbstractBaseClass
extends AbstractBaseClass {}

base mixin BaseMixinOnAbstractBaseClass on AbstractBaseClass {}

main() {
print(BaseClassExtendsAbstractBaseClass);
print(FinalClassExtendsAbstractBaseClass);
print(SealedClassExtendsAbstractBaseClass);
print(AbstractBaseClassExtendsAbstractBaseClass);
print(AbstractFinalClassExtendsAbstractBaseClass);
print(BaseMixinOnAbstractBaseClass);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
/// implemented or mixed in and is not exhaustive
///
/// @description Check that it is not an error to extend an
/// `abstract base class` (by `base/final/sealed`) or declare mixin `on` it,
/// outside of the library where it is defined
/// `abstract base class` (by `base/final/sealed`) in the same library where it
/// is defined (other cases tested in `basic_restrictions_A04_t*`)
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

import "class_modifiers_lib.dart";
abstract base class AbstractBaseClass {}

base class BaseClassExtendsAbstractBaseClass extends AbstractBaseClass {}

Expand All @@ -26,13 +26,10 @@ abstract base class AbstractBaseClassExtendsAbstractBaseClass
abstract final class AbstractFinalClassExtendsAbstractBaseClass
extends AbstractBaseClass {}

base mixin BaseMixinOnAbstractBaseClass on AbstractBaseClass {}

main() {
print(BaseClassExtendsAbstractBaseClass);
print(FinalClassExtendsAbstractBaseClass);
print(SealedClassExtendsAbstractBaseClass);
print(AbstractBaseClassExtendsAbstractBaseClass);
print(AbstractFinalClassExtendsAbstractBaseClass);
print(BaseMixinOnAbstractBaseClass);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,63 @@
/// @assertion Abstract base class can be extended but not constructed,
/// implemented or mixed in and is not exhaustive
///
/// @description Check that it is not an error to implement an
/// `abstract base class` (by `base/final/sealed`), in the same library where it
/// is defined
/// @description Checks that it is a compile-time error if an
/// `abstract base class` is implemented outside of the library where it is
/// defined by `base/final/sealed class` (other cases tested in
/// `basic_restrictions_A03_t*`)
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

abstract base class AbstractBaseClass {}
import "class_modifiers_lib.dart";

base class BaseClassImplementsBaseClass implements AbstractBaseClass {}
base class BaseClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

final class FinalClassImplementsBaseClass implements AbstractBaseClass {}
final class FinalClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

sealed class SealedClassImplementsBaseClass implements AbstractBaseClass {}
sealed class SealedClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

abstract base class AbstractBaseClassImplementsBaseClass
implements AbstractBaseClass {}
abstract base class AbstractBaseClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

abstract final class AbstractFinalClassImplementsBaseClass
implements AbstractBaseClass {}
abstract final class AbstractFinalClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

base mixin class BaseMixinOnAbstractBaseClass implements AbstractBaseClass {}
base mixin class BaseMixinImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

abstract base mixin class AbstractBaseMixinOnAbstractBaseClass
implements AbstractBaseClass {}
abstract base mixin class AbstractBaseMixinImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

enum EnumImplementsAbstractBaseClass implements AbstractBaseClass {e1, e2}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

main() {
print(BaseClassImplementsBaseClass);
print(FinalClassImplementsBaseClass);
print(SealedClassImplementsBaseClass);
print(AbstractBaseClassImplementsBaseClass);
print(AbstractFinalClassImplementsBaseClass);
print(BaseMixinOnAbstractBaseClass);
print(AbstractBaseMixinOnAbstractBaseClass);
print(BaseClassImplementsAbstractBaseClass);
print(FinalClassImplementsAbstractBaseClass);
print(SealedClassImplementsAbstractBaseClass);
print(AbstractBaseClassImplementsAbstractBaseClass);
print(AbstractFinalClassImplementsAbstractBaseClass);
print(BaseMixinImplementsAbstractBaseClass);
print(AbstractBaseMixinImplementsAbstractBaseClass);
print(EnumImplementsAbstractBaseClass);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,56 +5,42 @@
/// @assertion Abstract base class can be extended but not constructed,
/// implemented or mixed in and is not exhaustive
///
/// @description Checks that it is a compile-time error if an
/// `abstract base class` is implemented outside of the library where it is
/// defined
/// @description Check that it is not an error to implement an
/// `abstract base class` (by `base/final/sealed`), in the same library where it
/// is defined (other cases tested in `basic_restrictions_A03_t*`)
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

import "class_modifiers_lib.dart";
abstract base class AbstractBaseClass {}

base class BaseClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
base class BaseClassImplementsBaseClass implements AbstractBaseClass {}

final class FinalClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
final class FinalClassImplementsBaseClass implements AbstractBaseClass {}

sealed class SealedClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
sealed class SealedClassImplementsBaseClass implements AbstractBaseClass {}

abstract base class AbstractBaseClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
abstract base class AbstractBaseClassImplementsBaseClass
implements AbstractBaseClass {}

abstract final class AbstractFinalClassImplementsAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
abstract final class AbstractFinalClassImplementsBaseClass
implements AbstractBaseClass {}

base mixin class BaseMixinOnAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
base mixin class BaseMixinImplementsAbstractBaseClass
implements AbstractBaseClass {}

abstract base mixin class AbstractBaseMixinOnAbstractBaseClass implements AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
abstract base mixin class AbstractBaseMixinImplementsAbstractBaseClass
implements AbstractBaseClass {}

enum EnumImplementsAbstractBaseClass implements AbstractBaseClass { e1, e2 }

main() {
print(BaseClassImplementsAbstractBaseClass);
print(FinalClassImplementsAbstractBaseClass);
print(SealedClassImplementsAbstractBaseClass);
print(AbstractBaseClassImplementsAbstractBaseClass);
print(AbstractFinalClassImplementsAbstractBaseClass);
print(BaseMixinOnAbstractBaseClass);
print(AbstractBaseMixinOnAbstractBaseClass);
print(BaseClassImplementsBaseClass);
print(FinalClassImplementsBaseClass);
print(SealedClassImplementsBaseClass);
print(AbstractBaseClassImplementsBaseClass);
print(AbstractFinalClassImplementsBaseClass);
print(BaseMixinImplementsAbstractBaseClass);
print(AbstractBaseMixinImplementsAbstractBaseClass);
print(EnumImplementsAbstractBaseClass);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
/// implemented or mixed in and is not exhaustive
///
/// @description Checks that it is a compile-time error if an
/// `abstract base class` is mixed in in the same library where it is defined
/// `abstract base class` is mixed in a `base/final/sealed` class (other cases
/// tested in `basic_restrictions_A04_t*`) outside of the library where it is
/// defined
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

abstract base class AbstractBaseClass {}
import "class_modifiers_lib.dart";

base class BaseClassWithAbstractBaseClass1 with AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
Expand Down Expand Up @@ -63,6 +65,11 @@ abstract final class AbstractFinalClassWithAbstractBaseClass2 = Object with Abst
// [analyzer] unspecified
// [cfe] unspecified

enum EnumWithAbstractBaseClass with AbstractBaseClass {e1, e2}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

main() {
print(BaseClassWithAbstractBaseClass1);
print(BaseClassWithAbstractBaseClass2);
Expand All @@ -74,4 +81,5 @@ main() {
print(AbstractBaseClassWithAbstractBaseClass2);
print(AbstractFinalClassWithAbstractBaseClass1);
print(AbstractFinalClassWithAbstractBaseClass2);
print(EnumWithAbstractBaseClass);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
/// implemented or mixed in and is not exhaustive
///
/// @description Checks that it is a compile-time error if an
/// `abstract base class` is mixed in outside of the library where it is defined
/// `abstract base class` is mixed in a `base/final/sealed` class (other cases
/// tested in `basic_restrictions_A04_t*`) in the same library where it is
// defined
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

import "class_modifiers_lib.dart";
abstract base class AbstractBaseClass {}

base class BaseClassWithAbstractBaseClass1 with AbstractBaseClass {}
// ^^^^^^^^^^^^^^^^^
Expand Down Expand Up @@ -63,6 +65,11 @@ abstract final class AbstractFinalClassWithAbstractBaseClass2 = Object with Abst
// [analyzer] unspecified
// [cfe] unspecified

enum EnumWithAbstractBaseClass with AbstractBaseClass {e1, e2}
// ^^^^^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

main() {
print(BaseClassWithAbstractBaseClass1);
print(BaseClassWithAbstractBaseClass2);
Expand All @@ -74,4 +81,5 @@ main() {
print(AbstractBaseClassWithAbstractBaseClass2);
print(AbstractFinalClassWithAbstractBaseClass1);
print(AbstractFinalClassWithAbstractBaseClass2);
print(EnumWithAbstractBaseClass);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// 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 Abstract base class can be extended but not constructed,
/// implemented or mixed in and is not exhaustive
///
/// @description Check that it is not an error to declare a `base mixin` on an
/// `abstract base class`
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

import "class_modifiers_lib.dart";

abstract base class LocalAbstractBaseClass {}

base mixin BaseMixinOnAbstractBaseClass on AbstractBaseClass {}

base mixin BaseMixinOnLocalAbstractBaseClass on LocalAbstractBaseClass {}

main() {
print(BaseMixinOnAbstractBaseClass);
print(BaseMixinOnLocalAbstractBaseClass);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// 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 Abstract class can be extended and implemented but not
/// constructed, mixed in and is not exhaustive
///
/// @description Checks that `abstract base class` is not exhaustive
/// @author [email protected]
// SharedOptions=--enable-experiment=class-modifiers

import "class_modifiers_lib.dart";

abstract base class _C {}
base class ExtendsC1 extends _C {}
base class ExtendsC2 extends _C {}

String test1(_C c) => switch (c) {
// ^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
ExtendsC1 _ => "ExtendsC1",
ExtendsC2 _ => "ExtendsC2"
};

String test2(AbstractBaseClass c) => switch (c) {
// ^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
ExtendsAbstractClass1 _ => "ExtendsAbstractClass1",
ExtendsAbstractClass2 _ => "ExtendsAbstractClass2"
};

main() {
test1(ExtendsC1());
test2(BaseClassExtendsAbstractBaseClass1());
}
Loading

0 comments on commit 1106dde

Please sign in to comment.