Issue #1930: EqualsAvoidNull check should check String concatenations

This commit is contained in:
Vladislav Lisetskiy 2015-11-05 02:05:39 +03:00 committed by Roman Ivanov
parent 176301250b
commit 61afa5374e
3 changed files with 36 additions and 14 deletions

View File

@ -337,24 +337,24 @@ public class EqualsAvoidNullCheck extends Check {
* @param expr the argument expression
* @return - true if any child matches the set of tokens, false if not
*/
private static boolean containsAllSafeTokens(final DetailAST expr) {
private boolean containsAllSafeTokens(final DetailAST expr) {
DetailAST arg = expr.getFirstChild();
if (arg.branchContains(TokenTypes.METHOD_CALL)) {
return false;
}
arg = skipVariableAssign(arg);
//Plus assignment can have ill affects
//do not want to recommend moving expression
//See example:
//String s = "SweetString";
//s.equals(s += "SweetString"); //false
//s = "SweetString";
//(s += "SweetString").equals(s); //true
boolean argIsNotNull = false;
if (arg.getType() == TokenTypes.PLUS) {
DetailAST child = arg.getFirstChild();
while (child != null
&& !argIsNotNull) {
argIsNotNull = child.getType() == TokenTypes.STRING_LITERAL
|| child.getType() == TokenTypes.IDENT;
child = child.getNextSibling();
}
}
return !arg.branchContains(TokenTypes.PLUS_ASSIGN)
&& !arg.branchContains(TokenTypes.IDENT)
&& !arg.branchContains(TokenTypes.LITERAL_NULL);
return argIsNotNull
|| !arg.branchContains(TokenTypes.IDENT)
&& !arg.branchContains(TokenTypes.LITERAL_NULL);
}
/**

View File

@ -95,6 +95,9 @@ public class EqualsAvoidNullCheckTest extends BaseCheckTestSupport {
"357:35: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"368:30: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"394:35: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"415:17: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"416:17: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"417:17: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
};
verify(checkConfig, getPath("InputEqualsAvoidNull.java"), expected);
}
@ -145,6 +148,9 @@ public class EqualsAvoidNullCheckTest extends BaseCheckTestSupport {
"357:35: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"368:30: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"394:35: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"415:17: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"416:17: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
"417:17: " + getCheckMessage(MSG_EQUALS_AVOID_NULL),
};
verify(checkConfig, getPath("InputEqualsAvoidNull.java"), expected);
}

View File

@ -407,3 +407,19 @@ enum TestEnum {
this.ONE.equals(this);
}
}
class TestConcatenations {
String s = null;
void foo() {
s.equals(s + s);
s.equals("a" + "b");
s.equals(getInt() + s);
s.equals(getInt() + getInt());
}
int getInt() {
return (Integer) null;
}
}