blob: e3f31a92fed4fa1916051b9bc88b622c70b69512 [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(PrivateCollisionInMixinApplicationTest);
});
}
@reflectiveTest
class PrivateCollisionInMixinApplicationTest extends PubPackageResolutionTest {
test_class_interfaceAndMixin_same() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
class C implements A {}
class D extends C with A {}
''');
}
test_class_interfaceAndMixin_same_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
class C implements A {}
class D extends C with A {}
''');
}
test_class_mixinAndMixin() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends Object with A, B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 49, 1),
]);
}
test_class_mixinAndMixin_indirect() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends Object with A {}
class D extends C with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 74, 1),
]);
}
test_class_mixinAndMixin_indirect_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends Object with A {}
class D extends C with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 74, 1),
]);
}
test_class_mixinAndMixin_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends Object with A, B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 49, 1),
]);
}
test_class_mixinAndMixin_withoutExtends() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C with A, B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 34, 1),
]);
}
test_class_mixinAndMixin_withoutExtends_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C with A, B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 34, 1),
]);
}
test_class_staticAndInstanceElement() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
static void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
class C extends Object with A, B {}
''');
}
test_class_staticAndInstanceElement_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
static void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
class C extends Object with A, B {}
''');
}
test_class_staticElements() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
static void _foo() {}
}
mixin B {
static void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
class C extends Object with A, B {}
''');
}
test_class_staticElements_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
static void _foo() {}
}
mixin class B {
static void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
class C extends Object with A, B {}
''');
}
test_class_superclassAndMixin_getter2() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
int get _foo => 0;
}
mixin B {
int get _foo => 0;
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends A with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 41, 1),
]);
}
test_class_superclassAndMixin_getter2_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
int get _foo => 0;
}
mixin class B {
int get _foo => 0;
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends A with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 41, 1),
]);
}
test_class_superclassAndMixin_method2() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends A with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 41, 1),
]);
}
test_class_superclassAndMixin_method2_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends A with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 41, 1),
]);
}
test_class_superclassAndMixin_sameLibrary() async {
await assertErrorsInCode('''
mixin A {
void _foo() {}
}
mixin B {
void _foo() {}
}
class C extends Object with A, B {}
''', [
error(WarningCode.UNUSED_ELEMENT, 17, 4),
error(WarningCode.UNUSED_ELEMENT, 47, 4),
]);
}
test_class_superclassAndMixin_sameLibrary_mixinClass() async {
await assertErrorsInCode('''
mixin class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
class C extends Object with A, B {}
''', [
error(WarningCode.UNUSED_ELEMENT, 23, 4),
error(WarningCode.UNUSED_ELEMENT, 59, 4),
]);
}
test_class_superclassAndMixin_setter2() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
set _foo(int _) {}
}
mixin B {
set _foo(int _) {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends A with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 41, 1,
messageContains: ["'_foo'"]),
]);
}
test_class_superclassAndMixin_setter2_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
set _foo(int _) {}
}
mixin class B {
set _foo(int _) {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C extends A with B {}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 41, 1,
messageContains: ["'_foo'"]),
]);
}
test_classTypeAlias_mixinAndMixin() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C = Object with A, B;
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 43, 1),
]);
}
test_classTypeAlias_mixinAndMixin_indirect() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C = Object with A;
class D = C with B;
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 60, 1),
]);
}
test_classTypeAlias_mixinAndMixin_indirect_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C = Object with A;
class D = C with B;
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 60, 1),
]);
}
test_classTypeAlias_mixinAndMixin_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C = Object with A, B;
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 43, 1),
]);
}
test_classTypeAlias_superclassAndMixin() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C = A with B;
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 35, 1),
]);
}
test_classTypeAlias_superclassAndMixin_mixinClass() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
void _foo() {}
}
mixin class B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
class C = A with B;
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 35, 1),
]);
}
test_enum_getter_mixinAndMixin() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
int get _foo => 0;
}
mixin B {
int get _foo => 0;
}
''');
await assertErrorsInCode('''
import 'a.dart';
enum E with A, B {
v
}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 33, 1),
]);
}
test_enum_method_interfaceAndMixin_same() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
mixin B implements A {}
enum E with B, A {
v
}
''');
}
test_enum_method_mixinAndMixin() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
enum E with A, B {
v
}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 33, 1),
]);
}
test_enum_method_staticAndInstanceElement() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
static void _foo() {}
}
mixin B {
void _foo() {}
}
''');
await assertNoErrorsInCode('''
import 'a.dart';
enum E with A, B {
v
}
''');
}
test_enum_setter_mixinAndMixin() async {
newFile('$testPackageLibPath/a.dart', r'''
mixin A {
set _foo(int _) {}
}
mixin B {
set _foo(int _) {}
}
''');
await assertErrorsInCode('''
import 'a.dart';
enum E with A, B {
v
}
''', [
error(CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, 33, 1,
messageContains: ["'_foo'"]),
]);
}
}