Merge branch 'pr-453'

This commit is contained in:
Andreas Dangel
2017-06-23 14:53:27 +02:00
3 changed files with 32 additions and 25 deletions

View File

@ -70,23 +70,9 @@ public class InvalidSlf4jMessageFormatRule extends AbstractJavaRule {
// find the arguments // find the arguments
final List<ASTExpression> argumentList = parentNode.getFirstChildOfType(ASTPrimarySuffix.class) final List<ASTExpression> argumentList = parentNode.getFirstChildOfType(ASTPrimarySuffix.class)
.getFirstDescendantOfType(ASTArgumentList.class).findChildrenOfType(ASTExpression.class); .getFirstDescendantOfType(ASTArgumentList.class).findChildrenOfType(ASTExpression.class);
final List<ASTPrimaryExpression> params = new ArrayList<ASTPrimaryExpression>(argumentList.size());
for (final ASTExpression astExpression : argumentList) {
ASTPrimaryExpression primaryExpression = astExpression.getFirstChildOfType(ASTPrimaryExpression.class);
if (primaryExpression != null) {
params.add(primaryExpression);
}
}
if (params.isEmpty()) {
// no params we could analyze
return super.visit(node, data);
}
final ASTPrimaryExpression messageParam = params.get(0);
// remove the message parameter // remove the message parameter
params.remove(0); final ASTPrimaryExpression messageParam = argumentList.remove(0).getFirstDescendantOfType(ASTPrimaryExpression.class);
final int expectedArguments = expectedArguments(messageParam); final int expectedArguments = expectedArguments(messageParam);
if (expectedArguments == 0) { if (expectedArguments == 0) {
@ -97,14 +83,14 @@ public class InvalidSlf4jMessageFormatRule extends AbstractJavaRule {
// Remove throwable param, since it is shown separately. // Remove throwable param, since it is shown separately.
// But only, if it is not used as a placeholder argument // But only, if it is not used as a placeholder argument
if (params.size() > expectedArguments) { if (argumentList.size() > expectedArguments) {
removeThrowableParam(params); removeThrowableParam(argumentList);
} }
if (params.size() < expectedArguments) { if (argumentList.size() < expectedArguments) {
addViolationWithMessage(data, node, "Missing arguments," + getExpectedMessage(params, expectedArguments)); addViolationWithMessage(data, node, "Missing arguments," + getExpectedMessage(argumentList, expectedArguments));
} else if (params.size() > expectedArguments) { } else if (argumentList.size() > expectedArguments) {
addViolationWithMessage(data, node, "Too many arguments," + getExpectedMessage(params, expectedArguments)); addViolationWithMessage(data, node, "Too many arguments," + getExpectedMessage(argumentList, expectedArguments));
} }
return super.visit(node, data); return super.visit(node, data);
@ -146,21 +132,20 @@ public class InvalidSlf4jMessageFormatRule extends AbstractJavaRule {
return false; return false;
} }
private void removeThrowableParam(final List<ASTPrimaryExpression> params) { private void removeThrowableParam(final List<ASTExpression> params) {
// Throwable parameters are the last one in the list, if any. // Throwable parameters are the last one in the list, if any.
if (params.isEmpty()) { if (params.isEmpty()) {
return; return;
} }
int lastIndex = params.size() - 1; int lastIndex = params.size() - 1;
ASTPrimaryExpression last = params.get(lastIndex); ASTPrimaryExpression last = params.get(lastIndex).getFirstDescendantOfType(ASTPrimaryExpression.class);
if (isNewThrowable(last) || hasTypeThrowable(last) || isReferencingThrowable(last)) { if (isNewThrowable(last) || hasTypeThrowable(last) || isReferencingThrowable(last)) {
params.remove(lastIndex); params.remove(lastIndex);
return;
} }
} }
private String getExpectedMessage(final List<ASTPrimaryExpression> params, final int expectedArguments) { private String getExpectedMessage(final List<ASTExpression> params, final int expectedArguments) {
return " expected " + expectedArguments + (expectedArguments > 1 ? " arguments " : " argument ") + "but have " return " expected " + expectedArguments + (expectedArguments > 1 ? " arguments " : " argument ") + "but have "
+ params.size(); + params.size();
} }

View File

@ -198,6 +198,26 @@ public class TestBug1551
{ {
return "message"; return "message";
} }
}
]]></code>
</test-code>
<test-code>
<description>#365 [java] InvalidSlf4jMessageFormat: false positive with pre-incremented variable</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Foo
{
private static final Logger LOGGER = LoggerFactory.getLogger(Foo.class);
public void test()
{
int attempt = 0;
LOGGER.info("test (attempt #{})", ++attempt);
}
} }
]]></code> ]]></code>
</test-code> </test-code>

View File

@ -61,6 +61,8 @@ Fields using generics are still Work in Progress, but we expect to fully support
* [#348]((https://github.com/pmd/pmd/issues/348): \[java] imports/UnusedImport rule not considering static inner classes of imports * [#348]((https://github.com/pmd/pmd/issues/348): \[java] imports/UnusedImport rule not considering static inner classes of imports
* java-junit * java-junit
* [#428](https://github.com/pmd/pmd/issues/428): \[java] PMD requires public modifier on JUnit 5 test * [#428](https://github.com/pmd/pmd/issues/428): \[java] PMD requires public modifier on JUnit 5 test
* java-logging:
* [#365](https://github.com/pmd/pmd/issues/365): \[java] InvalidSlf4jMessageFormat does not handle inline incrementation of arguments
* java-unnecessary * java-unnecessary
* [#421](https://github.com/pmd/pmd/issues/421): \[java] UnnecessaryFinalModifier final in private method * [#421](https://github.com/pmd/pmd/issues/421): \[java] UnnecessaryFinalModifier final in private method
* jsp * jsp