blob: 79a1e04802e6e0564c2955427840fdb35a6f0ae0 [file] [log] [blame]
// 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.
/// Test the valid uses of a base class within the same library
base class BaseClass {}
mixin _MixinOnObject {}
/// BaseClass can be extended, so long as the subtype is base, final
/// or sealed.
// Simple extension.
base class BaseExtend extends BaseClass {}
final class FinalExtend extends BaseClass {}
// Extending with a sealed class.
sealed class SealedExtend extends BaseClass {}
// Extending through a sealed class.
base class BaseSealedExtendExtend extends SealedExtend {}
final class FinalSealedExtendExtend extends SealedExtend {}
sealed class SealedSealedExtendExtend extends SealedExtend {}
// Implementing through a sealed class.
base class BaseSealedExtendImplement implements SealedExtend {}
final class FinalSealedExtendImplement implements SealedExtend {}
sealed class SealedSealedExtendImplement implements SealedExtend {}
base mixin class BaseMixinClassSealedExtendImplement implements SealedExtend {}
base mixin BaseMixinSealedExtendImplement implements SealedExtend {}
// Using a sealed class as an `on` type
base mixin BaseMixinSealedExtendOn on SealedExtend {}
// Extending via an anonymous mixin class.
base class BaseExtendWith extends BaseClass with _MixinOnObject {}
final class FinalExtendWith extends BaseClass with _MixinOnObject {}
sealed class SealedExtendWith extends BaseClass with _MixinOnObject {}
// Extending via an anonymous mixin application class.
final class FinalExtendApplication = BaseClass with _MixinOnObject;
base class BaseExtendApplication = BaseClass with _MixinOnObject;
sealed class SealedExtendApplication = BaseClass with _MixinOnObject;
/// BaseClass can be implemented, so long as the subtype is base, final, or
/// sealed
// Simple implementation.
base class BaseImplement implements BaseClass {}
final class FinalImplement implements BaseClass {}
// Implementing with a sealed class.
sealed class SealedImplement implements BaseClass {}
// Extending through a sealed class.
base class BaseSealedImplementExtend extends SealedImplement {}
final class FinalSealedImplementExtend extends SealedImplement {}
sealed class SealedSealedImplementExtend extends SealedImplement {}
// Implementing through a sealed class.
base class BaseSealedImplementImplement implements SealedImplement {}
final class FinalSealedImplementImplement implements SealedImplement {}
sealed class SealedSealedImplementImplement implements SealedImplement {}
// Implementing with a mixin class.
base mixin class BaseMixinClassImplement implements BaseClass {}
// Implementing by applying a mixin class.
base class BaseMixinClassImplementApplied extends Object
with BaseMixinClassImplement {}
final class FinalMixinClassImplementApplied extends Object
with BaseMixinClassImplement {}
sealed class SealedMixinClassImplementApplied extends Object
with BaseMixinClassImplement {}
// Implementing with a mixin application class.
base class BaseImplementApplication = Object
with _MixinOnObject
implements BaseClass;
final class FinalImplementApplication = Object
with _MixinOnObject
implements BaseClass;
sealed class SealedImplementApplication = Object
with _MixinOnObject
implements BaseClass;
// Implementing with a mixin.
base mixin BaseMixinImplement implements BaseClass {}
// Implementing by applying a mixin.
base class BaseMixinImplementApplied extends Object with BaseMixinImplement {}
final class FinalMixinImplementApplied extends Object with BaseMixinImplement {}
sealed class SealedMixinImplementApplied extends Object
with BaseMixinImplement {}
/// BaseClass can be an `on` type, so long as the subtype is base.
base mixin BaseMixinOn on BaseClass {}
// This test is intended just to check that certain combinations of modifiers
// are statically allowed. Make this a static error test so that backends don't
// try to run it.
int x = "This is a static error test";
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.