Affects PMD Version:
6.22.0
Rule:
SimplifyConditional
Description:
SimplifyConditional can not detect the case if(foo != null && (foo instanceof Bar)).
This rule is implemented through xpath search:
//Expression
[ConditionalOrExpression
[EqualityExpression[@Image='==']
//NullLiteral
and
UnaryExpressionNotPlusMinus
[@Image='!']//InstanceOfExpression[PrimaryExpression
//Name/@Image = ancestor::ConditionalOrExpression/EqualityExpression
/PrimaryExpression/PrimaryPrefix/Name/@Image]
and
(count(UnaryExpressionNotPlusMinus) + 1 = count(*))
]
or
ConditionalAndExpression
[EqualityExpression[@Image='!=']//NullLiteral
and
InstanceOfExpression
[PrimaryExpression[count(PrimarySuffix[@ArrayDereference='true'])=0]
//Name[not(contains(@Image,'.'))]/@Image = ancestor::ConditionalAndExpression
/EqualityExpression/PrimaryExpression/PrimaryPrefix/Name/@Image]
and
(count(InstanceOfExpression) + 1 = count(*))
]
]
AST analyse result for the code sample is:
<ConditionalAndExpression FindBoundary='false' Image='' SingleLine='true'>
<EqualityExpression FindBoundary='false' Image='!=' Operator='!=' SingleLine='true'>
<PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
<PrimaryPrefix FindBoundary='false' Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
<Name FindBoundary='false' Image='temp' SingleLine='true' />
</PrimaryPrefix>
</PrimaryExpression>
<PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
<PrimaryPrefix FindBoundary='false' Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
<Literal CharLiteral='false' DoubleLiteral='false' EscapedStringLiteral='' FindBoundary='false' FloatLiteral='false' Image='' IntLiteral='false' LongLiteral='false' SingleCharacterStringLiteral='false' SingleLine='true' StringLiteral='false' TextBlock='false' TextBlockContent='' ValueAsDouble='NaN' ValueAsFloat='NaN' ValueAsInt='0' ValueAsLong='0'>
<NullLiteral FindBoundary='false' Image='' SingleLine='true' />
</Literal>
</PrimaryPrefix>
</PrimaryExpression>
</EqualityExpression>
<PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
<PrimaryPrefix Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
<Expression Image='' SingleLine='true' StandAlonePrimitive='false'>
<InstanceOfExpression FindBoundary='false' Image='' SingleLine='true'>
<PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
<PrimaryPrefix FindBoundary='false' Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
<Name FindBoundary='false' Image='temp' SingleLine='true' />
</PrimaryPrefix>
</PrimaryExpression>
<Type Array='false' ArrayDepth='0' ArrayType='false' FindBoundary='false' Image='' SingleLine='true' TypeImage='ListTag'>
<ReferenceType Array='false' ArrayDepth='0' FindBoundary='false' Image='' SingleLine='true'>
<ClassOrInterfaceType AnonymousClass='false' Array='false' ArrayDepth='0' FindBoundary='false' Image='ListTag' ReferenceToClassSameCompilationUnit='false' SingleLine='true'>
<TypeArguments Diamond='false' FindBoundary='false' Image='' SingleLine='true'>
<TypeArgument FindBoundary='false' Image='' SingleLine='true' Wildcard='true' />
</TypeArguments>
</ClassOrInterfaceType>
</ReferenceType>
</Type>
</InstanceOfExpression>
</Expression>
</PrimaryPrefix>
</PrimaryExpression>
</ConditionalAndExpression>
Adding parentheses around temp instanceof ListTag<?> causes the AST chain to reach this node become: ConditionalAndExpression -> PrimaryExpression -> PrimaryPrefix -> Expression -> InstanceOfExpression
Code Sample demonstrating the issue:
if(temp != null && (temp instanceof List<?>))
Expected outcome:
false-negative
Running PMD through:
CLI
Affects PMD Version:
6.22.0
Rule:
SimplifyConditional
Description:
SimplifyConditional can not detect the case
if(foo != null && (foo instanceof Bar)).This rule is implemented through xpath search:
AST analyse result for the code sample is:
Adding parentheses around
temp instanceof ListTag<?>causes the AST chain to reach this node become: ConditionalAndExpression -> PrimaryExpression -> PrimaryPrefix -> Expression -> InstanceOfExpressionCode Sample demonstrating the issue:
Expected outcome:
false-negative
Running PMD through:
CLI