Skip to content

Commit

Permalink
Merge 44d0513 into 385d815
Browse files Browse the repository at this point in the history
  • Loading branch information
Bhavik3 committed Feb 28, 2015
2 parents 385d815 + 44d0513 commit 000c50c
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,18 @@ public class FinalLocalVariableCheck extends Check
private final FastStack<Map<String, DetailAST>> scopeStack =
FastStack.newInstance();

/** Controls whether to check enhanced for-loop variable. */
private boolean validateEnhancedForLoopVariable;

/**
* Whether to check enhanced for-loop variable or not.
* @param validateEnhancedForLoopVariable whether to check for-loop variable
*/
public final void setValidateEnhancedForLoopVariable(boolean validateEnhancedForLoopVariable)
{
this.validateEnhancedForLoopVariable = validateEnhancedForLoopVariable;
}

@Override
public int[] getDefaultTokens()
{
Expand Down Expand Up @@ -116,7 +128,7 @@ public void visitToken(DetailAST ast)
}
case TokenTypes.VARIABLE_DEF:
if ((ast.getParent().getType() != TokenTypes.OBJBLOCK)
&& (ast.getParent().getType() != TokenTypes.FOR_EACH_CLAUSE)
&& canCheckEnhancedForLoopVariable(ast)
&& isVariableInForInit(ast))
{
insertVariable(ast);
Expand Down Expand Up @@ -153,8 +165,18 @@ && isVariableInForInit(ast))
default:
}
}

/**
* Determines whether enhanced for-loop variable can be checked or not.
* @param ast The ast to compare.
* @return true if enhanced for-loop variable can be checked.
*/
private boolean canCheckEnhancedForLoopVariable(DetailAST ast)
{
return validateEnhancedForLoopVariable
|| ast.getParent().getType() != TokenTypes.FOR_EACH_CLAUSE;
}

/**
* Checks if current variable is defined in
* {@link TokenTypes#FOR_INIT for-loop init}, e.g.:
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import com.puppycrawl.tools.checkstyle.BaseCheckTestSupport;
import com.puppycrawl.tools.checkstyle.DefaultConfiguration;

import org.junit.Test;

import static com.puppycrawl.tools.checkstyle.checks.coding.FinalLocalVariableCheck.MSG_KEY;
Expand Down Expand Up @@ -96,4 +97,28 @@ public void testFalsePositive() throws Exception
};
verify(checkConfig, getPath("coding/InputFinalLocalVariableCheckFalsePositive.java"), expected);
}
@Test
public void testEnhancedForLoopVariableTrue() throws Exception
{
final DefaultConfiguration checkConfig =
createCheckConfig(FinalLocalVariableCheck.class);
checkConfig.addAttribute("tokens", "VARIABLE_DEF, PARAMETER_DEF");
checkConfig.addAttribute("validateEnhancedForLoopVariable", "true");
final String[] expected = {
"8:20: " + "Variable 'a' should be declared final.",
"15:13: " + "Variable 'x' should be declared final.",
};
verify(checkConfig, getPath("coding/InputFinalLocalVariableEnhancedForLoopVariable.java"), expected);
}
@Test
public void testEnhancedForLoopVariableFalse() throws Exception
{
final DefaultConfiguration checkConfig =
createCheckConfig(FinalLocalVariableCheck.class);
checkConfig.addAttribute("tokens", "VARIABLE_DEF, PARAMETER_DEF");
final String[] expected = {
"15:13: " + "Variable 'x' should be declared final.",
};
verify(checkConfig, getPath("coding/InputFinalLocalVariableEnhancedForLoopVariable.java"), expected);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.puppycrawl.tools.checkstyle.coding;

public class InputFinalLocalVariableEnhancedForLoopVariable {
public void method1()
{
final java.util.List<Object> list = new java.util.ArrayList<>();

for(Object a : list){
}
}

public void method2()
{
final int[] squares = {0, 1, 4, 9, 16, 25};
int x;
for (final int i : squares) {
}

}

}
13 changes: 13 additions & 0 deletions src/xdocs/config_coding.xml
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,19 @@ number.equals(i + j);
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#VARIABLE_DEF">VARIABLE_DEF</a>
</td>
</tr>
<tr>
<td>validateEnhancedForLoopVariable</td>
<td>Controls whether to check<a href = "http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2"> enhanced for-loop </a>variable.</td>
<td>
<a
href="property_types.html#boolean">Boolean</a>,
</td>
<td>
<code>
false
</code>
</td>
</tr>
</table>
</subsection>

Expand Down

0 comments on commit 000c50c

Please sign in to comment.