From 4d214096fcc798a2bc4e71287339e6a8e08784c4 Mon Sep 17 00:00:00 2001 From: liscju Date: Wed, 7 Dec 2016 19:11:52 +0100 Subject: [PATCH] Issue #3617: make FinalLocalVariable not check multi-catch vars --- .../checks/coding/FinalLocalVariableCheck.java | 13 ++++++++++++- .../checks/coding/FinalLocalVariableCheckTest.java | 9 +++++++++ .../coding/InputFinalLocalVariableMultiCatch.java | 13 +++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/InputFinalLocalVariableMultiCatch.java diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java index 4578076e5..17f480dd7 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java @@ -195,7 +195,8 @@ public class FinalLocalVariableCheck extends AbstractCheck { if (!isInLambda(ast) && !ast.branchContains(TokenTypes.FINAL) && !isInAbstractOrNativeMethod(ast) - && !ScopeUtils.isInInterfaceBlock(ast)) { + && !ScopeUtils.isInInterfaceBlock(ast) + && !isMultipleTypeCatch(ast)) { insertParameter(ast); } break; @@ -468,6 +469,16 @@ public class FinalLocalVariableCheck extends AbstractCheck { } } + /** + * Check if given parameter definition is a multiple type catch. + * @param parameterDefAst parameter definition + * @return true if it is a multiple type catch, false otherwise + */ + private boolean isMultipleTypeCatch(DetailAST parameterDefAst) { + final DetailAST typeAst = parameterDefAst.findFirstToken(TokenTypes.TYPE); + return typeAst.getFirstChild().getType() == TokenTypes.BOR; + } + /** * Whether the final variable candidate should be removed from the list of final local variable * candidates. diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheckTest.java index fb7391bb9..2756665d7 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheckTest.java @@ -239,4 +239,13 @@ public class FinalLocalVariableCheckTest verify(checkConfig, getPath("InputFinalLocalVariableMultipleAndNestedConditions.java"), expected); } + + @Test + public void testMultiTypeCatch() throws Exception { + final DefaultConfiguration checkConfig = createCheckConfig(FinalLocalVariableCheck.class); + checkConfig.addAttribute("tokens", "PARAMETER_DEF,VARIABLE_DEF"); + final String[] expected = CommonUtils.EMPTY_STRING_ARRAY; + verify(checkConfig, getPath("InputFinalLocalVariableMultiCatch.java"), + expected); + } } diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/InputFinalLocalVariableMultiCatch.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/InputFinalLocalVariableMultiCatch.java new file mode 100644 index 000000000..3a3bc5be5 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/InputFinalLocalVariableMultiCatch.java @@ -0,0 +1,13 @@ +package com.puppycrawl.tools.checkstyle.checks.coding; + +public class InputFinalLocalVariableMultiCatch { + public void demo() throws Throwable { + try { + // do nothing + } catch (final NumberFormatException ex) { + // do nothing + } catch (IllegalStateException | NullPointerException ex) { + // do nothing + } + } +}