Final Local Variable Check, fixed false-positive, issue #258

This commit is contained in:
alexkravin 2015-01-26 14:16:49 +04:00 committed by Roman Ivanov
parent 6784e5bcd5
commit c6019cd352
3 changed files with 47 additions and 1 deletions

View File

@ -109,7 +109,8 @@ public class FinalLocalVariableCheck extends Check
}
case TokenTypes.VARIABLE_DEF:
if ((ast.getParent().getType() != TokenTypes.OBJBLOCK)
&& (ast.getParent().getType() != TokenTypes.FOR_EACH_CLAUSE))
&& (ast.getParent().getType() != TokenTypes.FOR_EACH_CLAUSE)
&& isFirstVariableInForInit(ast))
{
insertVariable(ast);
}
@ -146,6 +147,25 @@ public class FinalLocalVariableCheck extends Check
}
}
/**
* Checks if current variable is defined first in
* {@link TokenTypes#FOR_INIT for-loop init}, e.g.:
* <p>
* <code>
* for (int i = 0, j = 0; i < j; i++) { . . . }
* </code>
* </p>
* <code>i</code> is first variable in {@link TokenTypes#FOR_INIT for-loop init}
* @param variableDef variable definition node.
* @return true if variableDef is first variable in {@link TokenTypes#FOR_INIT for-loop init}
*/
private static boolean isFirstVariableInForInit(DetailAST variableDef)
{
return variableDef.getParent().getType() != TokenTypes.FOR_INIT
|| variableDef.getPreviousSibling() == null
|| variableDef.getPreviousSibling().getType() != TokenTypes.COMMA;
}
/**
* Determines whether an AST is a descendant of an abstract or native method.
* @param ast the AST to check.

View File

@ -82,4 +82,17 @@ public class FinalLocalVariableCheckTest
};
verify(checkConfig, getPath("coding/InputFinalLocalVariableNativeMethods.java"), expected);
}
@Test
public void testFalsePositive() throws Exception
{
final DefaultConfiguration checkConfig =
createCheckConfig(FinalLocalVariableCheck.class);
checkConfig.addAttribute("tokens", "VARIABLE_DEF, PARAMETER_DEF");
final String[] expected = {
};
verify(checkConfig, getPath("coding/InputFinalLocalVariableCheckFalsePositive.java"), expected);
}
}

View File

@ -0,0 +1,13 @@
package com.puppycrawl.tools.checkstyle.coding;
public class InputFinalLocalVariableCheckFalsePositive
{
public void method()
{
final java.util.List<Object> list = new java.util.ArrayList<>();
for ( int i = 0, s0 = list.size(); i < s0; i++ )
{
}
}
}