Skip to content

Commit 8f60ceb

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Prevent a cast exception in convert-to-if-null
I wasn't able to find a case that reproduced the exception. I suspect that this means that we won't produce a fix in at least one case where we could be. If you have ideas for how to reproduce, let me know. Bug: 43432 Change-Id: Id1a2ffec281d6622792253358243c0fad4387f6d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162922 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 7b6c102 commit 8f60ceb

File tree

2 files changed

+49
-20
lines changed

2 files changed

+49
-20
lines changed

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

+21-20
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,28 @@ class ConvertToIfNull extends CorrectionProducer {
1616

1717
@override
1818
Future<void> compute(ChangeBuilder builder) async {
19-
var conditional = node.thisOrAncestorOfType<ConditionalExpression>();
20-
if (conditional == null) {
21-
return;
22-
}
23-
var condition = conditional.condition as BinaryExpression;
24-
Expression nullableExpression;
25-
Expression defaultExpression;
26-
if (condition.operator.type == TokenType.EQ_EQ) {
27-
nullableExpression = conditional.elseExpression;
28-
defaultExpression = conditional.thenExpression;
29-
} else {
30-
nullableExpression = conditional.thenExpression;
31-
defaultExpression = conditional.elseExpression;
32-
}
33-
await builder.addDartFileEdit(file, (builder) {
34-
builder.addReplacement(range.node(conditional), (builder) {
35-
builder.write(utils.getNodeText(nullableExpression));
36-
builder.write(' ?? ');
37-
builder.write(utils.getNodeText(defaultExpression));
19+
var node = this.node;
20+
if (node is ConditionalExpression &&
21+
node.offset == errorOffset &&
22+
node.length == errorLength) {
23+
var condition = node.condition as BinaryExpression;
24+
Expression nullableExpression;
25+
Expression defaultExpression;
26+
if (condition.operator.type == TokenType.EQ_EQ) {
27+
nullableExpression = node.elseExpression;
28+
defaultExpression = node.thenExpression;
29+
} else {
30+
nullableExpression = node.thenExpression;
31+
defaultExpression = node.elseExpression;
32+
}
33+
await builder.addDartFileEdit(file, (builder) {
34+
builder.addReplacement(range.node(node), (builder) {
35+
builder.write(utils.getNodeText(nullableExpression));
36+
builder.write(' ?? ');
37+
builder.write(utils.getNodeText(defaultExpression));
38+
});
3839
});
39-
});
40+
}
4041
}
4142

4243
/// Return an instance of this class. Used as a tear-off in `FixProcessor`.

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

+28
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analysis_server/src/services/correction/fix.dart';
66
import 'package:analysis_server/src/services/linter/lint_names.dart';
7+
import 'package:analyzer/src/dart/error/lint_codes.dart';
78
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
89
import 'package:test_reflective_loader/test_reflective_loader.dart';
910

@@ -36,6 +37,33 @@ void f(String s) {
3637
''');
3738
}
3839

40+
Future<void> test_malformed() async {
41+
await resolveTestUnit('''
42+
void f(String s, bool b) {
43+
print(b ? s != null ? s : : null);
44+
}
45+
''');
46+
await assertNoFix(errorFilter: (error) {
47+
var code = error.errorCode;
48+
return code is LintCode &&
49+
code.name == LintNames.prefer_if_null_operators;
50+
});
51+
}
52+
53+
Future<void> test_malformed_parentheses() async {
54+
// https://github.com/dart-lang/sdk/issues/43432
55+
await resolveTestUnit('''
56+
void f(String s, bool b) {
57+
print(b ? (s != null ? s : ) : null);
58+
}
59+
''');
60+
await assertNoFix(errorFilter: (error) {
61+
var code = error.errorCode;
62+
return code is LintCode &&
63+
code.name == LintNames.prefer_if_null_operators;
64+
});
65+
}
66+
3967
Future<void> test_notEqual() async {
4068
await resolveTestUnit('''
4169
void f(String s) {

0 commit comments

Comments
 (0)