Skip to content

Commit 47269eb

Browse files
srawlinsCommit Queue
authored andcommitted
analyzer: Correct dead_code report range when syntax tree is rewritten.
The range at which to report dead code is controlled by DeadCodeVerifier's _firstDeadNode field. But nodes can be rewritten during resolution, in which case this AstNode gets lost. We just have to update it as needed. Fixes #55642 Change-Id: I57c341b64f90fbea0cf251d712eb8f18cb84b2d9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400800 Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent ae07ae6 commit 47269eb

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

pkg/analyzer/lib/src/error/dead_code_verifier.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,14 @@ class NullSafetyDeadCodeVerifier {
337337
_firstDeadNode = null;
338338
}
339339

340+
/// Rewites [_firstDeadNode] if it is equal to [oldNode], as [oldNode] is
341+
/// being rewritten into [newNode] in the syntax tree.
342+
void maybeRewriteFirstDeadNode(AstNode oldNode, AstNode newNode) {
343+
if (_firstDeadNode == oldNode) {
344+
_firstDeadNode = newNode;
345+
}
346+
}
347+
340348
void tryStatementEnter(TryStatement node) {
341349
var verifier = _CatchClausesVerifier(
342350
_typeSystem,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,7 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
13891389
inferenceLogWriter?.recordExpressionRewrite(
13901390
oldExpression: oldNode, newExpression: newNode);
13911391
NodeReplacer.replace(oldNode, newNode, parent: parent);
1392+
nullSafetyDeadCodeVerifier.maybeRewriteFirstDeadNode(oldNode, newNode);
13921393
}
13931394

13941395
PatternResult<DartType> resolveAssignedVariablePattern({

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ main() {
1717
@reflectiveTest
1818
class DeadCodeTest extends PubPackageResolutionTest
1919
with DeadCodeTestCases_Language212 {
20+
test_deadBlock_conditionalElse_recordPropertyAccess() async {
21+
await assertErrorsInCode(r'''
22+
void f(({int x, int y}) p) {
23+
true ? p.x : p.y;
24+
}
25+
''', [
26+
error(WarningCode.DEAD_CODE, 44, 3),
27+
]);
28+
}
29+
2030
test_deadOperandLHS_or_recordPropertyAccess() async {
2131
await assertErrorsInCode(r'''
2232
void f(({bool b, }) r) {
@@ -402,7 +412,7 @@ f() {
402412
]);
403413
}
404414

405-
test_deadBlock_conditionalIf() async {
415+
test_deadBlock_conditionalThen() async {
406416
await assertErrorsInCode(r'''
407417
f() {
408418
false ? 1 : 2;
@@ -412,7 +422,7 @@ f() {
412422
]);
413423
}
414424

415-
test_deadBlock_conditionalIf_debugConst() async {
425+
test_deadBlock_conditionalThen_debugConst() async {
416426
await assertNoErrorsInCode(r'''
417427
const bool DEBUG = false;
418428
f() {
@@ -421,7 +431,7 @@ f() {
421431
''');
422432
}
423433

424-
test_deadBlock_conditionalIf_nested() async {
434+
test_deadBlock_conditionalThen_nested() async {
425435
// Test that a dead then-statement can't generate additional violations.
426436
await assertErrorsInCode(r'''
427437
f() {

0 commit comments

Comments
 (0)