forked from checkstyle/checkstyle
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Issue checkstyle#8764: New Check: IllegalIdentifierName
- Loading branch information
Showing
13 changed files
with
876 additions
and
0 deletions.
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
89 changes: 89 additions & 0 deletions
89
.../java/org/checkstyle/suppressionxpathfilter/XpathRegressionIllegalIdentifierNameTest.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,89 @@ | ||
//////////////////////////////////////////////////////////////////////////////// | ||
// checkstyle: Checks Java source code for adherence to a set of rules. | ||
// Copyright (C) 2001-2020 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 org.checkstyle.suppressionxpathfilter; | ||
|
||
import java.io.File; | ||
import java.util.Collections; | ||
import java.util.List; | ||
|
||
import org.junit.jupiter.api.Test; | ||
|
||
import com.puppycrawl.tools.checkstyle.DefaultConfiguration; | ||
import com.puppycrawl.tools.checkstyle.checks.naming.AbstractNameCheck; | ||
import com.puppycrawl.tools.checkstyle.checks.naming.IllegalIdentifierNameCheck; | ||
|
||
public class XpathRegressionIllegalIdentifierNameTest extends AbstractXpathTestSupport { | ||
|
||
private final String checkName = IllegalIdentifierNameCheck.class.getSimpleName(); | ||
|
||
@Override | ||
protected String getCheckName() { | ||
return checkName; | ||
} | ||
|
||
@Test | ||
public void testOne() throws Exception { | ||
final File fileToProcess = new File(getNonCompilablePath( | ||
"SuppressionXpathRegressionIllegalIdentifierNameTestOne.java")); | ||
|
||
final DefaultConfiguration moduleConfig = | ||
createModuleConfig(IllegalIdentifierNameCheck.class); | ||
|
||
final String format = "(?i)^(?!(record|yield|var)$).+$"; | ||
|
||
final String[] expectedViolation = { | ||
"10:20: " + getCheckMessage(IllegalIdentifierNameCheck.class, | ||
AbstractNameCheck.MSG_INVALID_PATTERN, "yield", format), | ||
}; | ||
|
||
final List<String> expectedXpathQueries = Collections.singletonList( | ||
"/RECORD_DEF[./IDENT[@text='SuppressionXpathRegressionIllegalIdentifierNameTestOne'" | ||
+ "]]/RECORD_COMPONENTS/RECORD_COMPONENT_DEF/IDENT[@text='yield']" | ||
); | ||
|
||
runVerifications(moduleConfig, fileToProcess, expectedViolation, | ||
expectedXpathQueries); | ||
} | ||
|
||
@Test | ||
public void testTwo() throws Exception { | ||
final File fileToProcess = new File(getNonCompilablePath( | ||
"SuppressionXpathRegressionIllegalIdentifierNameTestTwo.java")); | ||
|
||
final DefaultConfiguration moduleConfig = | ||
createModuleConfig(IllegalIdentifierNameCheck.class); | ||
|
||
final String format = "(?i)^(?!(record|yield|var)$).+$"; | ||
|
||
final String[] expectedViolation = { | ||
"9:17: " + getCheckMessage(IllegalIdentifierNameCheck.class, | ||
AbstractNameCheck.MSG_INVALID_PATTERN, "yield", format), | ||
}; | ||
|
||
final List<String> expectedXpathQueries = Collections.singletonList( | ||
"/CLASS_DEF[./IDENT[@text='SuppressionXpathRegressionIllegalIdentifierNameTestTwo']" | ||
+ "]/OBJBLOCK/METHOD_DEF[./IDENT[@text='foo']]/PARAMETERS/PARAMETER_DEF" | ||
+ "/IDENT[@text='yield']" | ||
); | ||
|
||
runVerifications(moduleConfig, fileToProcess, expectedViolation, | ||
expectedXpathQueries); | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
...hfilter/illegalidentifiername/SuppressionXpathRegressionIllegalIdentifierNameTestOne.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,12 @@ | ||
//non-compiled with javac: Compilable with Java14 | ||
package org.checkstyle.suppressionxpathfilter.illegalidentifiername; | ||
|
||
/* Config: | ||
* | ||
* default | ||
*/ | ||
public record SuppressionXpathRegressionIllegalIdentifierNameTestOne | ||
(String string, | ||
String yield, // warn | ||
String otherString){ | ||
} |
17 changes: 17 additions & 0 deletions
17
...hfilter/illegalidentifiername/SuppressionXpathRegressionIllegalIdentifierNameTestTwo.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,17 @@ | ||
//non-compiled with javac: Compilable with Java14 | ||
package org.checkstyle.suppressionxpathfilter.illegalidentifiername; | ||
|
||
/* Config: | ||
* | ||
* default | ||
*/ | ||
public class SuppressionXpathRegressionIllegalIdentifierNameTestTwo { | ||
int foo(int yield) { // warn | ||
return switch (yield) { | ||
case 1 -> 2; | ||
case 2 -> 3; | ||
case 3 -> 4; | ||
default -> 5; | ||
}; | ||
} | ||
} |
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
178 changes: 178 additions & 0 deletions
178
src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/IllegalIdentifierNameCheck.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,178 @@ | ||
//////////////////////////////////////////////////////////////////////////////// | ||
// checkstyle: Checks Java source code for adherence to a set of rules. | ||
// Copyright (C) 2001-2020 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.naming; | ||
|
||
import com.puppycrawl.tools.checkstyle.StatelessCheck; | ||
import com.puppycrawl.tools.checkstyle.api.DetailAST; | ||
import com.puppycrawl.tools.checkstyle.api.TokenTypes; | ||
import com.puppycrawl.tools.checkstyle.utils.CommonUtil; | ||
|
||
/** | ||
* <p> | ||
* Checks identifiers for a set of illegal names, such as those that are restricted or contextual | ||
* keywords. Examples include "yield", "record", and "var". Please read more at | ||
* <a href="https://docs.oracle.com/javase/specs/jls/se14/html/jls-3.html#jls-3.9"> | ||
* Java Language Specification</a> to get to know more about restricted keywords. | ||
* </p> | ||
* <ul> | ||
* <li> | ||
* Property {@code format} - Specifies valid identifiers. | ||
* Type is {@code java.util.regex.Pattern}. | ||
* Default value is {@code "(?i)^(?!(record|yield|var)$).+$"}. | ||
* </li> | ||
* <li> | ||
* Property {@code tokens} - tokens to check | ||
* Type is {@code java.lang.String[]}. | ||
* Validation type is {@code tokenSet}. | ||
* Default value is: | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#CLASS_DEF"> | ||
* CLASS_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#INTERFACE_DEF"> | ||
* INTERFACE_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ENUM_DEF"> | ||
* ENUM_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ANNOTATION_DEF"> | ||
* ANNOTATION_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ANNOTATION_FIELD_DEF"> | ||
* ANNOTATION_FIELD_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#PARAMETER_DEF"> | ||
* PARAMETER_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#VARIABLE_DEF"> | ||
* VARIABLE_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#METHOD_DEF"> | ||
* METHOD_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ENUM_CONSTANT_DEF"> | ||
* ENUM_CONSTANT_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#PATTERN_VARIABLE_DEF"> | ||
* PATTERN_VARIABLE_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#RECORD_DEF"> | ||
* RECORD_DEF</a>, | ||
* <a href="https://checkstyle.org/apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#RECORD_COMPONENT_DEF"> | ||
* RECORD_COMPONENT_DEF</a>. | ||
* </li> | ||
* </ul> | ||
* <p> | ||
* To configure the check: | ||
* </p> | ||
* <p>Configuration:</p> | ||
* <pre> | ||
* <module name="IllegalIdentifierName"/> | ||
* </pre> | ||
* <p> | ||
* Example: | ||
* </p> | ||
* <pre> | ||
* public class TestClass { | ||
* public static void main(String... args) { | ||
* var var = 4; // violation, "var" should not be used as an identifier. | ||
* int record = 15; // violation, "record" should not be used as an identifier. | ||
* String yield = "yield"; // violation, "yield" should not be used as an identifier. | ||
* | ||
* record Record // violation, "Record" should not be used as an idenitifier. | ||
* (Record record) { // violation, "record" should not be used as an identifier. | ||
* } | ||
* | ||
* String yieldString = "yieldString"; // ok, part of another word | ||
* record MyRecord(){} // ok, part of another word | ||
* var variable = 2; // ok, part of another word | ||
* } | ||
* } | ||
* </pre> | ||
* <p> | ||
* To configure the check to include "open" and "transitive" in the set of illegal identifiers: | ||
* </p> | ||
* <p>Configuration:</p> | ||
* <pre> | ||
* <module name="IllegalIdentifierName"> | ||
* <property name="format" value="(?i)^(?!(record|yield|var|open|transitive)$).+$"/> | ||
* </module> | ||
* </pre> | ||
* <p>Example:</p> | ||
* <pre> | ||
* public class TestClass { | ||
* public static void main(String... args) { | ||
* | ||
* int open = 4; // violation, "open" should not be used as an identifier | ||
* Object transitive = "transitive"; // violation, "transitive" should not | ||
* // be used as an identifier | ||
* | ||
* int openInt = 4; // ok, "open" is part of another word | ||
* Object transitiveObject = "transitiveObject"; // ok, "transitive" is part of another word | ||
* } | ||
* } | ||
* </pre> | ||
* <p> | ||
* Parent is {@code com.puppycrawl.tools.checkstyle.TreeWalker} | ||
* </p> | ||
* <p> | ||
* Violation Message Keys: | ||
* </p> | ||
* <ul> | ||
* <li> | ||
* {@code name.invalidPattern} | ||
* </li> | ||
* </ul> | ||
* | ||
* @since 8.36 | ||
*/ | ||
@StatelessCheck | ||
public class IllegalIdentifierNameCheck extends AbstractNameCheck { | ||
|
||
/** | ||
* Creates a new {@code IllegalIdentifierNameCheck} instance. | ||
*/ | ||
public IllegalIdentifierNameCheck() { | ||
super("(?i)^(?!(record|yield|var)$).+$"); | ||
} | ||
|
||
@Override | ||
public int[] getDefaultTokens() { | ||
return getAcceptableTokens(); | ||
} | ||
|
||
@Override | ||
public int[] getAcceptableTokens() { | ||
return new int[] { | ||
TokenTypes.CLASS_DEF, | ||
TokenTypes.INTERFACE_DEF, | ||
TokenTypes.ENUM_DEF, | ||
TokenTypes.ANNOTATION_DEF, | ||
TokenTypes.ANNOTATION_FIELD_DEF, | ||
TokenTypes.PARAMETER_DEF, | ||
TokenTypes.VARIABLE_DEF, | ||
TokenTypes.METHOD_DEF, | ||
TokenTypes.ENUM_CONSTANT_DEF, | ||
TokenTypes.PATTERN_VARIABLE_DEF, | ||
TokenTypes.RECORD_DEF, | ||
TokenTypes.RECORD_COMPONENT_DEF, | ||
}; | ||
} | ||
|
||
@Override | ||
public int[] getRequiredTokens() { | ||
return CommonUtil.EMPTY_INT_ARRAY; | ||
} | ||
|
||
@Override | ||
protected boolean mustCheckName(DetailAST ast) { | ||
return ast.findFirstToken(TokenTypes.IDENT) != null; | ||
} | ||
|
||
} |
31 changes: 31 additions & 0 deletions
31
...sources/com/puppycrawl/tools/checkstyle/meta/checks/naming/IllegalIdentifierNameCheck.xml
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,31 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<checkstyle-metadata> | ||
<module> | ||
<check fully-qualified-name="com.puppycrawl.tools.checkstyle.checks.naming.IllegalIdentifierNameCheck" | ||
name="IllegalIdentifierName" | ||
parent="com.puppycrawl.tools.checkstyle.TreeWalker"> | ||
<description><p> | ||
Checks identifiers for a set of illegal names, such as those that are restricted or contextual | ||
keywords. Examples include "yield", "record", and "var". Please read more at | ||
<a href="https://docs.oracle.com/javase/specs/jls/se14/html/jls-3.html#jls-3.9"> | ||
Java Language Specification</a> to get to know more about restricted keywords. | ||
</p></description> | ||
<properties> | ||
<property default-value="(?i)^(?!(record|yield|var)$).+$" | ||
name="format" | ||
type="java.util.regex.Pattern"> | ||
<description>Specifies valid identifiers.</description> | ||
</property> | ||
<property default-value="CLASS_DEF,INTERFACE_DEF,ENUM_DEF,ANNOTATION_DEF,ANNOTATION_FIELD_DEF,PARAMETER_DEF,VARIABLE_DEF,METHOD_DEF,ENUM_CONSTANT_DEF,PATTERN_VARIABLE_DEF,RECORD_DEF,RECORD_COMPONENT_DEF" | ||
name="tokens" | ||
type="java.lang.String[]" | ||
validation-type="tokenSet"> | ||
<description>tokens to check</description> | ||
</property> | ||
</properties> | ||
<message-keys> | ||
<message-key key="name.invalidPattern"/> | ||
</message-keys> | ||
</check> | ||
</module> | ||
</checkstyle-metadata> |
Oops, something went wrong.