[analyzer] Disallow classes to be used as mixins even inside the library.

Change-Id: I62aaf972a16cdd678f5711a41dc1652b89d0be37
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/283131
Commit-Queue: Kallen Tu <kallentu@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Kallen Tu 2023-02-21 19:32:44 +00:00 committed by Commit Queue
parent 57107ae59b
commit 16b1c12619
44 changed files with 462 additions and 299 deletions

View file

@ -1836,10 +1836,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
}
/// Verify that if a class is being mixed in and class modifiers are enabled
/// in that class' library, then the mixin application must be in the same
/// library as that class declaration.
///
/// No error is emitted if the class being mixed in is a mixin class.
/// in that class' library, then it must be a mixin class.
///
/// See [CompileTimeErrorCode.CLASS_USED_AS_MIXIN].
void _checkForClassUsedAsMixin(WithClause? withClause) {
@ -1850,7 +1847,6 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
final withElement = withType.element;
if (withElement is ClassElementImpl &&
!withElement.isMixinClass &&
withElement.library != _currentLibrary &&
withElement.library.featureSet
.isEnabled(Feature.class_modifiers)) {
errorReporter.reportErrorForNode(

View file

@ -5847,7 +5847,7 @@ CompileTimeErrorCode:
in both the `extends` and `with` clauses for the class `B`:
```dart
class A {}
mixin class A {}
class B extends A with [!A!] {}
```
@ -8834,6 +8834,7 @@ CompileTimeErrorCode:
defines a constructor, is being used as a mixin:
```dart
//@dart=2.19
class A {
A();
}
@ -8856,6 +8857,7 @@ CompileTimeErrorCode:
then do so:
```dart
//@dart=2.19
class A {
}
@ -8890,6 +8892,7 @@ CompileTimeErrorCode:
extends `A`, is being used as a mixin by `C`:
```dart
//@dart=2.19
class A {}
class B extends A {}
@ -8903,6 +8906,7 @@ CompileTimeErrorCode:
change it:
```dart
//@dart=2.19
class A {}
class B {}

View file

@ -121,6 +121,24 @@ class A<E> extends B<E> implements D<E> {
''');
}
test_mixinDeclaresConstructor() async {
await assertNoErrorsInCode(r'''
mixin class A {
m() {}
}
class B extends Object with A {}
''');
}
test_mixinDeclaresConstructor_factory() async {
await assertNoErrorsInCode(r'''
mixin class A {
factory A() => throw 0;
}
class B extends Object with A {}
''');
}
test_no_call_tearoff_on_promoted_var() async {
await assertNoErrorsInCode('''
class B {
@ -782,7 +800,7 @@ f() {
class C = D with E;
class D {}
class E {}
mixin E {}
''');
CompilationUnit unit = result.unit;
ClassElement classC = unit.declaredElement!.getClass('C')!;
@ -2050,7 +2068,7 @@ class C implements B {
test_invalidOverrideReturnType_returnType_mixin() async {
await assertNoErrorsInCode(r'''
class A {
mixin A {
num m() { return 0; }
}
class B extends Object with A {
@ -2387,24 +2405,6 @@ class C {
''');
}
test_mixinDeclaresConstructor() async {
await assertNoErrorsInCode(r'''
class A {
m() {}
}
class B extends Object with A {}
''');
}
test_mixinDeclaresConstructor_factory() async {
await assertNoErrorsInCode(r'''
class A {
factory A() => throw 0;
}
class B extends Object with A {}
''');
}
test_multipleSuperInitializers_no() async {
await assertNoErrorsInCode(r'''
class A {}
@ -3322,6 +3322,24 @@ main(p) {
]);
}
test_mixinDeclaresConstructor() async {
await assertNoErrorsInCode(r'''
class A {
m() {}
}
class B extends Object with A {}
''');
}
test_mixinDeclaresConstructor_factory() async {
await assertNoErrorsInCode(r'''
class A {
factory A() => throw 0;
}
class B extends Object with A {}
''');
}
test_typePromotion_conditional_issue14655() async {
await assertNoErrorsInCode(r'''
class A {}

View file

@ -575,10 +575,10 @@ class A {
test_getter_fromMixins_bare_identifier() async {
await assertNoErrorsInCode('''
class B {}
class M1 {
mixin M1 {
get x => null;
}
class M2 {
mixin M2 {
get x => null;
}
class C extends B with M1, M2 {
@ -600,10 +600,10 @@ class C extends B with M1, M2 {
test_getter_fromMixins_property_access() async {
await assertErrorsInCode('''
class B {}
class M1 {
mixin M1 {
get x => null;
}
class M2 {
mixin M2 {
get x => null;
}
class C extends B with M1, M2 {}
@ -808,7 +808,7 @@ class C = Object with A;''', [
test_isValidMixin_factoryConstructor() async {
await assertNoErrorsInCode(r'''
class A {
mixin class A {
factory A() => throw 0;
}
class C = Object with A;''');
@ -820,7 +820,7 @@ class C = Object with A;''');
test_isValidMixin_super_toString() async {
await assertNoErrorsInCode(r'''
class A {
mixin class A {
toString() {
return super.toString();
}
@ -834,7 +834,7 @@ class C = Object with A;''');
test_isValidMixin_valid() async {
await assertNoErrorsInCode('''
class A {}
mixin class A {}
class C = Object with A;''');
verifyTestResolved();
@ -905,7 +905,7 @@ const A = null;
const A = null;
@A class C<A> = D with E;
class D {}
class E {}
mixin E {}
''');
verifyTestResolved();
@ -1169,7 +1169,7 @@ const A = null;
class B {
bar() => 1;
}
class A {
mixin class A {
foo() => 2;
}
@ -1183,10 +1183,10 @@ class C extends B with A {
test_method_fromMixins() async {
await assertNoErrorsInCode('''
class B {}
class M1 {
mixin M1 {
void f() {}
}
class M2 {
mixin M2 {
void f() {}
}
class C extends B with M1, M2 {}
@ -1205,10 +1205,10 @@ void main() {
test_method_fromMixins_bare_identifier() async {
await assertNoErrorsInCode('''
class B {}
class M1 {
mixin M1 {
void f() {}
}
class M2 {
mixin M2 {
void f() {}
}
class C extends B with M1, M2 {
@ -1228,10 +1228,10 @@ class C extends B with M1, M2 {
test_method_fromMixins_invoked_from_outside_class() async {
await assertNoErrorsInCode('''
class B {}
class M1 {
mixin M1 {
void f() {}
}
class M2 {
mixin M2 {
void f() {}
}
class C extends B with M1, M2 {}
@ -1249,7 +1249,7 @@ void main() {
test_method_fromSuperclassMixin() async {
await assertNoErrorsInCode(r'''
class A {
mixin A {
void m1() {}
}
class B extends Object with A {

View file

@ -417,7 +417,7 @@ f(A<V> p) {
test_typePromotion_if_with_notMoreSpecific_dynamic() async {
await assertErrorsInCode(r'''
class V {}
class A<T> {}
mixin A<T> {}
class B<S> extends Object with A<S> {
var b;
}

View file

@ -1530,12 +1530,12 @@ AssignmentExpression
test_propertyAccess_instance_fromMixins_compound() async {
await assertNoErrorsInCode('''
class M1 {
mixin M1 {
int get x => 0;
set x(num _) {}
}
class M2 {
mixin M2 {
int get x => 0;
set x(num _) {}
}
@ -1572,9 +1572,9 @@ AssignmentExpression
literal: 2
parameter: dart:core::@class::num::@method::+::@parameter::other
staticType: int
readElement: self::@class::M2::@getter::x
readElement: self::@mixin::M2::@getter::x
readType: int
writeElement: self::@class::M2::@setter::x
writeElement: self::@mixin::M2::@setter::x
writeType: num
staticElement: dart:core::@class::num::@method::+
staticType: int
@ -3743,12 +3743,12 @@ AssignmentExpression
test_simpleIdentifier_thisGetter_thisSetter_fromMixins_compound() async {
await assertNoErrorsInCode('''
class M1 {
mixin M1 {
int get x => 0;
set x(num _) {}
}
class M2 {
mixin M2 {
int get x => 0;
set x(num _) {}
}
@ -3773,9 +3773,9 @@ AssignmentExpression
literal: 2
parameter: dart:core::@class::num::@method::+::@parameter::other
staticType: int
readElement: self::@class::M2::@getter::x
readElement: self::@mixin::M2::@getter::x
readType: int
writeElement: self::@class::M2::@setter::x
writeElement: self::@mixin::M2::@setter::x
writeType: num
staticElement: dart:core::@class::num::@method::+
staticType: int

View file

@ -18,7 +18,7 @@ class ClassAliasDriverResolutionTest extends PubPackageResolutionTest {
test_defaultConstructor() async {
await assertNoErrorsInCode(r'''
class A {}
class M {}
mixin class M {}
class X = A with M;
''');
assertConstructors(findElement.class_('X'), ['X X()']);
@ -27,7 +27,7 @@ class X = A with M;
test_element() async {
await assertNoErrorsInCode(r'''
class A {}
class B {}
mixin class B {}
class C {}
class X = A with B implements C;
@ -46,7 +46,7 @@ class X = A with B implements C;
test_element_typeFunction_extends() async {
await assertNoErrorsInCode(r'''
class A {}
mixin class A {}
class X = Function with A;
''');
var x = findElement.class_('X');
@ -55,7 +55,7 @@ class X = Function with A;
test_element_typeFunction_implements() async {
await assertNoErrorsInCode(r'''
class A {}
mixin class A {}
class B {}
class X = Object with A implements A, Function, B;
''');
@ -65,8 +65,8 @@ class X = Object with A implements A, Function, B;
test_element_typeFunction_with() async {
await assertNoErrorsInCode(r'''
class A {}
class B {}
mixin class A {}
mixin class B {}
class X = Object with A, Function, B;
''');
var x = findElement.class_('X');
@ -79,7 +79,7 @@ class A {
const A();
}
class M {}
mixin M {}
class C = A with M;
@ -93,7 +93,7 @@ class A {
const A();
}
class M {
mixin M {
int i = 0;
}
@ -101,9 +101,9 @@ class C = A with M;
const x = const C();
''', [
error(CompileTimeErrorCode.CONST_WITH_NON_CONST, 83, 5),
error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 83,
5),
error(CompileTimeErrorCode.CONST_WITH_NON_CONST, 83, 5),
]);
}
@ -113,7 +113,7 @@ class A {
const A();
}
class M {
mixin M {
int get i => 0;
}
@ -129,7 +129,7 @@ class A {
const A();
}
class M {
mixin M {
set(int i) {}
}
@ -144,8 +144,8 @@ const x = const C();
class A {
A(int i);
}
class M1 {}
class M2 {}
mixin class M1 {}
mixin class M2 {}
class C2 = C1 with M2;
class C1 = A with M1;
@ -163,7 +163,7 @@ class A {
A.c3(int a, {int? b, int c = 0});
}
class M {}
mixin M {}
class C = A with M;
''');
@ -184,7 +184,7 @@ class A<T extends num> {
A(T x, T y);
}
class M {}
mixin M {}
class B<E extends num> = A<E> with M;
''');

View file

@ -18,8 +18,8 @@ class ClassDriverResolutionTest extends PubPackageResolutionTest {
test_element_allSupertypes() async {
await assertNoErrorsInCode(r'''
class A {}
class B {}
class C {}
mixin B {}
mixin C {}
class D {}
class E {}
@ -108,8 +108,8 @@ class A extends Function {}
test_element_typeFunction_with() async {
await assertErrorsInCode(r'''
class A {}
class B {}
mixin A {}
mixin B {}
class C extends Object with A, Function, B {}
''', [
error(WarningCode.DEPRECATED_MIXIN_FUNCTION, 53, 8),

View file

@ -1368,7 +1368,7 @@ class B<T> = A<T> with M;
class C<T> = D with E;
class D {}
class E {}
mixin E {}
''');
var annotation = findNode.annotation('@B');

View file

@ -21,7 +21,7 @@ main() {
class NonNullableTest extends PubPackageResolutionTest {
test_class_hierarchy() async {
await assertNoErrorsInCode('''
class A {}
mixin class A {}
class X1 extends A {} // 1
class X2 implements A {} // 2
@ -36,7 +36,7 @@ class X3 with A {} // 3
test_classTypeAlias_hierarchy() async {
await assertNoErrorsInCode('''
class A {}
class B {}
mixin B {}
class C {}
class X = A with B implements C;

View file

@ -58,7 +58,7 @@ MethodInvocation
await assertNoErrorsInCode('''
class A {}
class M {
mixin M {
void foo() {}
}
@ -80,7 +80,7 @@ MethodInvocation
operator: .
methodName: SimpleIdentifier
token: foo
staticElement: self::@class::M::@method::foo
staticElement: self::@mixin::M::@method::foo
staticType: void Function()
argumentList: ArgumentList
leftParenthesis: (
@ -92,7 +92,7 @@ MethodInvocation
test_methodInvocation_mixinHasNoSuchMethod() async {
await assertErrorsInCode('''
class A {
mixin A {
void foo();
noSuchMethod(im) => 42;
}
@ -114,7 +114,7 @@ MethodInvocation
operator: .
methodName: SimpleIdentifier
token: foo
staticElement: self::@class::A::@method::foo
staticElement: self::@mixin::A::@method::foo
staticType: void Function()
argumentList: ArgumentList
leftParenthesis: (
@ -171,7 +171,7 @@ class A {
void foo() {}
}
abstract class B {
mixin B {
void foo();
}
@ -315,7 +315,7 @@ mixin M implements A {
test_propertyAccess_getter_mixinHasNoSuchMethod() async {
await assertErrorsInCode('''
class A {
mixin A {
int get foo;
noSuchMethod(im) => 1;
}
@ -510,7 +510,7 @@ AssignmentExpression
test_propertyAccess_setter_mixinHasNoSuchMethod() async {
await assertErrorsInCode('''
class A {
mixin A {
set foo(int a);
noSuchMethod(im) {}
}
@ -540,12 +540,12 @@ AssignmentExpression
operator: =
rightHandSide: SimpleIdentifier
token: a
parameter: self::@class::A::@setter::foo::@parameter::a
parameter: self::@mixin::A::@setter::foo::@parameter::a
staticElement: self::@class::B::@setter::foo::@parameter::a
staticType: int
readElement: <null>
readType: null
writeElement: self::@class::A::@setter::foo
writeElement: self::@mixin::A::@setter::foo
writeType: int
staticElement: <null>
staticType: int

View file

@ -19,7 +19,7 @@ class BuiltInIdentifierAsTypedefNameTest extends PubPackageResolutionTest {
test_classTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
class B {}
mixin B {}
class as = A with B;
''', [
error(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, 28, 2),

View file

@ -16,10 +16,12 @@ main() {
@reflectiveTest
class ClassUsedAsMixinTest extends PubPackageResolutionTest {
test_inside() async {
await assertNoErrorsInCode(r'''
await assertErrorsInCode(r'''
class Foo {}
class Bar with Foo {}
''');
''', [
error(CompileTimeErrorCode.CLASS_USED_AS_MIXIN, 28, 3),
]);
}
test_inside_language219() async {

View file

@ -81,7 +81,7 @@ class C extends B implements A<int> {}
await assertErrorsInCode('''
class I<T> {}
class A implements I<int> {}
class B implements I<String> {}
mixin B implements I<String> {}
class C extends A with B {}
''', [
error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 81, 1),

View file

@ -222,7 +222,7 @@ abstract class B implements A {
test_inMixin_getter_getter() async {
await assertErrorsInCode(r'''
class A {
mixin A {
int get foo => 0;
}
class B extends Object with A {
@ -235,7 +235,7 @@ class B extends Object with A {
test_inMixin_getter_method() async {
await assertErrorsInCode(r'''
class A {
mixin A {
int get foo => 0;
}
class B extends Object with A {
@ -248,7 +248,7 @@ class B extends Object with A {
test_inMixin_getter_setter() async {
await assertErrorsInCode(r'''
class A {
mixin A {
set foo(_) {}
}
class B extends Object with A {
@ -261,7 +261,7 @@ class B extends Object with A {
test_inMixin_method_getter() async {
await assertErrorsInCode(r'''
class A {
mixin A {
int get foo => 0;
}
class B extends Object with A {
@ -274,7 +274,7 @@ class B extends Object with A {
test_inMixin_method_method() async {
await assertErrorsInCode(r'''
class A {
mixin A {
void foo() {}
}
class B extends Object with A {
@ -287,7 +287,7 @@ class B extends Object with A {
test_inMixin_method_setter() async {
await assertErrorsInCode(r'''
class A {
mixin A {
set foo(_) {}
}
class B extends Object with A {
@ -300,7 +300,7 @@ class B extends Object with A {
test_inMixin_setter_method() async {
await assertErrorsInCode(r'''
class A {
mixin A {
void foo() {}
}
class B extends Object with A {
@ -313,7 +313,7 @@ class B extends Object with A {
test_inMixin_setter_setter() async {
await assertErrorsInCode(r'''
class A {
mixin A {
set foo(_) {}
}
class B extends Object with A {

View file

@ -48,7 +48,7 @@ class B with A {
test_class_instance_final() async {
await assertErrorsInCode('''
class A {
mixin A {
final a = 0;
}
@ -63,7 +63,7 @@ class B extends Object with A {
test_class_instance_getter() async {
await assertNoErrorsInCode('''
class A {
mixin A {
int get a => 7;
}
@ -75,7 +75,7 @@ class B extends Object with A {
test_class_instance_setter() async {
await assertNoErrorsInCode('''
class A {
mixin A {
set a(int x) {}
}
@ -87,7 +87,7 @@ class B extends Object with A {
test_class_instanceField() async {
await assertErrorsInCode('''
class A {
mixin A {
var a;
}
@ -102,7 +102,7 @@ class B extends Object with A {
test_class_multipleInstanceFields() async {
await assertErrorsInCode('''
class A {
mixin A {
var a;
var b;
}
@ -118,7 +118,7 @@ class B extends Object with A {
test_class_noFields() async {
await assertNoErrorsInCode('''
class M {}
mixin M {}
class X extends Object with M {
const X();
@ -128,7 +128,7 @@ class X extends Object with M {
test_class_static() async {
await assertNoErrorsInCode('''
class M {
mixin M {
static final a = 0;
}

View file

@ -25,7 +25,7 @@ class A extends Object with Function {}
test_local() async {
await assertErrorsInCode('''
class Function {}
mixin Function {}
class A extends Object with Function {}
''', [
error(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME, 6, 8),

View file

@ -23,7 +23,7 @@ class A {}
await assertErrorsInCode('''
library root;
import 'lib1.dart' deferred as a;
class M {}
mixin M {}
class C = a.A with M;
''', [
error(CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS, 69, 3),

View file

@ -67,7 +67,7 @@ class B implements A {}
test_inClassTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
class M {}
mixin M {}
int B = 7;
class C = A with M implements B;
''', [

View file

@ -54,7 +54,7 @@ class B = A with M implements A;
test_classAlias_Object() async {
await assertErrorsInCode(r'''
class M {}
mixin M {}
class A = Object with M implements Object;
''', [
error(CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, 46, 6),

View file

@ -52,7 +52,7 @@ class S {
int get foo => 0;
}
class M {
mixin M {
int foo() => 0;
}
@ -69,11 +69,11 @@ class S {
int get foo => 0;
}
class M1 {
mixin M1 {
int foo() => 0;
}
class M2 {
mixin M2 {
int get foo => 0;
}

View file

@ -76,7 +76,7 @@ abstract class C implements A, B2 {}
test_class_parameterType_inheritedInInterface_andMixin() async {
await assertErrorsInCode(r'''
abstract class A {
mixin A {
void m(int i);
}
abstract class B {
@ -85,13 +85,13 @@ abstract class B {
abstract class B2 extends B {}
abstract class C extends Object with A implements B2 {}
''', [
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 125, 1),
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 116, 1),
]);
}
test_class_parameterType_inheritedInInterface_andMixinApplication() async {
await assertErrorsInCode(r'''
abstract class A {
mixin A {
void m(int i);
}
abstract class B {
@ -100,7 +100,7 @@ abstract class B {
abstract class B2 extends B {}
abstract class C = Object with A implements B2;
''', [
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 125, 1),
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 116, 1),
]);
}
@ -109,28 +109,28 @@ abstract class C = Object with A implements B2;
abstract class A {
void m(int i);
}
abstract class B {
mixin B {
void m(String s);
}
abstract class B2 extends Object with B {}
abstract class C implements A, B2 {}
''', [
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 137, 1),
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 128, 1),
]);
}
test_class_parameterType_mixedIntoInterface_andMixin() async {
await assertErrorsInCode(r'''
abstract class A {
mixin A {
void m(int i);
}
abstract class B {
mixin B {
void m(String s);
}
abstract class B2 extends Object with B {}
abstract class C extends Object with A implements B2 {}
''', [
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 137, 1),
error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 119, 1),
]);
}
@ -281,7 +281,7 @@ class C extends B implements I {
test_overrideWithDynamicParameterType_mixinAndInterface() async {
await assertNoErrorsInCode('''
class B {
mixin B {
void m(int i) {}
}

View file

@ -45,7 +45,7 @@ import 'package:meta/meta.dart';
abstract class A {}
abstract class B {}
mixin B {}
@sealed abstract class M = A with B;
''');

View file

@ -313,7 +313,7 @@ class Button extends State<Object> {
test_mixingIn() async {
await assertNoErrorsInCode(r'''
import 'package:meta/meta.dart';
class A {
mixin A {
@protected
void a(){ }
}

View file

@ -343,7 +343,7 @@ class C extends B {}
await assertErrorsInCode('''
import 'package:meta/meta.dart';
class A {
mixin A {
@mustBeOverridden
void m() {}
}

View file

@ -18,16 +18,37 @@ class MixinInheritsFromNotObjectTest extends PubPackageResolutionTest {
test_class_class_extends() async {
await assertErrorsInCode(r'''
class A {}
mixin class B extends A {}
class C extends Object with B {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 33, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 66, 1),
]);
}
test_class_class_extends_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends A {}
class C extends Object with B {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 60, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 74, 1),
]);
}
test_class_class_extends_Object() async {
await assertNoErrorsInCode(r'''
class A {}
mixin class B extends Object {}
class C extends Object with B {}
''');
}
test_class_class_extends_Object_language219() async {
await assertNoErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends Object {}
class C extends Object with B {}
''');
@ -35,33 +56,67 @@ class C extends Object with B {}
test_class_class_with() async {
await assertErrorsInCode(r'''
mixin class A {}
mixin class B extends Object with A {}
class C extends Object with B {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 46, 6),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 84, 1),
]);
}
test_class_class_with_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends Object with A {}
class C extends Object with B {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 72, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 86, 1),
]);
}
test_class_classTypeAlias_with() async {
await assertNoErrorsInCode(r'''
class A {}
class B = Object with A;
mixin class A {}
mixin class B = Object with A;
class C extends Object with B {}
''');
}
test_class_classTypeAlias_with2() async {
await assertErrorsInCode(r'''
mixin class A {}
mixin class B {}
mixin class C = Object with A, B;
class D extends Object with C {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 57, 9),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 96, 1),
]);
}
test_class_classTypeAlias_with2_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B {}
class C = Object with A, B;
class D extends Object with C {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 78, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 92, 1),
]);
}
test_class_classTypeAlias_with_language219() async {
await assertNoErrorsInCode(r'''
// @dart=2.19
class A {}
class B = Object with A;
class C extends Object with B {}
''');
}
test_class_mixin() async {
await assertNoErrorsInCode(r'''
class A {}
@ -73,42 +128,88 @@ class C extends A with B {}
test_classTypeAlias_class_extends() async {
await assertErrorsInCode(r'''
class A {}
mixin class B extends A {}
class C = Object with B;
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 33, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 60, 1),
]);
}
test_classTypeAlias_class_extends_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends A {}
class C = Object with B;
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 54, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 68, 1),
]);
}
test_classTypeAlias_class_with() async {
await assertErrorsInCode(r'''
mixin class A {}
mixin class B extends Object with A {}
class C = Object with B;
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 46, 6),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 78, 1),
]);
}
test_classTypeAlias_class_with_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends Object with A {}
class C = Object with B;
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 66, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 80, 1),
]);
}
test_classTypeAlias_classAlias_with() async {
await assertNoErrorsInCode(r'''
class A {}
class B = Object with A;
mixin class A {}
mixin class B = Object with A;
class C = Object with B;
''');
}
test_classTypeAlias_classAlias_with2() async {
await assertErrorsInCode(r'''
mixin class A {}
mixin class B {}
mixin class C = Object with A, B;
class D = Object with C;
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 57, 9),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 90, 1),
]);
}
test_classTypeAlias_classAlias_with2_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B {}
class C = Object with A, B;
class D = Object with C;
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 72, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 86, 1),
]);
}
test_classTypeAlias_classAlias_with_language219() async {
await assertNoErrorsInCode(r'''
// @dart=2.19
class A {}
class B = Object with A;
class C = Object with B;
''');
}
test_classTypeAlias_mixin() async {
await assertNoErrorsInCode(r'''
class A {}
@ -120,18 +221,43 @@ class C = A with B;
test_enum_class_extends() async {
await assertErrorsInCode(r'''
class A {}
mixin class B extends A {}
enum E with B {
v
}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 33, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 50, 1),
]);
}
test_enum_class_extends_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends A {}
enum E with B {
v
}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 44, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 58, 1),
]);
}
test_enum_class_extends_Object() async {
await assertNoErrorsInCode(r'''
class A {}
mixin class B extends Object {}
enum E with B {
v
}
''');
}
test_enum_class_extends_Object_language219() async {
await assertNoErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends Object {}
enum E with B {
v
@ -141,20 +267,34 @@ enum E with B {
test_enum_class_with() async {
await assertErrorsInCode(r'''
mixin class A {}
mixin class B extends Object with A {}
enum E with B {
v
}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 46, 6),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 68, 1),
]);
}
test_enum_class_with_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B extends Object with A {}
enum E with B {
v
}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 56, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 70, 1),
]);
}
test_enum_classTypeAlias_with() async {
await assertNoErrorsInCode(r'''
class A {}
class B = Object with A;
mixin class A {}
mixin class B = Object with A;
enum E with B {
v
}
@ -163,6 +303,20 @@ enum E with B {
test_enum_classTypeAlias_with2() async {
await assertErrorsInCode(r'''
mixin class A {}
mixin class B {}
class C = Object with A, B;
enum E with C {
v
}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 74, 1),
]);
}
test_enum_classTypeAlias_with2_language219() async {
await assertErrorsInCode(r'''
// @dart=2.19
class A {}
class B {}
class C = Object with A, B;
@ -170,16 +324,27 @@ enum E with C {
v
}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 62, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 76, 1),
]);
}
test_enum_classTypeAlias_with_language219() async {
await assertNoErrorsInCode(r'''
// @dart=2.19
class A {}
class B = Object with A;
enum E with B {
v
}
''');
}
test_mixinClass_class_extends() async {
await assertErrorsInCode(r'''
class A {}
mixin class A {}
mixin class B extends A {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 33, 1),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 39, 1),
]);
}
@ -191,36 +356,36 @@ mixin class A extends Object {}
test_mixinClass_class_extends_Object_with() async {
await assertErrorsInCode(r'''
class A {}
mixin class A {}
mixin class B extends Object with A {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 40, 6),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 46, 6),
]);
}
test_mixinClass_class_with() async {
await assertErrorsInCode(r'''
class A {}
mixin class A {}
mixin class B with A {}
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 25, 6),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 31, 6),
]);
}
test_mixinClass_classTypeAlias_with() async {
await assertNoErrorsInCode(r'''
class A {}
mixin class A {}
mixin class B = Object with A;
''');
}
test_mixinClass_classTypeAlias_with2() async {
await assertErrorsInCode(r'''
class A {}
class B {}
mixin class A {}
mixin class B {}
mixin class C = Object with A, B;
''', [
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 45, 9),
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 57, 9),
]);
}
}

View file

@ -18,7 +18,7 @@ class MixinOfTypeAliasExpandsToTypeParameterTest
extends PubPackageResolutionTest {
test_class() async {
await assertNoErrorsInCode(r'''
class A {}
mixin A {}
typedef T = A;
class B with A {}
''');
@ -26,7 +26,7 @@ class B with A {}
test_class_noTypeArguments() async {
await assertErrorsInCode(r'''
class A {}
mixin A {}
typedef T<X extends A> = X;
class B with T {}
''', [
@ -37,7 +37,7 @@ class B with T {}
test_class_withTypeArguments() async {
await assertErrorsInCode(r'''
class A {}
mixin A {}
typedef T<X extends A> = X;
class B with T<A> {}
''', [

View file

@ -18,7 +18,7 @@ class MixinWithNonClassSuperclassTest extends PubPackageResolutionTest {
test_class() async {
await assertErrorsInCode(r'''
int A = 0;
class B {}
mixin B {}
class C extends A with B {}
''', [
error(CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS, 38, 1),
@ -28,7 +28,7 @@ class C extends A with B {}
test_mixinApplication() async {
await assertErrorsInCode(r'''
int A = 0;
class B {}
mixin B {}
class C = A with B;
''', [
error(CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS, 32, 1),

View file

@ -17,39 +17,39 @@ main() {
class MixinsSuperClassTest extends PubPackageResolutionTest {
test_class() async {
await assertErrorsInCode(r'''
class A {}
mixin class A {}
class B extends A with A {}
''', [
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 34, 1),
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 40, 1),
]);
}
test_class_viaTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
mixin class A {}
typedef B = A;
class C extends A with B {}
''', [
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 49, 1),
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 55, 1),
]);
}
test_classAlias() async {
await assertErrorsInCode(r'''
class A {}
mixin class A {}
class B = A with A;
''', [
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 28, 1),
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 34, 1),
]);
}
test_classAlias_viaTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
mixin class A {}
typedef B = A;
class C = A with B;
''', [
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 43, 1),
error(CompileTimeErrorCode.MIXINS_SUPER_CLASS, 49, 1),
]);
}
}

View file

@ -73,7 +73,7 @@ class A {
import 'package:meta/meta.dart';
@immutable
class A {}
class B {
mixin B {
int x = 0;
}
class C extends A with B {}
@ -87,7 +87,7 @@ class C extends A with B {}
import 'package:meta/meta.dart';
@immutable
class A {}
class B {
mixin B {
int x = 0;
}
class C = A with B;
@ -102,7 +102,7 @@ import 'package:meta/meta.dart';
class A {
int x = 0;
}
class B {}
mixin B {}
@immutable
class C = A with B;
''', [

View file

@ -268,7 +268,7 @@ class C implements A {
test_fromMixin() async {
await assertErrorsInCode(r'''
import 'package:meta/meta.dart';
class Mixin {
mixin Mixin {
@mustCallSuper
void a() {}
}
@ -284,7 +284,7 @@ class C with Mixin {
test_fromMixin_setter() async {
await assertErrorsInCode(r'''
import 'package:meta/meta.dart';
class Mixin {
mixin Mixin {
@mustCallSuper
void set a(int value) {}
}
@ -339,7 +339,7 @@ class D extends C {
test_indirectlyInheritedFromMixin() async {
await assertErrorsInCode(r'''
import 'package:meta/meta.dart';
class Mixin {
mixin Mixin {
@mustCallSuper
void b() {}
}

View file

@ -332,6 +332,7 @@ class C extends B {}
test_classTypeAlias_interface() async {
// issue 15979
await assertNoErrorsInCode(r'''
//@dart=2.19
abstract class M {}
abstract class A {}
abstract class I {
@ -344,6 +345,7 @@ abstract class B = A with M implements I;
test_classTypeAlias_mixin() async {
// issue 15979
await assertNoErrorsInCode(r'''
//@dart=2.19
abstract class M {
m();
}
@ -355,6 +357,7 @@ abstract class B = A with M;
test_classTypeAlias_superclass() async {
// issue 15979
await assertNoErrorsInCode(r'''
//@dart=2.19
class M {}
abstract class A {
m();
@ -404,6 +407,7 @@ class C extends A {
test_mixin_concreteGetter() async {
// issue 17034
await assertNoErrorsInCode(r'''
//@dart=2.19
class A {
var a;
}
@ -417,6 +421,7 @@ class C extends B {}
test_mixin_concreteMethod() async {
await assertNoErrorsInCode(r'''
//@dart=2.19
class A {
m() {}
}
@ -430,6 +435,7 @@ class C extends B {}
test_mixin_concreteSetter() async {
await assertNoErrorsInCode(r'''
//@dart=2.19
class A {
var a;
}
@ -465,6 +471,7 @@ class B extends A {
test_noSuchMethod_mixin() async {
await assertNoErrorsInCode(r'''
//@dart=2.19
class A {
noSuchMethod(v) => '';
}
@ -488,6 +495,7 @@ class B extends A {
test_one_classTypeAlias_interface() async {
// issue 15979
await assertErrorsInCode('''
//@dart=2.19
abstract class M {}
abstract class A {}
abstract class I {
@ -497,7 +505,7 @@ class B = A with M implements I;
''', [
error(
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
74,
87,
1),
]);
}
@ -505,6 +513,7 @@ class B = A with M implements I;
test_one_classTypeAlias_mixin() async {
// issue 15979
await assertErrorsInCode('''
//@dart=2.19
abstract class M {
m();
}
@ -513,7 +522,7 @@ class B = A with M;
''', [
error(
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
54,
67,
1),
]);
}
@ -521,6 +530,7 @@ class B = A with M;
test_one_classTypeAlias_superclass() async {
// issue 15979
await assertErrorsInCode('''
//@dart=2.19
class M {}
abstract class A {
m();
@ -529,7 +539,7 @@ class B = A with M;
''', [
error(
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
45,
58,
1),
]);
}
@ -662,13 +672,14 @@ class C implements A, B {
test_one_mixinInherits_getter() async {
// issue 15001
await assertErrorsInCode('''
//@dart=2.19
abstract class A { get g1; get g2; }
abstract class B implements A { get g1 => 1; }
class C extends Object with B {}
''', [
error(
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
90,
103,
1),
]);
}
@ -676,13 +687,14 @@ class C extends Object with B {}
test_one_mixinInherits_method() async {
// issue 15001
await assertErrorsInCode('''
//@dart=2.19
abstract class A { m1(); m2(); }
abstract class B implements A { m1() => 1; }
class C extends Object with B {}
''', [
error(
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
84,
97,
1),
]);
}
@ -690,13 +702,14 @@ class C extends Object with B {}
test_one_mixinInherits_setter() async {
// issue 15001
await assertErrorsInCode('''
//@dart=2.19
abstract class A { set s1(v); set s2(v); }
abstract class B implements A { set s1(v) {} }
class C extends Object with B {}
''', [
error(
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
96,
109,
1),
]);
}
@ -825,6 +838,7 @@ class C implements I {
test_overridesConcreteMethodInObject() async {
await assertNoErrorsInCode(r'''
//@dart=2.19
class A {
String toString([String prefix = '']) => '${prefix}Hello';
}

View file

@ -54,7 +54,7 @@ class C extends B {}
test_classAlias_withClass_nonNullable() async {
await assertNoErrorsInCode('''
class A {}
class B {}
mixin B {}
class C = A with B;
''');
}
@ -62,7 +62,7 @@ class C = A with B;
test_classAlias_withClass_nullable() async {
await assertErrorsInCode('''
class A {}
class B {}
mixin B {}
class C = A? with B;
''', [
error(CompileTimeErrorCode.NULLABLE_TYPE_IN_EXTENDS_CLAUSE, 32, 2),
@ -72,7 +72,7 @@ class C = A? with B;
test_classAlias_withClass_nullable_alias() async {
await assertErrorsInCode('''
class A {}
class B {}
mixin B {}
typedef C = A;
class D = C? with B;
''', [
@ -83,7 +83,7 @@ class D = C? with B;
test_classAlias_withClass_nullable_alias2() async {
await assertErrorsInCode('''
class A {}
class B {}
mixin B {}
typedef C = A?;
class D = C with B;
''', [

View file

@ -17,14 +17,14 @@ main() {
class NullableTypeInWithClauseTest extends PubPackageResolutionTest {
test_class_nonNullable() async {
await assertNoErrorsInCode('''
class A {}
mixin A {}
class B with A {}
''');
}
test_class_nullable() async {
await assertErrorsInCode('''
class A {}
mixin A {}
class B with A? {}
''', [
error(CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE, 24, 2),
@ -33,7 +33,7 @@ class B with A? {}
test_class_nullable_alias() async {
await assertErrorsInCode('''
class A {}
mixin A {}
typedef B = A;
class C with B? {}
''', [
@ -43,7 +43,7 @@ class C with B? {}
test_class_nullable_alias2() async {
await assertErrorsInCode('''
class A {}
mixin A {}
typedef B = A?;
class C with B {}
''', [
@ -54,7 +54,7 @@ class C with B {}
test_classAlias_withClass_nonNullable() async {
await assertNoErrorsInCode('''
class A {}
class B {}
mixin B {}
class C = A with B;
''');
}
@ -62,7 +62,7 @@ class C = A with B;
test_classAlias_withClass_nullable() async {
await assertErrorsInCode('''
class A {}
class B {}
mixin B {}
class C = A with B?;
''', [
error(CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE, 39, 2),
@ -72,7 +72,7 @@ class C = A with B?;
test_classAlias_withClass_nullable_alias() async {
await assertErrorsInCode('''
class A {}
class B {}
mixin B {}
typedef C = B;
class D = A with C?;
''', [
@ -83,7 +83,7 @@ class D = A with C?;
test_classAlias_withClass_nullable_alias2() async {
await assertErrorsInCode('''
class A {}
class B {}
mixin B {}
typedef C = B?;
class D = A with C;
''', [

View file

@ -38,7 +38,7 @@ class B implements A {}
test_classTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
class M {}
mixin M {}
class B = A with M implements B;
''', [
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS, 28,

View file

@ -91,11 +91,11 @@ class D implements A {}
test_classTypeAlias_mixin() async {
await assertErrorsInCode(r'''
class M1 = Object with M2;
class M2 = Object with M1;
mixin class M1 = Object with M2;
mixin class M2 = Object with M1;
''', [
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 6, 2),
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 33, 2),
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 12, 2),
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 45, 2),
]);
}
@ -105,7 +105,7 @@ class M2 = Object with M1;
await assertErrorsInCode('''
class C = D with M;
class D = C with M;
class M {}
mixin M {}
''', [
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 6, 1),
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 26, 1),

View file

@ -17,9 +17,9 @@ main() {
class RecursiveInterfaceInheritanceWithTest extends PubPackageResolutionTest {
test_classTypeAlias() async {
await assertErrorsInCode(r'''
class M = Object with M;
mixin class M = Object with M;
''', [
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH, 6, 1),
error(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH, 12, 1),
]);
}
}

View file

@ -141,72 +141,6 @@ class Bar2 implements Bar {}
''');
}
test_class_with_sealed_inside() async {
await assertNoErrorsInCode(r'''
sealed class Foo {}
class Bar with Foo {}
''');
}
test_class_with_sealed_outside() async {
newFile('$testPackageLibPath/foo.dart', r'''
sealed class Foo {}
''');
await assertErrorsInCode(r'''
import 'foo.dart';
class Bar with Foo {}
''', [
error(CompileTimeErrorCode.CLASS_USED_AS_MIXIN, 34, 3),
error(
CompileTimeErrorCode.SEALED_CLASS_SUBTYPE_OUTSIDE_OF_LIBRARY, 34, 3),
]);
}
test_class_with_sealed_outside_viaTypedef_inside() async {
newFile('$testPackageLibPath/foo.dart', r'''
sealed class Foo {}
typedef FooTypedef = Foo;
''');
await assertErrorsInCode(r'''
import 'foo.dart';
class Bar with FooTypedef {}
''', [
error(CompileTimeErrorCode.CLASS_USED_AS_MIXIN, 34, 10),
error(
CompileTimeErrorCode.SEALED_CLASS_SUBTYPE_OUTSIDE_OF_LIBRARY, 34, 10),
]);
}
test_class_with_sealed_outside_viaTypedef_outside() async {
newFile('$testPackageLibPath/foo.dart', r'''
sealed class Foo {}
''');
await assertErrorsInCode(r'''
import 'foo.dart';
typedef FooTypedef = Foo;
class Bar with FooTypedef {}
''', [
error(CompileTimeErrorCode.CLASS_USED_AS_MIXIN, 60, 10),
error(
CompileTimeErrorCode.SEALED_CLASS_SUBTYPE_OUTSIDE_OF_LIBRARY, 60, 10),
]);
}
test_class_with_subtypeOfSealed_outside() async {
newFile('$testPackageLibPath/foo.dart', r'''
sealed class Foo {}
class Bar with Foo {}
''');
await assertNoErrorsInCode(r'''
import 'foo.dart';
class Bar2 extends Bar {}
''');
}
test_mixin_implements_sealed_outside() async {
newFile('$testPackageLibPath/foo.dart', r'''
sealed class Foo {}

View file

@ -144,8 +144,9 @@ mixin Bar implements Foo {}
]);
}
test_withinLibrary_OK() async {
test_withinLibrary_language219() async {
await assertNoErrorsInCode(r'''
// @dart = 2.19
import 'package:meta/meta.dart';
@sealed class Foo {}
@ -156,7 +157,7 @@ mixin Bar5 implements Foo {}
''');
}
test_withinPackageLibDirectory_OK() async {
test_withinPackageLibDirectory_language219() async {
newFile('$testPackageLibPath/a.dart', r'''
// @dart = 2.19
import 'package:meta/meta.dart';
@ -173,7 +174,7 @@ mixin Bar5 implements Foo {}
assertNoErrorsInResult();
}
test_withinPackageTestDirectory_OK() async {
test_withinPackageTestDirectory_language219() async {
newFile('$testPackageLibPath/a.dart', r'''
// @dart = 2.19
import 'package:meta/meta.dart';
@ -191,17 +192,19 @@ mixin Bar5 implements Foo {}
assertNoErrorsInResult();
}
test_withinPart_OK() async {
test_withinPart_language219() async {
var libPath = '$testPackageLibPath/a.dart';
var partPath = '$testPackageLibPath/b.dart';
newFile(libPath, r'''
// @dart = 2.19
import 'package:meta/meta.dart';
part 'b.dart';
@sealed class Foo {}
''');
newFile(partPath, r'''
// @dart = 2.19
part of 'a.dart';
class Bar1 extends Foo {}
class Bar2 implements Foo {}

View file

@ -20,6 +20,18 @@ main() {
@reflectiveTest
class TypeArgumentNotMatchingBoundsTest extends PubPackageResolutionTest
with TypeArgumentNotMatchingBoundsTestCases {
test_classTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
class B {}
mixin C {}
class G<E extends A> {}
class D = G<B> with C;
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 69, 1),
]);
}
test_enum_inferred() async {
await assertErrorsInCode('''
enum E<T extends int> {
@ -440,21 +452,20 @@ var t = D<String>;
contextMessages: [message('/home/test/lib/test.dart', 49, 9)]),
]);
}
}
mixin TypeArgumentNotMatchingBoundsTestCases on PubPackageResolutionTest {
test_classTypeAlias() async {
test_with() async {
await assertErrorsInCode(r'''
class A {}
class B {}
class C {}
class G<E extends A> {}
class D = G<B> with C;
mixin G<E extends A> {}
class C extends Object with G<B>{}
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 69, 1),
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 76, 1),
]);
}
}
mixin TypeArgumentNotMatchingBoundsTestCases on PubPackageResolutionTest {
test_const() async {
await assertErrorsInCode(r'''
class A {}
@ -823,23 +834,24 @@ G<B> g = (throw 0);
contextMessages: [message('/home/test/lib/test.dart', 46, 4)]),
]);
}
test_with() async {
await assertErrorsInCode(r'''
class A {}
class B {}
class G<E extends A> {}
class C extends Object with G<B>{}
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 76, 1),
]);
}
}
@reflectiveTest
class TypeArgumentNotMatchingBoundsWithoutNullSafetyTest
extends PubPackageResolutionTest
with WithoutNullSafetyMixin, TypeArgumentNotMatchingBoundsTestCases {
test_classTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
class B {}
class C {}
class G<E extends A> {}
class D = G<B> with C;
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 69, 1),
]);
}
test_regression_42196_Null() async {
await assertNoErrorsInCode(r'''
typedef G<X> = Function(X);
@ -852,4 +864,15 @@ main() {
}
''');
}
test_with() async {
await assertErrorsInCode(r'''
class A {}
class B {}
class G<E extends A> {}
class C extends Object with G<B>{}
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 76, 1),
]);
}
}

View file

@ -36,7 +36,7 @@ A<A, A>? a;
test_classAlias() async {
await assertErrorsInCode(r'''
class A {}
class M {}
mixin M {}
class B<F extends num> = A<F> with M;
''', [
error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 4),

View file

@ -116,7 +116,7 @@ class B<X> implements A<X> {}
test_class_with_function_parameterType() async {
await assertErrorsInCode(r'''
typedef F<X> = void Function(X);
class A<X> {}
mixin A<X> {}
class B<X> extends Object with A<F<X>> {}
''', [
error(
@ -130,14 +130,14 @@ class B<X> extends Object with A<F<X>> {}
test_class_with_function_returnType() async {
await assertNoErrorsInCode(r'''
typedef F<X> = X Function();
class A<X> {}
mixin A<X> {}
class B<X> extends Object with A<F<X>> {}
''');
}
test_class_with_withoutFunction() async {
await assertNoErrorsInCode(r'''
class A<X> {}
mixin A<X> {}
class B<X> extends Object with A<X> {}
''');
}
@ -288,7 +288,7 @@ enum E<X> implements A<X> {
test_enum_with_function_parameterType() async {
await assertErrorsInCode(r'''
typedef F<X> = void Function(X);
class A<X> {}
mixin A<X> {}
enum E<X> with A<F<X>> {
v
}
@ -304,7 +304,7 @@ enum E<X> with A<F<X>> {
test_enum_with_function_returnType() async {
await assertNoErrorsInCode(r'''
typedef F<X> = X Function();
class A<X> {}
mixin A<X> {}
enum E<X> with A<F<X>> {
v
}
@ -313,7 +313,7 @@ enum E<X> with A<F<X>> {
test_enum_with_withoutFunction() async {
await assertNoErrorsInCode(r'''
class A<X> {}
mixin A<X> {}
enum E<X> with A<X> {
v
}

View file

@ -7236,7 +7236,7 @@ The following code produces this diagnostic because the class `A` is used
in both the `extends` and `with` clauses for the class `B`:
{% prettify dart tag=pre+code %}
class A {}
mixin class A {}
class B extends A with [!A!] {}
{% endprettify %}
@ -11543,6 +11543,7 @@ The following code produces this diagnostic because the class `A`, which
defines a constructor, is being used as a mixin:
{% prettify dart tag=pre+code %}
//@dart=2.19
class A {
A();
}
@ -11565,6 +11566,7 @@ If the class can't be a mixin and it's possible to remove the constructor,
then do so:
{% prettify dart tag=pre+code %}
//@dart=2.19
class A {
}
@ -11598,6 +11600,7 @@ The following code produces this diagnostic because the class `B`, which
extends `A`, is being used as a mixin by `C`:
{% prettify dart tag=pre+code %}
//@dart=2.19
class A {}
class B extends A {}
@ -11611,6 +11614,7 @@ If the class being used as a mixin can be changed to extend `Object`, then
change it:
{% prettify dart tag=pre+code %}
//@dart=2.19
class A {}
class B {}

View file

@ -15,31 +15,31 @@ mixin Mixin {
}
abstract class A with Class {}
// ^
// [analyzer] unspecified
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CLASS_USED_AS_MIXIN
// [cfe] The class 'Class' can't be used as a mixin because it isn't a mixin class nor a mixin.
class B with Class {}
// ^
// [analyzer] unspecified
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CLASS_USED_AS_MIXIN
// [cfe] The class 'Class' can't be used as a mixin because it isn't a mixin class nor a mixin.
class C = Object with Class;
// ^
// [analyzer] unspecified
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CLASS_USED_AS_MIXIN
// [cfe] The class 'Class' can't be used as a mixin because it isn't a mixin class nor a mixin.
abstract class D with Class, Mixin {}
// ^
// [analyzer] unspecified
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CLASS_USED_AS_MIXIN
// [cfe] The class 'Class' can't be used as a mixin because it isn't a mixin class nor a mixin.
class E with Class, Mixin {}
// ^
// [analyzer] unspecified
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CLASS_USED_AS_MIXIN
// [cfe] The class 'Class' can't be used as a mixin because it isn't a mixin class nor a mixin.
class NamedMixinClassApplication = Object with Class;
// ^
// [analyzer] unspecified
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CLASS_USED_AS_MIXIN
// [cfe] The class 'Class' can't be used as a mixin because it isn't a mixin class nor a mixin.