[java] InvalidLogMessageFormat: False positive with message and exception in a block inside a lambda
This commit is contained in:
@ -35,6 +35,7 @@ import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
|
|||||||
import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
|
import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
|
||||||
import net.sourceforge.pmd.lang.java.types.TypeTestUtil;
|
import net.sourceforge.pmd.lang.java.types.TypeTestUtil;
|
||||||
import net.sourceforge.pmd.lang.symboltable.NameDeclaration;
|
import net.sourceforge.pmd.lang.symboltable.NameDeclaration;
|
||||||
|
import net.sourceforge.pmd.lang.symboltable.Scope;
|
||||||
|
|
||||||
public class InvalidLogMessageFormatRule extends AbstractJavaRule {
|
public class InvalidLogMessageFormatRule extends AbstractJavaRule {
|
||||||
|
|
||||||
@ -217,14 +218,17 @@ public class InvalidLogMessageFormatRule extends AbstractJavaRule {
|
|||||||
varName = name.getImage();
|
varName = name.getImage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (NameDeclaration decl : prefix.getScope().getDeclarations().keySet()) {
|
Scope scope = prefix == null ? null : prefix.getScope();
|
||||||
if (decl.getName().equals(varName)) {
|
while (scope != null) {
|
||||||
if (decl.getNode().getParent() instanceof ASTLambdaExpression) {
|
// Try recursively to find the expected NameDeclaration
|
||||||
|
for (NameDeclaration decl : scope.getDeclarations().keySet()) {
|
||||||
|
if (decl.getName().equals(varName)) {
|
||||||
// If the last parameter is a lambda parameter, then we also ignore it - regardless of the type.
|
// If the last parameter is a lambda parameter, then we also ignore it - regardless of the type.
|
||||||
// This is actually a workaround, since type resolution doesn't resolve the types of lambda parameters.
|
// This is actually a workaround, since type resolution doesn't resolve the types of lambda parameters.
|
||||||
return true;
|
return decl.getNode().getParent() instanceof ASTLambdaExpression;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
scope = scope.getParent();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -175,6 +175,27 @@ public class InvalidSl4jExceptionBug1541 {
|
|||||||
}
|
}
|
||||||
]]></code>
|
]]></code>
|
||||||
</test-code>
|
</test-code>
|
||||||
|
<test-code>
|
||||||
|
<description>#3560 [java] InvalidLogMessageFormat: False positive with message and exception in a block inside a lambda</description>
|
||||||
|
<expected-problems>0</expected-problems>
|
||||||
|
<code><![CDATA[
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class InvalidSl4jExceptionBug3560 {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(InvalidSl4jExceptionBug3560.class);
|
||||||
|
|
||||||
|
public static Consumer<Throwable> build() {
|
||||||
|
return e -> {
|
||||||
|
if (e instanceof RuntimeException) {
|
||||||
|
LOGGER.warn("Unexpected RuntimeException", e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]></code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
<test-code>
|
<test-code>
|
||||||
<description>#1551 [java] InvalidSlf4jMessageFormat: fails with NPE</description>
|
<description>#1551 [java] InvalidSlf4jMessageFormat: fails with NPE</description>
|
||||||
|
Reference in New Issue
Block a user