mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 11:03:19 +00:00
[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:
parent
57107ae59b
commit
16b1c12619
|
@ -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(
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
''');
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
''', [
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {}
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ import 'package:meta/meta.dart';
|
|||
|
||||
abstract class A {}
|
||||
|
||||
abstract class B {}
|
||||
mixin B {}
|
||||
|
||||
@sealed abstract class M = A with B;
|
||||
''');
|
||||
|
|
|
@ -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(){ }
|
||||
}
|
||||
|
|
|
@ -343,7 +343,7 @@ class C extends B {}
|
|||
await assertErrorsInCode('''
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
class A {
|
||||
mixin A {
|
||||
@mustBeOverridden
|
||||
void m() {}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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> {}
|
||||
''', [
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
''', [
|
||||
|
|
|
@ -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() {}
|
||||
}
|
||||
|
|
|
@ -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';
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
''', [
|
||||
|
|
|
@ -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;
|
||||
''', [
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue