Skip to content

Commit 9cdfab0

Browse files
FMorschelCommit Queue
authored and
Commit Queue
committed
[DAS] Adds fix to use_if_null_to_convert_nulls_to_bools
Fixes: #47436 Change-Id: Idcdca7389a771d8ecee5c4746a37324cc5d96261 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/421889 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Auto-Submit: Felipe Morschel <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent 95741cd commit 9cdfab0

File tree

4 files changed

+117
-7
lines changed

4 files changed

+117
-7
lines changed

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

+50-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
1212
import 'package:analyzer_plugin/utilities/range_factory.dart';
1313

1414
class ConvertToIfNull extends ResolvedCorrectionProducer {
15-
ConvertToIfNull({required super.context});
15+
/// Identifies the case to be fixed.
16+
final _FixCase _fixCase;
17+
18+
ConvertToIfNull.preferIfNull({required super.context})
19+
: _fixCase = _FixCase.preferIfNull;
20+
21+
ConvertToIfNull.useToConvertNullsToBools({required super.context})
22+
: _fixCase = _FixCase.useToConvertNullsToBools;
1623

1724
@override
1825
CorrectionApplicability get applicability =>
@@ -26,6 +33,15 @@ class ConvertToIfNull extends ResolvedCorrectionProducer {
2633

2734
@override
2835
Future<void> compute(ChangeBuilder builder) async {
36+
switch (_fixCase) {
37+
case _FixCase.preferIfNull:
38+
await _preferIfNull(builder);
39+
case _FixCase.useToConvertNullsToBools:
40+
await _useToConvertNullsToBools(builder);
41+
}
42+
}
43+
44+
Future<void> _preferIfNull(ChangeBuilder builder) async {
2945
var node = this.node;
3046
if (node is ConditionalExpression &&
3147
node.offset == errorOffset &&
@@ -67,4 +83,37 @@ class ConvertToIfNull extends ResolvedCorrectionProducer {
6783
});
6884
}
6985
}
86+
87+
Future<void> _useToConvertNullsToBools(ChangeBuilder builder) async {
88+
var node = this.node;
89+
if (node is BinaryExpression &&
90+
node.offset == errorOffset &&
91+
node.length == errorLength &&
92+
(node.operator.type == TokenType.EQ_EQ ||
93+
node.operator.type == TokenType.BANG_EQ)) {
94+
var left = node.leftOperand;
95+
var right = node.rightOperand;
96+
Expression nullableExpression;
97+
if (left is! BooleanLiteral) {
98+
nullableExpression = left;
99+
} else if (right is! BooleanLiteral) {
100+
nullableExpression = right;
101+
} else {
102+
return;
103+
}
104+
await builder.addDartFileEdit(file, (builder) {
105+
builder.addReplacement(range.node(node), (builder) {
106+
builder.write(utils.getNodeText(nullableExpression));
107+
builder.write(' ${TokenType.QUESTION_QUESTION.lexeme} ');
108+
if (node.operator.type == TokenType.EQ_EQ) {
109+
builder.write('false');
110+
} else {
111+
builder.write('true');
112+
}
113+
});
114+
});
115+
}
116+
}
70117
}
118+
119+
enum _FixCase { preferIfNull, useToConvertNullsToBools }

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -2515,7 +2515,7 @@ LintCode.use_full_hex_values_for_flutter_colors:
25152515
LintCode.use_function_type_syntax_for_parameters:
25162516
status: hasFix
25172517
LintCode.use_if_null_to_convert_nulls_to_bools:
2518-
status: needsFix
2518+
status: hasFix
25192519
LintCode.use_is_even_rather_than_modulo:
25202520
status: needsFix
25212521
LintCode.use_key_in_widget_constructors:

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ final _builtInLintGenerators = <LintCode, List<ProducerGenerator>>{
434434
LinterLintCode.prefer_if_elements_to_conditional_expressions: [
435435
ConvertConditionalExpressionToIfElement.new,
436436
],
437-
LinterLintCode.prefer_if_null_operators: [ConvertToIfNull.new],
437+
LinterLintCode.prefer_if_null_operators: [ConvertToIfNull.preferIfNull],
438438
LinterLintCode.prefer_initializing_formals: [ConvertToInitializingFormal.new],
439439
LinterLintCode.prefer_inlined_adds_single: [
440440
ConvertAddAllToSpread.new,
@@ -539,6 +539,9 @@ final _builtInLintGenerators = <LintCode, List<ProducerGenerator>>{
539539
LinterLintCode.use_function_type_syntax_for_parameters: [
540540
ConvertToGenericFunctionSyntax.new,
541541
],
542+
LinterLintCode.use_if_null_to_convert_nulls_to_bools: [
543+
ConvertToIfNull.useToConvertNullsToBools,
544+
],
542545
LinterLintCode.use_key_in_widget_constructors: [AddKeyToConstructors.new],
543546
LinterLintCode.use_named_constants: [ReplaceWithNamedConstant.new],
544547
LinterLintCode.use_null_aware_elements: [

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

+62-4
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import 'fix_processor.dart';
1212

1313
void main() {
1414
defineReflectiveSuite(() {
15-
defineReflectiveTests(ConvertToIfNullBulkTest);
16-
defineReflectiveTests(ConvertToIfNullTest);
15+
defineReflectiveTests(ConvertToIfNullPreferBulkTest);
16+
defineReflectiveTests(ConvertToIfNullPreferTest);
17+
defineReflectiveTests(ConvertToIfNullUseBulkTest);
18+
defineReflectiveTests(ConvertToIfNullUseTest);
1719
});
1820
}
1921

2022
@reflectiveTest
21-
class ConvertToIfNullBulkTest extends BulkFixProcessorTest {
23+
class ConvertToIfNullPreferBulkTest extends BulkFixProcessorTest {
2224
@override
2325
String get lintCode => LintNames.prefer_if_null_operators;
2426

@@ -39,7 +41,7 @@ void f(String s) {
3941
}
4042

4143
@reflectiveTest
42-
class ConvertToIfNullTest extends FixProcessorLintTest {
44+
class ConvertToIfNullPreferTest extends FixProcessorLintTest {
4345
@override
4446
FixKind get kind => DartFixKind.CONVERT_TO_IF_NULL;
4547

@@ -133,3 +135,59 @@ void f(String? s) {
133135
''');
134136
}
135137
}
138+
139+
@reflectiveTest
140+
class ConvertToIfNullUseBulkTest extends BulkFixProcessorTest {
141+
@override
142+
String get lintCode => LintNames.use_if_null_to_convert_nulls_to_bools;
143+
144+
Future<void> test_singleFile() async {
145+
await resolveTestCode('''
146+
void f(bool? value) {
147+
print(value == true);
148+
print(value != false);
149+
}
150+
''');
151+
await assertHasFix('''
152+
void f(bool? value) {
153+
print(value ?? false);
154+
print(value ?? true);
155+
}
156+
''');
157+
}
158+
}
159+
160+
@reflectiveTest
161+
class ConvertToIfNullUseTest extends FixProcessorLintTest {
162+
@override
163+
FixKind get kind => DartFixKind.CONVERT_TO_IF_NULL;
164+
165+
@override
166+
String get lintCode => LintNames.use_if_null_to_convert_nulls_to_bools;
167+
168+
Future<void> test_different_false() async {
169+
await resolveTestCode('''
170+
void f(bool? value) {
171+
print(value != false);
172+
}
173+
''');
174+
await assertHasFix('''
175+
void f(bool? value) {
176+
print(value ?? true);
177+
}
178+
''');
179+
}
180+
181+
Future<void> test_equals_true() async {
182+
await resolveTestCode('''
183+
void f(bool? value) {
184+
print(value == true);
185+
}
186+
''');
187+
await assertHasFix('''
188+
void f(bool? value) {
189+
print(value ?? false);
190+
}
191+
''');
192+
}
193+
}

0 commit comments

Comments
 (0)