Skip to content

Commit 2ce7aa3

Browse files
bwilkersonCommit Bot
authored andcommitted
Add a fix for the use_enums lint
Change-Id: I6f3e7b1c3f9b8b4ce7a1737130e3f98896b2123c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/236981 Reviewed-by: Phil Quitslund <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 3778e79 commit 2ce7aa3

File tree

7 files changed

+244
-1
lines changed

7 files changed

+244
-1
lines changed

pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analysis_server/src/services/correction/assist.dart';
66
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
7+
import 'package:analysis_server/src/services/correction/fix.dart';
78
import 'package:analysis_server/src/services/correction/util.dart';
89
import 'package:analysis_server/src/utilities/extensions/range_factory.dart';
910
import 'package:analyzer/dart/analysis/features.dart';
@@ -16,13 +17,26 @@ import 'package:analyzer/dart/element/type.dart';
1617
import 'package:analyzer_plugin/utilities/assist/assist.dart';
1718
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
1819
import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
20+
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
1921
import 'package:analyzer_plugin/utilities/range_factory.dart';
2022
import 'package:collection/collection.dart';
2123

2224
class ConvertClassToEnum extends CorrectionProducer {
2325
@override
2426
AssistKind get assistKind => DartAssistKind.CONVERT_CLASS_TO_ENUM;
2527

28+
@override
29+
bool get canBeAppliedInBulk => true;
30+
31+
@override
32+
bool get canBeAppliedToFile => true;
33+
34+
@override
35+
FixKind get fixKind => DartFixKind.CONVERT_CLASS_TO_ENUM;
36+
37+
@override
38+
FixKind get multiFixKind => DartFixKind.CONVERT_CLASS_TO_ENUM_MULTI;
39+
2640
@override
2741
Future<void> compute(ChangeBuilder builder) async {
2842
if (!libraryElement.featureSet.isEnabled(Feature.enhanced_enums)) {

pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1819,7 +1819,7 @@ LintCode.use_colored_box:
18191819
LintCode.use_decorated_box:
18201820
status: needsEvaluation
18211821
LintCode.use_enums:
1822-
status: needsFix
1822+
status: hasFix
18231823
LintCode.use_full_hex_values_for_flutter_colors:
18241824
status: hasFix
18251825
LintCode.use_function_type_syntax_for_parameters:

pkg/analysis_server/lib/src/services/correction/fix.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,16 @@ class DartFixKind {
308308
DartFixKindPriority.DEFAULT,
309309
"Change '{0}' to '{1}' type annotation",
310310
);
311+
static const CONVERT_CLASS_TO_ENUM = FixKind(
312+
'dart.fix.convert.classToEnum',
313+
DartFixKindPriority.DEFAULT,
314+
'Convert class to an enum',
315+
);
316+
static const CONVERT_CLASS_TO_ENUM_MULTI = FixKind(
317+
'dart.fix.convert.classToEnum.multi',
318+
DartFixKindPriority.DEFAULT,
319+
'Convert classes to enums in file',
320+
);
311321
static const CONVERT_FLUTTER_CHILD = FixKind(
312322
'dart.fix.flutter.convert.childToChildren',
313323
DartFixKindPriority.DEFAULT,

pkg/analysis_server/lib/src/services/correction/fix_internal.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import 'package:analysis_server/src/services/correction/dart/change_to_nearest_p
3939
import 'package:analysis_server/src/services/correction/dart/change_to_static_access.dart';
4040
import 'package:analysis_server/src/services/correction/dart/change_type_annotation.dart';
4141
import 'package:analysis_server/src/services/correction/dart/convert_add_all_to_spread.dart';
42+
import 'package:analysis_server/src/services/correction/dart/convert_class_to_enum.dart';
4243
import 'package:analysis_server/src/services/correction/dart/convert_conditional_expression_to_if_element.dart';
4344
import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
4445
import 'package:analysis_server/src/services/correction/dart/convert_flutter_child.dart';
@@ -651,6 +652,9 @@ class FixProcessor extends BaseProcessor {
651652
LintNames.unnecessary_this: [
652653
RemoveThisExpression.newInstance,
653654
],
655+
LintNames.use_enums: [
656+
ConvertClassToEnum.newInstance,
657+
],
654658
LintNames.use_full_hex_values_for_flutter_colors: [
655659
ReplaceWithEightDigitHex.newInstance,
656660
],

pkg/analysis_server/lib/src/services/linter/lint_names.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ class LintNames {
147147
static const String unnecessary_string_interpolations =
148148
'unnecessary_string_interpolations';
149149
static const String unnecessary_this = 'unnecessary_this';
150+
static const String use_enums = 'use_enums';
150151
static const String use_full_hex_values_for_flutter_colors =
151152
'use_full_hex_values_for_flutter_colors';
152153
static const String use_function_type_syntax_for_parameters =
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analysis_server/src/services/correction/fix.dart';
6+
import 'package:analysis_server/src/services/linter/lint_names.dart';
7+
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
8+
import 'package:test_reflective_loader/test_reflective_loader.dart';
9+
10+
import 'fix_processor.dart';
11+
12+
void main() {
13+
defineReflectiveSuite(() {
14+
defineReflectiveTests(ConvertClassToEnumBulkTest);
15+
defineReflectiveTests(ConvertClassToEnumTest);
16+
});
17+
}
18+
19+
@reflectiveTest
20+
class ConvertClassToEnumBulkTest extends BulkFixProcessorTest {
21+
@override
22+
String get lintCode => LintNames.use_enums;
23+
24+
Future<void> test_multipleClasses() async {
25+
await resolveTestCode('''
26+
class _E {
27+
static const _E c0 = _E(0);
28+
static const _E c1 = _E(1);
29+
30+
final int value;
31+
32+
const _E(this.value);
33+
}
34+
35+
class E {
36+
static const E c0 = E._(0);
37+
static const E c1 = E._(1);
38+
39+
final int value;
40+
41+
const E._(this.value);
42+
}
43+
44+
var x = [_E.c0, _E.c1];
45+
''');
46+
await assertHasFix('''
47+
enum _E {
48+
c0(0),
49+
c1(1);
50+
51+
final int value;
52+
53+
const _E(this.value);
54+
}
55+
56+
enum E {
57+
c0._(0),
58+
c1._(1);
59+
60+
final int value;
61+
62+
const E._(this.value);
63+
}
64+
65+
var x = [_E.c0, _E.c1];
66+
''');
67+
}
68+
}
69+
70+
@reflectiveTest
71+
class ConvertClassToEnumTest extends FixProcessorLintTest {
72+
@override
73+
FixKind get kind => DartFixKind.CONVERT_CLASS_TO_ENUM;
74+
75+
@override
76+
String get lintCode => LintNames.use_enums;
77+
78+
Future<void> test_minimal_intField_privateClass() async {
79+
await resolveTestCode('''
80+
class _E {
81+
static const _E c0 = _E(0);
82+
static const _E c1 = _E(1);
83+
84+
final int value;
85+
86+
const _E(this.value);
87+
}
88+
89+
var x = [_E.c0, _E.c1];
90+
''');
91+
await assertHasFix('''
92+
enum _E {
93+
c0(0),
94+
c1(1);
95+
96+
final int value;
97+
98+
const _E(this.value);
99+
}
100+
101+
var x = [_E.c0, _E.c1];
102+
''');
103+
}
104+
105+
Future<void> test_minimal_intField_publicClass() async {
106+
await resolveTestCode('''
107+
class E {
108+
static const E c0 = E._(0);
109+
static const E c1 = E._(1);
110+
111+
final int value;
112+
113+
const E._(this.value);
114+
}
115+
''');
116+
await assertHasFix('''
117+
enum E {
118+
c0._(0),
119+
c1._(1);
120+
121+
final int value;
122+
123+
const E._(this.value);
124+
}
125+
''');
126+
}
127+
128+
Future<void> test_minimal_notIntField_privateClass() async {
129+
await resolveTestCode('''
130+
class _E {
131+
static const _E c0 = _E('c0');
132+
static const _E c1 = _E('c1');
133+
134+
final String name;
135+
136+
const _E(this.name);
137+
}
138+
139+
var x = [_E.c0, _E.c1];
140+
''');
141+
await assertHasFix('''
142+
enum _E {
143+
c0('c0'),
144+
c1('c1');
145+
146+
final String name;
147+
148+
const _E(this.name);
149+
}
150+
151+
var x = [_E.c0, _E.c1];
152+
''');
153+
}
154+
155+
Future<void> test_minimal_notIntField_publicClass() async {
156+
await resolveTestCode('''
157+
class E {
158+
static const E c0 = E._('c0');
159+
static const E c1 = E._('c1');
160+
161+
final String name;
162+
163+
const E._(this.name);
164+
}
165+
''');
166+
await assertHasFix('''
167+
enum E {
168+
c0._('c0'),
169+
c1._('c1');
170+
171+
final String name;
172+
173+
const E._(this.name);
174+
}
175+
''');
176+
}
177+
178+
Future<void> test_withReferencedFactoryConstructor() async {
179+
await resolveTestCode('''
180+
class _E {
181+
static const _E c0 = _E(0);
182+
static const _E c1 = _E(1);
183+
184+
final int value;
185+
186+
const _E(this.value);
187+
188+
factory _E.withValue(int x) => c0;
189+
}
190+
191+
_E e = _E.withValue(0);
192+
193+
var x = [_E.c0, _E.c1];
194+
''');
195+
await assertHasFix('''
196+
enum _E {
197+
c0(0),
198+
c1(1);
199+
200+
final int value;
201+
202+
const _E(this.value);
203+
204+
factory _E.withValue(int x) => c0;
205+
}
206+
207+
_E e = _E.withValue(0);
208+
209+
var x = [_E.c0, _E.c1];
210+
''');
211+
}
212+
}

pkg/analysis_server/test/src/services/correction/fix/test_all.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import 'change_to_nearest_precise_value_test.dart'
4848
import 'change_to_static_access_test.dart' as change_to_static_access;
4949
import 'change_to_test.dart' as change_to;
5050
import 'change_type_annotation_test.dart' as change_type_annotation;
51+
import 'convert_class_to_enum_test.dart' as convert_class_to_enum;
5152
import 'convert_documentation_into_line_test.dart'
5253
as convert_documentation_into_line;
5354
import 'convert_flutter_child_test.dart' as convert_flutter_child;
@@ -262,6 +263,7 @@ void main() {
262263
change_to_nearest_precise_value.main();
263264
change_to_static_access.main();
264265
change_type_annotation.main();
266+
convert_class_to_enum.main();
265267
convert_documentation_into_line.main();
266268
convert_flutter_child.main();
267269
convert_flutter_children.main();

0 commit comments

Comments
 (0)