Skip to content

Commit 5ef56be

Browse files
scheglovCommit Queue
authored andcommitted
Variance. Report errors on INOUT and OUT built-in identifiers when Feature.variance is enabled.
Change-Id: I4788439bea71532d2c52b715543f7deaeacdf519 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/489982 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com>
1 parent 99290f0 commit 5ef56be

10 files changed

Lines changed: 416 additions & 28 deletions

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2504,6 +2504,15 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
25042504
diagnosticReporter.report(
25052505
code.withArguments(name: token.lexeme).at(token),
25062506
);
2507+
return;
2508+
}
2509+
2510+
if (_featureSet.isEnabled(Feature.variance)) {
2511+
if (token.keyword == Keyword.INOUT || token.keyword == Keyword.OUT) {
2512+
diagnosticReporter.report(
2513+
code.withArguments(name: token.lexeme).at(token),
2514+
);
2515+
}
25072516
}
25082517
}
25092518

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,36 @@ extension Function on Object {}
3232
[error(diag.builtInIdentifierAsExtensionName, 10, 8)],
3333
);
3434
}
35+
36+
test_inout() async {
37+
await assertErrorsInCode(
38+
'''
39+
extension inout on Object {}
40+
''',
41+
[error(diag.builtInIdentifierAsExtensionName, 10, 5)],
42+
);
43+
}
44+
45+
test_inout_language310() async {
46+
await assertNoErrorsInCode('''
47+
// @dart = 3.10
48+
extension inout on Object {}
49+
''');
50+
}
51+
52+
test_out() async {
53+
await assertErrorsInCode(
54+
'''
55+
extension out on Object {}
56+
''',
57+
[error(diag.builtInIdentifierAsExtensionName, 10, 3)],
58+
);
59+
}
60+
61+
test_out_language310() async {
62+
await assertNoErrorsInCode('''
63+
// @dart = 3.10
64+
extension out on Object {}
65+
''');
66+
}
3567
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,36 @@ extension type Function(int it) {}
3333
[error(diag.builtInIdentifierAsExtensionTypeName, 15, 8)],
3434
);
3535
}
36+
37+
test_inout() async {
38+
await assertErrorsInCode(
39+
'''
40+
extension type inout(int it) {}
41+
''',
42+
[error(diag.builtInIdentifierAsExtensionTypeName, 15, 5)],
43+
);
44+
}
45+
46+
test_inout_language310() async {
47+
await assertNoErrorsInCode('''
48+
// @dart = 3.10
49+
extension type inout(int it) {}
50+
''');
51+
}
52+
53+
test_out() async {
54+
await assertErrorsInCode(
55+
'''
56+
extension type out(int it) {}
57+
''',
58+
[error(diag.builtInIdentifierAsExtensionTypeName, 15, 3)],
59+
);
60+
}
61+
62+
test_out_language310() async {
63+
await assertNoErrorsInCode('''
64+
// @dart = 3.10
65+
extension type out(int it) {}
66+
''');
67+
}
3668
}

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,48 @@ import 'dart:async' as Function;
3838
],
3939
);
4040
}
41+
42+
test_inout() async {
43+
await assertErrorsInCode(
44+
'''
45+
import 'dart:async' as inout;
46+
''',
47+
[
48+
error(diag.unusedImport, 7, 12),
49+
error(diag.builtInIdentifierAsPrefixName, 23, 5),
50+
],
51+
);
52+
}
53+
54+
test_inout_language310() async {
55+
await assertErrorsInCode(
56+
'''
57+
// @dart = 3.10
58+
import 'dart:async' as inout;
59+
''',
60+
[error(diag.unusedImport, 23, 12)],
61+
);
62+
}
63+
64+
test_out() async {
65+
await assertErrorsInCode(
66+
'''
67+
import 'dart:async' as out;
68+
''',
69+
[
70+
error(diag.unusedImport, 7, 12),
71+
error(diag.builtInIdentifierAsPrefixName, 23, 3),
72+
],
73+
);
74+
}
75+
76+
test_out_language310() async {
77+
await assertErrorsInCode(
78+
'''
79+
// @dart = 3.10
80+
import 'dart:async' as out;
81+
''',
82+
[error(diag.unusedImport, 23, 12)],
83+
);
84+
}
4185
}

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

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,39 @@ class Function {}
3333
);
3434
}
3535

36-
test_enum() async {
36+
test_class_inout() async {
37+
await assertErrorsInCode(
38+
'''
39+
class inout {}
40+
''',
41+
[error(diag.builtInIdentifierAsTypeName, 6, 5)],
42+
);
43+
}
44+
45+
test_class_inout_language310() async {
46+
await assertNoErrorsInCode('''
47+
// @dart = 3.10
48+
class inout {}
49+
''');
50+
}
51+
52+
test_class_out() async {
53+
await assertErrorsInCode(
54+
'''
55+
class out {}
56+
''',
57+
[error(diag.builtInIdentifierAsTypeName, 6, 3)],
58+
);
59+
}
60+
61+
test_class_out_language310() async {
62+
await assertNoErrorsInCode('''
63+
// @dart = 3.10
64+
class out {}
65+
''');
66+
}
67+
68+
test_enum_as() async {
3769
await assertErrorsInCode(
3870
'''
3971
enum as {
@@ -44,6 +76,38 @@ enum as {
4476
);
4577
}
4678

79+
test_enum_inout() async {
80+
await assertErrorsInCode(
81+
'''
82+
enum inout {v}
83+
''',
84+
[error(diag.builtInIdentifierAsTypeName, 5, 5)],
85+
);
86+
}
87+
88+
test_enum_inout_language310() async {
89+
await assertNoErrorsInCode('''
90+
// @dart = 3.10
91+
enum inout {v}
92+
''');
93+
}
94+
95+
test_enum_out() async {
96+
await assertErrorsInCode(
97+
'''
98+
enum out {v}
99+
''',
100+
[error(diag.builtInIdentifierAsTypeName, 5, 3)],
101+
);
102+
}
103+
104+
test_enum_out_language310() async {
105+
await assertNoErrorsInCode('''
106+
// @dart = 3.10
107+
enum out {v}
108+
''');
109+
}
110+
47111
test_mixin_as() async {
48112
await assertErrorsInCode(
49113
'''
@@ -62,6 +126,22 @@ mixin Function {}
62126
);
63127
}
64128

129+
test_mixin_inout() async {
130+
await assertErrorsInCode(
131+
'''
132+
mixin inout {}
133+
''',
134+
[error(diag.builtInIdentifierAsTypeName, 6, 5)],
135+
);
136+
}
137+
138+
test_mixin_inout_language310() async {
139+
await assertNoErrorsInCode('''
140+
// @dart = 3.10
141+
mixin inout {}
142+
''');
143+
}
144+
65145
test_mixin_OK_on() async {
66146
await assertNoErrorsInCode(r'''
67147
class A {}
@@ -75,6 +155,22 @@ mixin M2 implements on {}
75155
class B = A with on;
76156
class C = B with M;
77157
class D = Object with M2;
158+
''');
159+
}
160+
161+
test_mixin_out() async {
162+
await assertErrorsInCode(
163+
'''
164+
mixin out {}
165+
''',
166+
[error(diag.builtInIdentifierAsTypeName, 6, 3)],
167+
);
168+
}
169+
170+
test_mixin_out_language310() async {
171+
await assertNoErrorsInCode('''
172+
// @dart = 3.10
173+
mixin out {}
78174
''');
79175
}
80176
}

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

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,38 @@ class A<Function> {}
3434
);
3535
}
3636

37+
test_class_inout() async {
38+
await assertErrorsInCode(
39+
'''
40+
class A<inout> {}
41+
''',
42+
[error(diag.builtInIdentifierAsTypeParameterName, 8, 5)],
43+
);
44+
}
45+
46+
test_class_inout_language310() async {
47+
await assertNoErrorsInCode('''
48+
// @dart = 3.10
49+
class A<inout> {}
50+
''');
51+
}
52+
53+
test_class_out() async {
54+
await assertErrorsInCode(
55+
'''
56+
class A<out> {}
57+
''',
58+
[error(diag.builtInIdentifierAsTypeParameterName, 8, 3)],
59+
);
60+
}
61+
62+
test_class_out_language310() async {
63+
await assertNoErrorsInCode('''
64+
// @dart = 3.10
65+
class A<out> {}
66+
''');
67+
}
68+
3769
test_extension_as() async {
3870
await assertErrorsInCode(
3971
'''
@@ -43,6 +75,24 @@ extension <as> on List {}
4375
);
4476
}
4577

78+
test_extension_inout() async {
79+
await assertErrorsInCode(
80+
'''
81+
extension <inout> on List {}
82+
''',
83+
[error(diag.builtInIdentifierAsTypeParameterName, 11, 5)],
84+
);
85+
}
86+
87+
test_extension_out() async {
88+
await assertErrorsInCode(
89+
'''
90+
extension <out> on List {}
91+
''',
92+
[error(diag.builtInIdentifierAsTypeParameterName, 11, 3)],
93+
);
94+
}
95+
4696
test_function_as() async {
4797
await assertErrorsInCode(
4898
'''
@@ -51,4 +101,22 @@ void f<as>() {}
51101
[error(diag.builtInIdentifierAsTypeParameterName, 7, 2)],
52102
);
53103
}
104+
105+
test_function_inout() async {
106+
await assertErrorsInCode(
107+
'''
108+
void f<inout>() {}
109+
''',
110+
[error(diag.builtInIdentifierAsTypeParameterName, 7, 5)],
111+
);
112+
}
113+
114+
test_function_out() async {
115+
await assertErrorsInCode(
116+
'''
117+
void f<out>() {}
118+
''',
119+
[error(diag.builtInIdentifierAsTypeParameterName, 7, 3)],
120+
);
121+
}
54122
}

0 commit comments

Comments
 (0)