forked from checkstyle/checkstyle
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Issue checkstyle#6773: Add UnnecessarySemicolonInEnumerationCheck
- Loading branch information
Showing
17 changed files
with
399 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
120 changes: 120 additions & 0 deletions
120
...com/puppycrawl/tools/checkstyle/checks/coding/UnnecessarySemicolonInEnumerationCheck.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
//////////////////////////////////////////////////////////////////////////////// | ||
// checkstyle: Checks Java source code for adherence to a set of rules. | ||
// Copyright (C) 2001-2019 the original author or authors. | ||
// | ||
// This library is free software; you can redistribute it and/or | ||
// modify it under the terms of the GNU Lesser General Public | ||
// License as published by the Free Software Foundation; either | ||
// version 2.1 of the License, or (at your option) any later version. | ||
// | ||
// This library is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
// Lesser General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU Lesser General Public | ||
// License along with this library; if not, write to the Free Software | ||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
//////////////////////////////////////////////////////////////////////////////// | ||
|
||
package com.puppycrawl.tools.checkstyle.checks.coding; | ||
|
||
import com.puppycrawl.tools.checkstyle.StatelessCheck; | ||
import com.puppycrawl.tools.checkstyle.api.AbstractCheck; | ||
import com.puppycrawl.tools.checkstyle.api.DetailAST; | ||
import com.puppycrawl.tools.checkstyle.api.TokenTypes; | ||
|
||
/** | ||
* <p> | ||
* Checks if unnecessary semicolon is in enum definitions. | ||
* Semicolon is not needed if enum body contains only enum constants. | ||
* </p> | ||
* <p> | ||
* To configure the check: | ||
* </p> | ||
* <pre> | ||
* <module name="UnnecessarySemicolonInEnumeration"/> | ||
* </pre> | ||
* <p> | ||
* Example of violations | ||
* </p> | ||
* <pre> | ||
* enum One { | ||
* A,B; // violation | ||
* } | ||
* enum Two { | ||
* A,B,; // violation | ||
* } | ||
* enum Three { | ||
* A,B(); // violation | ||
* } | ||
* enum Four { | ||
* A,B{}; // violation | ||
* } | ||
* enum Five { | ||
* A, | ||
* B | ||
* ; // violation | ||
* } | ||
* </pre> | ||
* <p> | ||
* Example of good cases | ||
* </p> | ||
* <pre> | ||
* enum Normal { | ||
* A, | ||
* B, | ||
* ; // required ";", no violation | ||
* Normal(){} | ||
* } | ||
* enum NoSemicolon { | ||
* A, B // only enum constants, no semicolon required | ||
* } | ||
* </pre> | ||
* | ||
* @since 8.22 | ||
*/ | ||
@StatelessCheck | ||
public final class UnnecessarySemicolonInEnumerationCheck extends AbstractCheck { | ||
|
||
/** | ||
* A key is pointing to the warning message text in "messages.properties" | ||
* file. | ||
*/ | ||
public static final String MSG_SEMI = "unnecessary.semicolon"; | ||
|
||
@Override | ||
public int[] getDefaultTokens() { | ||
return getRequiredTokens(); | ||
} | ||
|
||
@Override | ||
public int[] getAcceptableTokens() { | ||
return getRequiredTokens(); | ||
} | ||
|
||
@Override | ||
public int[] getRequiredTokens() { | ||
return new int[] { | ||
TokenTypes.ENUM_DEF, | ||
}; | ||
} | ||
|
||
@Override | ||
public void visitToken(DetailAST ast) { | ||
final DetailAST enumBlock = ast.findFirstToken(TokenTypes.OBJBLOCK); | ||
final DetailAST semicolon = enumBlock.findFirstToken(TokenTypes.SEMI); | ||
if (semicolon != null && isEndOfEnumerationAfter(semicolon)) { | ||
log(semicolon, MSG_SEMI); | ||
} | ||
} | ||
|
||
/** | ||
* Checks if enum body has no code elements after enum constants semicolon. | ||
* @param ast semicolon in enum constants definition end | ||
* @return true if there is no code elements, false otherwise. | ||
*/ | ||
private static boolean isEndOfEnumerationAfter(DetailAST ast) { | ||
return ast.getNextSibling().getType() == TokenTypes.RCURLY; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
78 changes: 78 additions & 0 deletions
78
...puppycrawl/tools/checkstyle/checks/coding/UnnecessarySemicolonInEnumerationCheckTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
//////////////////////////////////////////////////////////////////////////////// | ||
// checkstyle: Checks Java source code for adherence to a set of rules. | ||
// Copyright (C) 2001-2019 the original author or authors. | ||
// | ||
// This library is free software; you can redistribute it and/or | ||
// modify it under the terms of the GNU Lesser General Public | ||
// License as published by the Free Software Foundation; either | ||
// version 2.1 of the License, or (at your option) any later version. | ||
// | ||
// This library is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
// Lesser General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU Lesser General Public | ||
// License along with this library; if not, write to the Free Software | ||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
//////////////////////////////////////////////////////////////////////////////// | ||
|
||
package com.puppycrawl.tools.checkstyle.checks.coding; | ||
|
||
import static com.puppycrawl.tools.checkstyle.checks.coding.UnnecessarySemicolonInEnumerationCheck.MSG_SEMI; | ||
|
||
import org.junit.Assert; | ||
import org.junit.Test; | ||
|
||
import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport; | ||
import com.puppycrawl.tools.checkstyle.DefaultConfiguration; | ||
import com.puppycrawl.tools.checkstyle.api.TokenTypes; | ||
|
||
/** | ||
* Test fixture for the UnnecessarySemicolonInEnumerationCheck. | ||
* | ||
*/ | ||
public class UnnecessarySemicolonInEnumerationCheckTest extends AbstractModuleTestSupport { | ||
|
||
@Override | ||
protected String getPackageLocation() { | ||
return "com/puppycrawl/tools/checkstyle/checks/coding/" | ||
+ "unnecessarysemicoloninenumeration"; | ||
} | ||
|
||
@Test | ||
public void testDefault() throws Exception { | ||
final DefaultConfiguration checkConfig = | ||
createModuleConfig(UnnecessarySemicolonInEnumerationCheck.class); | ||
|
||
final String[] expected = { | ||
"24:12: " + getCheckMessage(MSG_SEMI), | ||
"27:13: " + getCheckMessage(MSG_SEMI), | ||
"30:14: " + getCheckMessage(MSG_SEMI), | ||
"33:14: " + getCheckMessage(MSG_SEMI), | ||
"36:54: " + getCheckMessage(MSG_SEMI), | ||
"39:15: " + getCheckMessage(MSG_SEMI), | ||
"42:56: " + getCheckMessage(MSG_SEMI), | ||
"46:9: " + getCheckMessage(MSG_SEMI), | ||
"51:33: " + getCheckMessage(MSG_SEMI), | ||
"55:9: " + getCheckMessage(MSG_SEMI), | ||
}; | ||
|
||
verify(checkConfig, getPath("InputUnnecessarySemicolonInEnumeration.java"), expected); | ||
} | ||
|
||
@Test | ||
public void testTokensNotNull() { | ||
final UnnecessarySemicolonInEnumerationCheck check = | ||
new UnnecessarySemicolonInEnumerationCheck(); | ||
final int[] expected = { | ||
TokenTypes.ENUM_DEF, | ||
}; | ||
Assert.assertArrayEquals("Acceptable required tokens are invalid", | ||
expected, check.getAcceptableTokens()); | ||
Assert.assertArrayEquals("Default required tokens are invalid", | ||
expected, check.getDefaultTokens()); | ||
Assert.assertArrayEquals("Required required tokens are invalid", | ||
expected, check.getRequiredTokens()); | ||
} | ||
} |
93 changes: 93 additions & 0 deletions
93
...ecks/coding/unnecessarysemicoloninenumeration/InputUnnecessarySemicolonInEnumeration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
package com.puppycrawl.tools.checkstyle.checks.coding.unnecessarysemicoloninenumeration; | ||
|
||
public class InputUnnecessarySemicolonInEnumeration{ | ||
|
||
enum Nothing { | ||
A,B | ||
} | ||
enum Comma { | ||
A,B, | ||
} | ||
enum Paren { | ||
A,B() | ||
} | ||
enum Block { | ||
A,B{} | ||
} | ||
enum ParenAndBlock { | ||
A,B(){ public String toString() { return "";}} | ||
} | ||
enum ParenAndBlockAndComma { | ||
A,B(){ public String toString() { return "";}}, | ||
} | ||
enum Semicolon { | ||
A,B; // violation | ||
} | ||
enum CommaAndSemicolon { | ||
A,B,; // violation | ||
} | ||
enum BlockAndSemicolon { | ||
A,B{}; // violation | ||
} | ||
enum ParensAndSemicolon { | ||
A,B(); // violation | ||
} | ||
enum BlockAndCommaAndSemicolon { | ||
A,B{ public String toString() { return "";}},; // violation | ||
} | ||
enum ParensAndCommaAndSemicolon { | ||
A,B(),; // violation | ||
} | ||
enum All { | ||
A,B(){ public String toString() { return "";}},; // violation | ||
} | ||
enum SemicolonNextLine { | ||
A,B | ||
; // violation | ||
} | ||
enum NestedEnum { | ||
A, B, C; | ||
enum Nested { | ||
First, Second, Third; // violation | ||
} | ||
} | ||
enum NoEnums { | ||
; // violation | ||
} | ||
enum NoEnums2 { | ||
; | ||
{} | ||
} | ||
enum EmptyEnum { | ||
} | ||
enum Normal { | ||
A,B; | ||
void m(){} | ||
} | ||
enum CommaNormal { | ||
A,B,; | ||
{} | ||
} | ||
enum ParenNormal { | ||
A,B(); | ||
static {} | ||
} | ||
enum SemiNextLine { | ||
A, | ||
B | ||
; | ||
SemiNextLine(){} | ||
} | ||
enum BlockNormal { | ||
A,B{ public String toString() { return "";}}; | ||
BlockNormal(){} | ||
} | ||
enum ParenAndBlockNormal { | ||
A,B(){ public String toString() { return "";}}; | ||
int a = 10; | ||
} | ||
enum ParenAndBlockAndCommaNormal { | ||
A,B(){ public String toString() { return "";}},; | ||
interface a {} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.