blob: a4e8b109325403a432a4d17e7fb5d8b048604159 [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 an interface class within the same library
interface class InterfaceClass {}
mixin _MixinOnObject {}
/// InterfaceClass can be extended.
// Simple extension.
class SimpleExtend extends InterfaceClass {}
base class BaseExtend extends InterfaceClass {}
interface class InterfaceExtend extends InterfaceClass {}
final class FinalExtend extends InterfaceClass {}
// Extending with a sealed class.
sealed class SealedExtend extends InterfaceClass {}
// Extending through a sealed class.
class SimpleSealedExtendExtend extends SealedExtend {}
base class BaseSealedExtendExtend extends SealedExtend {}
interface class InterfaceSealedExtendExtend extends SealedExtend {}
final class FinalSealedExtendExtend extends SealedExtend {}
sealed class SealedSealedExtendExtend extends SealedExtend {}
// Implementing through a sealed class.
class SimpleSealedExtendImplement implements SealedExtend {}
base class BaseSealedExtendImplement implements SealedExtend {}
interface class InterfaceSealedExtendImplement implements SealedExtend {}
final class FinalSealedExtendImplement implements SealedExtend {}
sealed class SealedSealedExtendImplement implements SealedExtend {}
mixin class MixinClassSealedExtendImplement implements SealedExtend {}
base mixin class BaseMixinClassSealedExtendImplement implements SealedExtend {}
mixin MixinSealedExtendImplement implements SealedExtend {}
base mixin BaseMixinSealedExtendImplement implements SealedExtend {}
// Using a sealed class as an `on` type
mixin MixinSealedExtendOn on SealedExtend {}
base mixin BaseMixinSealedExtendOn on SealedExtend {}
// Extending via an anonymous mixin class.
class SimpleExtendWith extends InterfaceClass with _MixinOnObject {}
base class BaseExtendWith extends InterfaceClass with _MixinOnObject {}
interface class InterfaceExtendWith extends InterfaceClass
with _MixinOnObject {}
final class FinalExtendWith extends InterfaceClass with _MixinOnObject {}
sealed class SealedExtendWith extends InterfaceClass with _MixinOnObject {}
// Extending via an anonymous mixin application class.
class SimpleExtendApplication = InterfaceClass with _MixinOnObject;
interface class InterfaceExtendApplication = InterfaceClass with _MixinOnObject;
final class FinalExtendApplication = InterfaceClass with _MixinOnObject;
base class BaseExtendApplication = InterfaceClass with _MixinOnObject;
sealed class SealedExtendApplication = InterfaceClass with _MixinOnObject;
/// InterfaceClass can be implemented.
// Simple implementation.
class SimpleImplement implements InterfaceClass {}
base class BaseImplement implements InterfaceClass {}
interface class InterfaceImplement implements InterfaceClass {}
final class FinalImplement implements InterfaceClass {}
// Implementing with a sealed class.
sealed class SealedImplement implements InterfaceClass {}
// Extending through a sealed class.
class SimpleSealedImplementExtend extends SealedImplement {}
base class BaseSealedImplementExtend extends SealedImplement {}
interface class InterfaceSealedImplementExtend extends SealedImplement {}
final class FinalSealedImplementExtend extends SealedImplement {}
sealed class SealedSealedImplementExtend extends SealedImplement {}
// Implementing through a sealed class.
class SimpleSealedImplementImplement implements SealedImplement {}
base class BaseSealedImplementImplement implements SealedImplement {}
interface class InterfaceSealedImplementImplement implements SealedImplement {}
final class FinalSealedImplementImplement implements SealedImplement {}
sealed class SealedSealedImplementImplement implements SealedImplement {}
// Implementing with a mixin class.
mixin class SimpleMixinClassImplement implements InterfaceClass {}
base mixin class BaseMixinClassImplement implements InterfaceClass {}
// Implementing by applying a mixin class.
class SimpleMixinClassImplementApplied extends Object
with SimpleMixinClassImplement {}
base class BaseMixinClassImplementApplied extends Object
with SimpleMixinClassImplement {}
interface class InterfaceMixinClassImplementApplied extends Object
with SimpleMixinClassImplement {}
final class FinalMixinClassImplementApplied extends Object
with SimpleMixinClassImplement {}
sealed class SealedMixinClassImplementApplied extends Object
with SimpleMixinClassImplement {}
// Implementing with a mixin application class.
class SimpleImplementApplication = Object
with _MixinOnObject
implements InterfaceClass;
base class BaseImplementApplication = Object
with _MixinOnObject
implements InterfaceClass;
interface class InterfaceImplementApplication = Object
with _MixinOnObject
implements InterfaceClass;
final class FinalImplementApplication = Object
with _MixinOnObject
implements InterfaceClass;
sealed class SealedImplementApplication = Object
with _MixinOnObject
implements InterfaceClass;
// Implementing with a mixin.
mixin SimpleMixinImplement implements InterfaceClass {}
base mixin BaseMixinImplement implements InterfaceClass {}
// Implementing by applying a mixin.
class SimpleMixinImplementApplied extends Object with SimpleMixinImplement {}
base class BaseMixinImplementApplied extends Object with SimpleMixinImplement {}
interface class InterfaceMixinImplementApplied extends Object
with SimpleMixinImplement {}
final class FinalMixinImplementApplied extends Object
with SimpleMixinImplement {}
sealed class SealedMixinImplementApplied extends Object
with SimpleMixinImplement {}
/// InterfaceClass can be an `on` type.
mixin SimpleMixinOn on InterfaceClass {}
base mixin BaseMixinOn on InterfaceClass {}
// 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'.