Skip to content

Commit f7dc2d2

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Issue 45195. Report MIXIN_INHERITS_FROM_NOT_OBJECT for class aliases.
Bug: dart-lang#45195 Change-Id: I4b1e60a672b49c3c9fda92b3eac59c256eea13da Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/189300 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 226ecb0 commit f7dc2d2

File tree

3 files changed

+70
-35
lines changed

3 files changed

+70
-35
lines changed

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3267,17 +3267,20 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
32673267
bool _checkForMixinInheritsNotFromObject(
32683268
TypeName mixinName, ClassElement mixinElement) {
32693269
var mixinSupertype = mixinElement.supertype;
3270-
if (mixinSupertype != null) {
3271-
if (!mixinSupertype.isDartCoreObject ||
3272-
!mixinElement.isMixinApplication && mixinElement.mixins.isNotEmpty) {
3273-
_errorReporter.reportErrorForNode(
3274-
CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT,
3275-
mixinName,
3276-
[mixinElement.name]);
3277-
return true;
3270+
if (mixinSupertype == null || mixinSupertype.isDartCoreObject) {
3271+
var mixins = mixinElement.mixins;
3272+
if (mixins.isEmpty ||
3273+
mixinElement.isMixinApplication && mixins.length < 2) {
3274+
return false;
32783275
}
32793276
}
3280-
return false;
3277+
3278+
_errorReporter.reportErrorForNode(
3279+
CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT,
3280+
mixinName,
3281+
[mixinElement.name],
3282+
);
3283+
return true;
32813284
}
32823285

32833286
/// Check that superclass constrains for the mixin type of [mixinName] at

pkg/analyzer/test/generated/non_error_resolver_test.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2340,13 +2340,15 @@ class C = Object with B;
23402340
// B's superclass is "Object with A1<T>". So mixin type inference succeeds
23412341
// (since C's base class implements A1<int>), and "with B" is interpreted as
23422342
// "with B<int>".
2343-
await assertNoErrorsInCode('''
2343+
await assertErrorsInCode('''
23442344
class A1<T> {}
23452345
class A2<T> {}
23462346
class B<T> = Object with A1<T>, A2<T>;
23472347
class Base implements A1<int> {}
23482348
class C = Base with B;
2349-
''');
2349+
''', [
2350+
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 122, 1),
2351+
]);
23502352
var bReference = result.unit!.declaredElement!.getType('C')!.mixins[0];
23512353
assertType(bReference.typeArguments[0], 'int');
23522354
}

pkg/analyzer/test/src/diagnostics/mixin_inherits_from_not_object_test.dart

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,75 +15,105 @@ main() {
1515

1616
@reflectiveTest
1717
class MixinInheritsFromNotObjectTest extends PubPackageResolutionTest {
18-
test_classDeclaration_extends() async {
18+
test_classAlias_class_extends() async {
1919
await assertErrorsInCode(r'''
2020
class A {}
2121
class B extends A {}
22-
class C extends Object with B {}
22+
class C = Object with B;
2323
''', [
24-
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 60, 1),
24+
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 54, 1),
2525
]);
2626
}
2727

28-
test_classDeclaration_extends_new_syntax() async {
29-
await assertNoErrorsInCode(r'''
28+
test_classAlias_class_with() async {
29+
await assertErrorsInCode(r'''
3030
class A {}
31-
mixin B on A {}
32-
class C extends A with B {}
33-
''');
31+
class B extends Object with A {}
32+
class C = Object with B;
33+
''', [
34+
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 66, 1),
35+
]);
3436
}
3537

36-
test_classDeclaration_mixTypeAlias() async {
38+
test_classAlias_classAlias_with() async {
3739
await assertNoErrorsInCode(r'''
3840
class A {}
3941
class B = Object with A;
40-
class C extends Object with B {}
42+
class C = Object with B;
4143
''');
4244
}
4345

44-
test_classDeclaration_with() async {
46+
test_classAlias_classAlias_with2() async {
4547
await assertErrorsInCode(r'''
4648
class A {}
47-
class B extends Object with A {}
48-
class C extends Object with B {}
49+
class B {}
50+
class C = Object with A, B;
51+
class D = Object with C;
4952
''', [
5053
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 72, 1),
5154
]);
5255
}
5356

54-
test_typeAlias_extends() async {
57+
test_classAlias_mixin() async {
58+
await assertNoErrorsInCode(r'''
59+
class A {}
60+
mixin B on A {}
61+
class C = A with B;
62+
''');
63+
}
64+
65+
test_classDeclaration_class_extends() async {
5566
await assertErrorsInCode(r'''
5667
class A {}
5768
class B extends A {}
58-
class C = Object with B;
69+
class C extends Object with B {}
5970
''', [
60-
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 54, 1),
71+
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 60, 1),
6172
]);
6273
}
6374

64-
test_typeAlias_extends_new_syntax() async {
75+
test_classDeclaration_class_extends_Object() async {
6576
await assertNoErrorsInCode(r'''
6677
class A {}
67-
mixin B on A {}
68-
class C = A with B;
78+
class B extends Object {}
79+
class C extends Object with B {}
6980
''');
7081
}
7182

72-
test_typeAlias_with() async {
83+
test_classDeclaration_class_with() async {
7384
await assertErrorsInCode(r'''
7485
class A {}
7586
class B extends Object with A {}
76-
class C = Object with B;
87+
class C extends Object with B {}
7788
''', [
78-
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 66, 1),
89+
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 72, 1),
7990
]);
8091
}
8192

82-
test_typedef_mixTypeAlias() async {
93+
test_classDeclaration_classAlias_with() async {
8394
await assertNoErrorsInCode(r'''
8495
class A {}
8596
class B = Object with A;
86-
class C = Object with B;
97+
class C extends Object with B {}
98+
''');
99+
}
100+
101+
test_classDeclaration_classAlias_with2() async {
102+
await assertErrorsInCode(r'''
103+
class A {}
104+
class B {}
105+
class C = Object with A, B;
106+
class D extends Object with C {}
107+
''', [
108+
error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 78, 1),
109+
]);
110+
}
111+
112+
test_classDeclaration_mixin() async {
113+
await assertNoErrorsInCode(r'''
114+
class A {}
115+
mixin B on A {}
116+
class C extends A with B {}
87117
''');
88118
}
89119
}

0 commit comments

Comments
 (0)