[analyzer] change range of dead code of the RHS of binary operator

Bug: #43511
Change-Id: I1b1562c0262101900dabea3544bfc28293d5c7f6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/260109
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Ahmed Ashour 2022-10-10 21:07:42 +00:00 committed by Commit Queue
parent 24b8399086
commit ecb992586a
6 changed files with 34 additions and 19 deletions

View file

@ -19,6 +19,23 @@ class RemoveDeadCode extends CorrectionProducer {
// Not predictably the correct action.
bool get canBeAppliedToFile => false;
@override
AstNode? get coveredNode {
var node = super.coveredNode;
if (node is BinaryExpression) {
var problemMessage = diagnostic?.problemMessage;
if (problemMessage != null) {
var operatorOffset = node.operator.offset;
var rightOperand = node.rightOperand;
if (problemMessage.offset == operatorOffset &&
problemMessage.length == rightOperand.end - operatorOffset) {
return rightOperand;
}
}
}
return node;
}
@override
FixKind get fixKind => DartFixKind.REMOVE_DEAD_CODE;

View file

@ -160,17 +160,13 @@ class LegacyDeadCodeVerifier extends RecursiveAstVisitor<void> {
var lhsResult = _getConstantBooleanValue(lhsCondition);
if (lhsResult != null) {
var value = lhsResult.value?.toBoolValue();
if (value == true && isBarBar) {
// Report error on "else" block: true || !e!
_errorReporter.reportErrorForNode(
HintCode.DEAD_CODE, node.rightOperand);
// Only visit the LHS:
lhsCondition.accept(this);
return;
} else if (value == false && isAmpAmp) {
// Report error on "if" block: false && !e!
_errorReporter.reportErrorForNode(
HintCode.DEAD_CODE, node.rightOperand);
// Report error on "else" block: true || !e!
// or on "if" block: false && !e!
if (value == true && isBarBar || value == false && isAmpAmp) {
var offset = node.operator.offset;
var length = node.rightOperand.end - offset;
_errorReporter.reportErrorForOffset(
HintCode.DEAD_CODE, offset, length);
// Only visit the LHS:
lhsCondition.accept(this);
return;
@ -496,6 +492,7 @@ class NullSafetyDeadCodeVerifier {
// because this causes nuisance warnings for redundant `!= null`
// asserts.
} else {
var offset = firstDeadNode.offset;
// We know that [node] is the first dead node, or contains it.
// So, technically the code code interval ends at the end of [node].
// But we trim it to the last statement for presentation purposes.
@ -518,9 +515,10 @@ class NullSafetyDeadCodeVerifier {
if (node is SwitchMember && node.statements.isNotEmpty) {
node = node.statements.last;
}
} else if (parent is BinaryExpression && node == parent.rightOperand) {
offset = parent.operator.offset;
}
var offset = firstDeadNode.offset;
var length = node.end - offset;
_errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length);
}

View file

@ -2582,7 +2582,7 @@ class A {
const A.b2(bool p) : v = true || p;
}
''', [
error(HintCode.DEAD_CODE, 170, 1),
error(HintCode.DEAD_CODE, 167, 4),
]);
}

View file

@ -28,7 +28,7 @@ const c = true && '';
await assertErrorsInCode('''
const c = (true || 0);
''', [
error(HintCode.DEAD_CODE, 19, 1),
error(HintCode.DEAD_CODE, 16, 4),
error(CompileTimeErrorCode.NON_BOOL_OPERAND, 19, 1),
]);
}

View file

@ -494,7 +494,7 @@ f() {
bool b = false && false;
print(b);
}''', [
error(HintCode.DEAD_CODE, 26, 5),
error(HintCode.DEAD_CODE, 23, 8),
]);
}
@ -513,7 +513,7 @@ f() {
bool b = false && (false && false);
print(b);
}''', [
error(HintCode.DEAD_CODE, 26, 16),
error(HintCode.DEAD_CODE, 23, 19),
]);
}
@ -523,7 +523,7 @@ f() {
bool b = true || true;
print(b);
}''', [
error(HintCode.DEAD_CODE, 25, 4),
error(HintCode.DEAD_CODE, 22, 7),
]);
}
@ -544,7 +544,7 @@ f() {
bool b = true || (false && false);
print(b);
}''', [
error(HintCode.DEAD_CODE, 25, 16),
error(HintCode.DEAD_CODE, 22, 19),
]);
}

View file

@ -1514,7 +1514,7 @@ m() {
if(x || false) {}
}
''', [
error(HintCode.DEAD_CODE, 33, 5),
error(HintCode.DEAD_CODE, 30, 8),
]);
}