mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 10:18:13 +00:00
[cfe] Report error when using a class as a mixin when sealed-class is enabled.
From the changes in dart-lang/language#2674 that specify from a certain language version, we would like classes to not be used as mixins unless specified as a 'mixin class'. Currently, this behaviour is under the sealed-class flag. May be subject to change as the other modifiers are added, but I'd at least like to make sure this works for sealed classes. Change-Id: I5754b383327dde06d49175fe2d05c8ba7462145f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/273082 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Kallen Tu <kallentu@google.com>
This commit is contained in:
parent
70b994e54f
commit
6c9873bf42
|
@ -905,6 +905,27 @@ Message _withArgumentsCantReadFile(Uri uri_, String string) {
|
|||
arguments: {'uri': uri_, 'string': string});
|
||||
}
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const Template<Message Function(String name)> templateCantUseClassAsMixin =
|
||||
const Template<Message Function(String name)>(
|
||||
problemMessageTemplate: r"""Class '#name' can't be used as a mixin.""",
|
||||
withArguments: _withArgumentsCantUseClassAsMixin);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const Code<Message Function(String name)> codeCantUseClassAsMixin =
|
||||
const Code<Message Function(String name)>(
|
||||
"CantUseClassAsMixin",
|
||||
);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsCantUseClassAsMixin(String name) {
|
||||
if (name.isEmpty) throw 'No name provided';
|
||||
name = demangleMixinApplicationName(name);
|
||||
return new Message(codeCantUseClassAsMixin,
|
||||
problemMessage: """Class '${name}' can't be used as a mixin.""",
|
||||
arguments: {'name': name});
|
||||
}
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const Template<Message Function(Token token)>
|
||||
templateCantUseControlFlowOrSpreadAsConstant =
|
||||
|
|
|
@ -2069,44 +2069,60 @@ severity: $severity
|
|||
noLength);
|
||||
}
|
||||
} else if (supertype is ClassBuilder &&
|
||||
supertype.isSealed &&
|
||||
supertype.libraryBuilder.origin != cls.libraryBuilder.origin) {
|
||||
// If the class is a mixin declaration with an `on` clause which is the
|
||||
// supertype we are evaluating right now, we want to avoid reporting an
|
||||
// error.
|
||||
bool superTypeIsOnClause = false;
|
||||
if (cls.cls.isAnonymousMixin && !cls.cls.isEliminatedMixin) {
|
||||
// The class has multiple 'on' clauses.
|
||||
List<TypeBuilder>? classInterfaces = cls.interfaceBuilders;
|
||||
if (classInterfaces != null) {
|
||||
for (TypeBuilder interface in classInterfaces) {
|
||||
if (interface.declaration == supertype) {
|
||||
superTypeIsOnClause = true;
|
||||
break;
|
||||
cls.libraryBuilder.libraryFeatures.sealedClass.isEnabled) {
|
||||
// Check for implicit class mixins.
|
||||
TypeBuilder? mixedInType = cls.mixedInTypeBuilder;
|
||||
if (cls.isMixinApplication &&
|
||||
mixedInType != null &&
|
||||
mixedInType.declaration == supertype &&
|
||||
!supertype.isMixinDeclaration) {
|
||||
cls.addProblem(
|
||||
templateCantUseClassAsMixin
|
||||
.withArguments(supertype.fullNameForErrors),
|
||||
cls.charOffset,
|
||||
noLength);
|
||||
}
|
||||
|
||||
// Report error for subtyping outside of sealed supertype's library.
|
||||
if (supertype.isSealed &&
|
||||
supertype.libraryBuilder.origin != cls.libraryBuilder.origin) {
|
||||
// If the class is a mixin declaration with an `on` clause which is
|
||||
// the supertype we are evaluating right now, we want to avoid
|
||||
// reporting an error.
|
||||
bool superTypeIsOnClause = false;
|
||||
if (cls.cls.isAnonymousMixin && !cls.cls.isEliminatedMixin) {
|
||||
// The class has multiple 'on' clauses.
|
||||
List<TypeBuilder>? classInterfaces = cls.interfaceBuilders;
|
||||
if (classInterfaces != null) {
|
||||
for (TypeBuilder interface in classInterfaces) {
|
||||
if (interface.declaration == supertype) {
|
||||
superTypeIsOnClause = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (cls.isMixinDeclaration) {
|
||||
// The class has up to one 'on' clause.
|
||||
TypeBuilder? classSuperType = cls.supertypeBuilder;
|
||||
if (classSuperType != null &&
|
||||
classSuperType.declaration == supertype) {
|
||||
superTypeIsOnClause = true;
|
||||
}
|
||||
}
|
||||
} else if (cls.isMixinDeclaration) {
|
||||
// The class has up to one 'on' clause.
|
||||
TypeBuilder? classSuperType = cls.supertypeBuilder;
|
||||
if (classSuperType != null &&
|
||||
classSuperType.declaration == supertype) {
|
||||
superTypeIsOnClause = true;
|
||||
}
|
||||
}
|
||||
if (!superTypeIsOnClause) {
|
||||
if (supertype.isMixinDeclaration) {
|
||||
cls.addProblem(
|
||||
templateSealedMixinSubtypeOutsideOfLibrary
|
||||
.withArguments(supertype.fullNameForErrors),
|
||||
cls.charOffset,
|
||||
noLength);
|
||||
} else {
|
||||
cls.addProblem(
|
||||
templateSealedClassSubtypeOutsideOfLibrary
|
||||
.withArguments(supertype.fullNameForErrors),
|
||||
cls.charOffset,
|
||||
noLength);
|
||||
if (!superTypeIsOnClause) {
|
||||
if (supertype.isMixinDeclaration) {
|
||||
cls.addProblem(
|
||||
templateSealedMixinSubtypeOutsideOfLibrary
|
||||
.withArguments(supertype.fullNameForErrors),
|
||||
cls.charOffset,
|
||||
noLength);
|
||||
} else {
|
||||
cls.addProblem(
|
||||
templateSealedClassSubtypeOutsideOfLibrary
|
||||
.withArguments(supertype.fullNameForErrors),
|
||||
cls.charOffset,
|
||||
noLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,6 +64,7 @@ CantInferPackagesFromPackageUri/analyzerCode: Fail
|
|||
CantInferPackagesFromPackageUri/example: Fail
|
||||
CantInferTypeDueToCircularity/example: Fail
|
||||
CantReadFile/part_wrapped_script: Fail # Importing file in the (now) part.
|
||||
CantUseClassAsMixin/analyzerCode: Fail
|
||||
CantUseControlFlowOrSpreadAsConstant/example: Fail
|
||||
CantUseDeferredPrefixAsConstant/part_wrapped_script: Fail # Importing file in the (now) part.
|
||||
CantUsePrefixAsExpression/part_wrapped_script: Fail # Importing file in the (now) part.
|
||||
|
|
|
@ -6021,3 +6021,10 @@ SealedMixinSubtypeOutsideOfLibrary:
|
|||
class B with M {}
|
||||
lib.dart:
|
||||
sealed mixin M {}
|
||||
|
||||
CantUseClassAsMixin:
|
||||
problemMessage: "Class '#name' can't be used as a mixin."
|
||||
experiments: sealed-class
|
||||
script: |
|
||||
class A {}
|
||||
class B with A {}
|
||||
|
|
|
@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
|
|||
// class Class2 implements Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
|
|
|
@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
|
|||
// class Class2 implements Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
|
|
|
@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
|
|||
// class Class2 implements Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
|
|
|
@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
|
|||
// class Class2 implements Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
|
|
|
@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
|
|||
// class Class2 implements Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
|
|
|
@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
|
|||
// class Class2 implements Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
|
||||
// class Class3 with Sealed {}
|
||||
// ^
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
// 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.
|
||||
|
||||
sealed class SealedClass {}
|
||||
class A with SealedClass {}
|
||||
|
||||
sealed mixin SealedMixin {}
|
||||
class B with SealedClass, SealedMixin {}
|
||||
|
||||
class Class {}
|
||||
class C with Class, SealedClass {}
|
||||
class D with Class, SealedMixin {}
|
||||
|
||||
mixin Mixin {}
|
||||
class E with Mixin, SealedClass {}
|
||||
class F with Mixin, SealedMixin {}
|
||||
|
||||
// TODO(kallentu): Move this to a more generic test.
|
||||
class G with Class, Mixin {}
|
|
@ -0,0 +1,149 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class A with SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class B with SealedClass, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class D with Class, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class E with Mixin, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class G with Class, Mixin {}
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract sealed class SealedClass extends core::Object {
|
||||
synthetic constructor •() → self::SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_A&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class A extends self::_A&Object&SealedClass {
|
||||
synthetic constructor •() → self::A
|
||||
: super self::_A&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
|
||||
: super self::_B&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
class B extends self::_B&Object&SealedClass&SealedMixin {
|
||||
synthetic constructor •() → self::B
|
||||
: super self::_B&Object&SealedClass&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class&SealedClass
|
||||
: super self::_C&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class C extends self::_C&Object&Class&SealedClass {
|
||||
synthetic constructor •() → self::C
|
||||
: super self::_C&Object&Class&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
|
||||
: super self::_D&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class D extends self::_D&Object&Class&SealedMixin {
|
||||
synthetic constructor •() → self::D
|
||||
: super self::_D&Object&Class&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
|
||||
: super self::_E&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class E extends self::_E&Object&Mixin&SealedClass {
|
||||
synthetic constructor •() → self::E
|
||||
: super self::_E&Object&Mixin&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
|
||||
: super self::_F&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class F extends self::_F&Object&Mixin&SealedMixin {
|
||||
synthetic constructor •() → self::F
|
||||
: super self::_F&Object&Mixin&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class&Mixin
|
||||
: super self::_G&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class G extends self::_G&Object&Class&Mixin {
|
||||
synthetic constructor •() → self::G
|
||||
: super self::_G&Object&Class&Mixin::•()
|
||||
;
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class A with SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class B with SealedClass, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class D with Class, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class E with Mixin, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class G with Class, Mixin {}
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract sealed class SealedClass extends core::Object {
|
||||
synthetic constructor •() → self::SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _A&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_A&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class A extends self::_A&Object&SealedClass {
|
||||
synthetic constructor •() → self::A
|
||||
: super self::_A&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _B&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _B&Object&SealedClass&SealedMixin extends self::_B&Object&SealedClass implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
|
||||
: super self::_B&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
class B extends self::_B&Object&SealedClass&SealedMixin {
|
||||
synthetic constructor •() → self::B
|
||||
: super self::_B&Object&SealedClass&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class&SealedClass extends self::_C&Object&Class implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class&SealedClass
|
||||
: super self::_C&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class C extends self::_C&Object&Class&SealedClass {
|
||||
synthetic constructor •() → self::C
|
||||
: super self::_C&Object&Class&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class&SealedMixin extends self::_D&Object&Class implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
|
||||
: super self::_D&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class D extends self::_D&Object&Class&SealedMixin {
|
||||
synthetic constructor •() → self::D
|
||||
: super self::_D&Object&Class&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _E&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _E&Object&Mixin&SealedClass extends self::_E&Object&Mixin implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
|
||||
: super self::_E&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class E extends self::_E&Object&Mixin&SealedClass {
|
||||
synthetic constructor •() → self::E
|
||||
: super self::_E&Object&Mixin&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin&SealedMixin extends self::_F&Object&Mixin implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
|
||||
: super self::_F&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class F extends self::_F&Object&Mixin&SealedMixin {
|
||||
synthetic constructor •() → self::F
|
||||
: super self::_F&Object&Mixin&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class&Mixin extends self::_G&Object&Class implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class&Mixin
|
||||
: super self::_G&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class G extends self::_G&Object&Class&Mixin {
|
||||
synthetic constructor •() → self::G
|
||||
: super self::_G&Object&Class&Mixin::•()
|
||||
;
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
sealed
|
||||
class SealedClass {}
|
||||
class A with SealedClass {}
|
||||
sealed
|
||||
mixin SealedMixin {}
|
||||
class B with SealedClass, SealedMixin {}
|
||||
class Class {}
|
||||
class C with Class, SealedClass {}
|
||||
class D with Class, SealedMixin {}
|
||||
mixin Mixin {}
|
||||
class E with Mixin, SealedClass {}
|
||||
class F with Mixin, SealedMixin {}
|
||||
class G with Class, Mixin {}
|
|
@ -0,0 +1,149 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class A with SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class B with SealedClass, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class D with Class, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class E with Mixin, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class G with Class, Mixin {}
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract sealed class SealedClass extends core::Object {
|
||||
synthetic constructor •() → self::SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_A&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class A extends self::_A&Object&SealedClass {
|
||||
synthetic constructor •() → self::A
|
||||
: super self::_A&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
|
||||
: super self::_B&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
class B extends self::_B&Object&SealedClass&SealedMixin {
|
||||
synthetic constructor •() → self::B
|
||||
: super self::_B&Object&SealedClass&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class&SealedClass
|
||||
: super self::_C&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class C extends self::_C&Object&Class&SealedClass {
|
||||
synthetic constructor •() → self::C
|
||||
: super self::_C&Object&Class&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
|
||||
: super self::_D&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class D extends self::_D&Object&Class&SealedMixin {
|
||||
synthetic constructor •() → self::D
|
||||
: super self::_D&Object&Class&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
|
||||
: super self::_E&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class E extends self::_E&Object&Mixin&SealedClass {
|
||||
synthetic constructor •() → self::E
|
||||
: super self::_E&Object&Mixin&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
|
||||
: super self::_F&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class F extends self::_F&Object&Mixin&SealedMixin {
|
||||
synthetic constructor •() → self::F
|
||||
: super self::_F&Object&Mixin&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class&Mixin
|
||||
: super self::_G&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class G extends self::_G&Object&Class&Mixin {
|
||||
synthetic constructor •() → self::G
|
||||
: super self::_G&Object&Class&Mixin::•()
|
||||
;
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class A with SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class B with SealedClass, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class D with Class, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class E with Mixin, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class G with Class, Mixin {}
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract sealed class SealedClass extends core::Object {
|
||||
synthetic constructor •() → self::SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_A&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class A extends self::_A&Object&SealedClass {
|
||||
synthetic constructor •() → self::A
|
||||
: super self::_A&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
|
||||
: super self::_B&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
class B extends self::_B&Object&SealedClass&SealedMixin {
|
||||
synthetic constructor •() → self::B
|
||||
: super self::_B&Object&SealedClass&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class&SealedClass
|
||||
: super self::_C&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class C extends self::_C&Object&Class&SealedClass {
|
||||
synthetic constructor •() → self::C
|
||||
: super self::_C&Object&Class&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
|
||||
: super self::_D&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class D extends self::_D&Object&Class&SealedMixin {
|
||||
synthetic constructor •() → self::D
|
||||
: super self::_D&Object&Class&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
|
||||
: super self::_E&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class E extends self::_E&Object&Mixin&SealedClass {
|
||||
synthetic constructor •() → self::E
|
||||
: super self::_E&Object&Mixin&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
|
||||
: super self::_F&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class F extends self::_F&Object&Mixin&SealedMixin {
|
||||
synthetic constructor •() → self::F
|
||||
: super self::_F&Object&Mixin&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class&Mixin
|
||||
: super self::_G&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class G extends self::_G&Object&Class&Mixin {
|
||||
synthetic constructor •() → self::G
|
||||
: super self::_G&Object&Class&Mixin::•()
|
||||
;
|
||||
}
|
|
@ -0,0 +1,140 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class A with SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class B with SealedClass, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class D with Class, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class E with Mixin, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class G with Class, Mixin {}
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract sealed class SealedClass extends core::Object {
|
||||
synthetic constructor •() → self::SealedClass
|
||||
;
|
||||
}
|
||||
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_A&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class A extends self::_A&Object&SealedClass {
|
||||
synthetic constructor •() → self::A
|
||||
;
|
||||
}
|
||||
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
|
||||
: super self::_B&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
class B extends self::_B&Object&SealedClass&SealedMixin {
|
||||
synthetic constructor •() → self::B
|
||||
;
|
||||
}
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class&SealedClass
|
||||
: super self::_C&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class C extends self::_C&Object&Class&SealedClass {
|
||||
synthetic constructor •() → self::C
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
|
||||
: super self::_D&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class D extends self::_D&Object&Class&SealedMixin {
|
||||
synthetic constructor •() → self::D
|
||||
;
|
||||
}
|
||||
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
|
||||
: super self::_E&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class E extends self::_E&Object&Mixin&SealedClass {
|
||||
synthetic constructor •() → self::E
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
|
||||
: super self::_F&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class F extends self::_F&Object&Mixin&SealedMixin {
|
||||
synthetic constructor •() → self::F
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class&Mixin
|
||||
: super self::_G&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class G extends self::_G&Object&Class&Mixin {
|
||||
synthetic constructor •() → self::G
|
||||
;
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class A with SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class B with SealedClass, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class C with Class, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class D with Class, SealedMixin {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
|
||||
// class E with Mixin, SealedClass {}
|
||||
// ^
|
||||
//
|
||||
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
|
||||
// class G with Class, Mixin {}
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
abstract sealed class SealedClass extends core::Object {
|
||||
synthetic constructor •() → self::SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _A&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_A&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class A extends self::_A&Object&SealedClass {
|
||||
synthetic constructor •() → self::A
|
||||
: super self::_A&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _B&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _B&Object&SealedClass&SealedMixin extends self::_B&Object&SealedClass implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
|
||||
: super self::_B&Object&SealedClass::•()
|
||||
;
|
||||
}
|
||||
class B extends self::_B&Object&SealedClass&SealedMixin {
|
||||
synthetic constructor •() → self::B
|
||||
: super self::_B&Object&SealedClass&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _C&Object&Class&SealedClass extends self::_C&Object&Class implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_C&Object&Class&SealedClass
|
||||
: super self::_C&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class C extends self::_C&Object&Class&SealedClass {
|
||||
synthetic constructor •() → self::C
|
||||
: super self::_C&Object&Class&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _D&Object&Class&SealedMixin extends self::_D&Object&Class implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
|
||||
: super self::_D&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class D extends self::_D&Object&Class&SealedMixin {
|
||||
synthetic constructor •() → self::D
|
||||
: super self::_D&Object&Class&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
|
||||
}
|
||||
abstract class _E&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _E&Object&Mixin&SealedClass extends self::_E&Object&Mixin implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
|
||||
: super self::_E&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class E extends self::_E&Object&Mixin&SealedClass {
|
||||
synthetic constructor •() → self::E
|
||||
: super self::_E&Object&Mixin&SealedClass::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _F&Object&Mixin&SealedMixin extends self::_F&Object&Mixin implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
|
||||
: super self::_F&Object&Mixin::•()
|
||||
;
|
||||
}
|
||||
class F extends self::_F&Object&Mixin&SealedMixin {
|
||||
synthetic constructor •() → self::F
|
||||
: super self::_F&Object&Mixin&SealedMixin::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
abstract class _G&Object&Class&Mixin extends self::_G&Object&Class implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
|
||||
const synthetic constructor •() → self::_G&Object&Class&Mixin
|
||||
: super self::_G&Object&Class::•()
|
||||
;
|
||||
}
|
||||
class G extends self::_G&Object&Class&Mixin {
|
||||
synthetic constructor •() → self::G
|
||||
: super self::_G&Object&Class&Mixin::•()
|
||||
;
|
||||
}
|
|
@ -202,6 +202,7 @@ regress/issue_39091_1: FormatterCrash
|
|||
regress/issue_41265.crash: Crash
|
||||
regress/issue_41265.crash: FormatterCrash
|
||||
sealed_class/sealed_abstract_class_declaration: FormatterCrash
|
||||
sealed_class/sealed_class_as_mixin: FormatterCrash
|
||||
sealed_class/sealed_class_declaration: FormatterCrash
|
||||
sealed_class/sealed_mixin_declaration: FormatterCrash
|
||||
super_parameters/issue47741: FormatterCrash
|
||||
|
|
|
@ -6,16 +6,18 @@
|
|||
|
||||
// Error when attempting to mix in a sealed class outside of library.
|
||||
|
||||
import 'sealed_class_as_mixin_in_lib_error_test.dart';
|
||||
import 'sealed_class_as_mixin_lib.dart';
|
||||
|
||||
abstract class OutsideA with SealedClass {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
|
||||
|
||||
class OutsideB with SealedClass {
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
|
||||
@override
|
||||
int foo = 2;
|
||||
|
@ -27,4 +29,29 @@ class OutsideB with SealedClass {
|
|||
abstract class OutsideC = Object with SealedClass;
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
|
||||
|
||||
abstract class OutsideD with SealedClass, Class {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'Class' can't be used as a mixin.
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
|
||||
|
||||
class OutsideE with Class, SealedMixin {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'Class' can't be used as a mixin.
|
||||
// [cfe] Sealed mixin 'SealedMixin' can't be mixed in outside of its library.
|
||||
|
||||
abstract class OutsideF with Mixin, SealedClass {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
|
||||
|
||||
class OutsideG with Mixin, Class {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'Class' can't be used as a mixin.
|
||||
|
|
|
@ -12,16 +12,19 @@ sealed class SealedClass {
|
|||
int nonAbstractBar(int value) => value + 100;
|
||||
int bar(int value);
|
||||
}
|
||||
sealed mixin SealedMixin {}
|
||||
class Class {}
|
||||
mixin Mixin {}
|
||||
|
||||
abstract class A with SealedClass {}
|
||||
// ^
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
|
||||
class B with SealedClass {
|
||||
// ^
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
@override
|
||||
int nonAbstractFoo = 100;
|
||||
|
||||
|
@ -33,6 +36,27 @@ class B with SealedClass {
|
|||
}
|
||||
|
||||
abstract class C = Object with SealedClass;
|
||||
// ^
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
|
||||
abstract class D with SealedClass, Class {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'Class' can't be used as a mixin.
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
|
||||
class E with Class, SealedMixin {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'Class' can't be used as a mixin.
|
||||
|
||||
abstract class F with Mixin, SealedClass {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'SealedClass' can't be used as a mixin.
|
||||
|
||||
class G with Mixin, Class {}
|
||||
// ^
|
||||
// [analyzer] unspecified
|
||||
// [cfe] Class 'Class' can't be used as a mixin.
|
||||
|
|
15
tests/language/sealed_class/sealed_class_as_mixin_lib.dart
Normal file
15
tests/language/sealed_class/sealed_class_as_mixin_lib.dart
Normal file
|
@ -0,0 +1,15 @@
|
|||
// 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.
|
||||
|
||||
// SharedOptions=--enable-experiment=sealed-class
|
||||
|
||||
sealed class SealedClass {
|
||||
int nonAbstractFoo = 0;
|
||||
abstract int foo;
|
||||
int nonAbstractBar(int value) => value + 100;
|
||||
int bar(int value);
|
||||
}
|
||||
sealed mixin SealedMixin {}
|
||||
class Class {}
|
||||
mixin Mixin {}
|
Loading…
Reference in a new issue