From d12ffc7ea53674a661c2702908b7242a1c442466 Mon Sep 17 00:00:00 2001 From: Arin Modi Date: Sun, 18 Dec 2022 14:15:18 +0530 Subject: [PATCH] Issue #12409: Inconsistentency In Allowed Abbreviations --- ...ices_should_be_free_of_cycles_suppressions | 120 +++++++++--------- .../naming/AbbreviationAsWordInNameCheck.java | 43 ++++++- .../naming/AbbreviationAsWordInNameCheck.xml | 1 + .../AbbreviationAsWordInNameCheckTest.java | 18 +++ ...bbreviationAsWordInNameTypeSnakeStyle.java | 80 ++++++++++++ src/xdocs/config_naming.xml | 23 ++++ 6 files changed, 220 insertions(+), 65 deletions(-) create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/abbreviationaswordinname/InputAbbreviationAsWordInNameTypeSnakeStyle.java diff --git a/config/archunit-store/slices_should_be_free_of_cycles_suppressions b/config/archunit-store/slices_should_be_free_of_cycles_suppressions index ba721b27aba..38781e0ca6d 100644 --- a/config/archunit-store/slices_should_be_free_of_cycles_suppressions +++ b/config/archunit-store/slices_should_be_free_of_cycles_suppressions @@ -115,22 +115,22 @@ Cycle detected: Slice api -> \ - Method calls method in (ParameterNameCheck.java:266)\ - Method calls method in (ParameterNameCheck.java:270)\ - Method calls method in (ParameterNameCheck.java:271)\ - - Constructor ()> calls constructor ()> in (AbbreviationAsWordInNameCheck.java:314)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:463)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:464)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:481)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:484)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:493)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:509)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:510)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:530)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:531)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:533)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:534)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:551)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:553)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:663)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:666) + - Constructor ()> calls constructor ()> in (AbbreviationAsWordInNameCheck.java:336)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:485)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:486)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:503)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:506)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:515)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:531)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:532)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:552)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:553)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:555)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:556)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:573)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:575)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:696)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:699) Cycle detected: Slice api -> \ Slice checks.naming -> \ Slice utils -> \ @@ -158,8 +158,8 @@ Cycle detected: Slice api -> \ - Method calls method in (MethodNameCheck.java:232)\ - Method calls method in (ParameterNameCheck.java:236)\ - Method calls method in (ParameterNameCheck.java:238)\ - - Method gets field in (AbbreviationAsWordInNameCheck.java:457)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:497)\ + - Method gets field in (AbbreviationAsWordInNameCheck.java:479)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:519)\ 3. Dependencies of Slice utils\ - Method has parameter of type in (AnnotationUtil.java:0)\ - Method has parameter of type in (AnnotationUtil.java:0)\ @@ -535,8 +535,8 @@ Cycle detected: Slice api -> \ - Method calls method in (MethodNameCheck.java:232)\ - Method calls method in (ParameterNameCheck.java:236)\ - Method calls method in (ParameterNameCheck.java:238)\ - - Method gets field in (AbbreviationAsWordInNameCheck.java:457)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:497)\ + - Method gets field in (AbbreviationAsWordInNameCheck.java:479)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:519)\ 3. Dependencies of Slice utils\ - Method has return type in (JavadocUtil.java:0)\ - Method calls method in (JavadocUtil.java:121)\ @@ -1077,8 +1077,8 @@ Cycle detected: Slice api -> \ - Method calls method in (MethodNameCheck.java:232)\ - Method calls method in (ParameterNameCheck.java:236)\ - Method calls method in (ParameterNameCheck.java:238)\ - - Method gets field in (AbbreviationAsWordInNameCheck.java:457)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:497)\ + - Method gets field in (AbbreviationAsWordInNameCheck.java:479)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:519)\ 3. Dependencies of Slice utils\ - Method calls method in (JavadocUtil.java:102)\ - Method calls method in (JavadocUtil.java:107)\ @@ -1123,8 +1123,8 @@ Cycle detected: Slice api -> \ - Method calls method in (MethodNameCheck.java:232)\ - Method calls method in (ParameterNameCheck.java:236)\ - Method calls method in (ParameterNameCheck.java:238)\ - - Method gets field in (AbbreviationAsWordInNameCheck.java:457)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:497)\ + - Method gets field in (AbbreviationAsWordInNameCheck.java:479)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:519)\ 3. Dependencies of Slice utils\ - Method has generic return type > with type argument depending on in (XpathUtil.java:0)\ - Method has parameter of type in (XpathUtil.java:0)\ @@ -2219,22 +2219,22 @@ Cycle detected: Slice api -> \ - Method calls method in (ParameterNameCheck.java:266)\ - Method calls method in (ParameterNameCheck.java:270)\ - Method calls method in (ParameterNameCheck.java:271)\ - - Constructor ()> calls constructor ()> in (AbbreviationAsWordInNameCheck.java:314)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:463)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:464)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:481)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:484)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:493)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:509)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:510)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:530)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:531)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:533)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:534)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:551)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:553)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:663)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:666) + - Constructor ()> calls constructor ()> in (AbbreviationAsWordInNameCheck.java:336)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:485)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:486)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:503)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:506)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:515)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:531)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:532)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:552)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:553)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:555)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:556)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:573)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:575)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:696)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:699) Cycle detected: Slice api -> \ Slice utils -> \ Slice checks.javadoc.utils -> \ @@ -2406,22 +2406,22 @@ Cycle detected: Slice api -> \ - Method calls method in (ParameterNameCheck.java:266)\ - Method calls method in (ParameterNameCheck.java:270)\ - Method calls method in (ParameterNameCheck.java:271)\ - - Constructor ()> calls constructor ()> in (AbbreviationAsWordInNameCheck.java:314)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:463)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:464)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:481)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:484)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:493)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:509)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:510)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:530)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:531)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:533)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:534)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:551)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:553)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:663)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:666) + - Constructor ()> calls constructor ()> in (AbbreviationAsWordInNameCheck.java:336)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:485)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:486)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:503)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:506)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:515)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:531)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:532)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:552)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:553)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:555)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:556)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:573)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:575)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:696)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:699) Cycle detected: Slice api -> \ Slice utils -> \ Slice xpath -> \ @@ -2530,8 +2530,8 @@ Cycle detected: Slice checks.javadoc -> \ - Method calls method in (MethodNameCheck.java:232)\ - Method calls method in (ParameterNameCheck.java:236)\ - Method calls method in (ParameterNameCheck.java:238)\ - - Method gets field in (AbbreviationAsWordInNameCheck.java:457)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:497)\ + - Method gets field in (AbbreviationAsWordInNameCheck.java:479)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:519)\ 3. Dependencies of Slice utils\ - Method has return type in (JavadocUtil.java:0)\ - Method calls method in (JavadocUtil.java:121)\ @@ -2699,8 +2699,8 @@ Cycle detected: Slice checks.naming -> \ - Method calls method in (MethodNameCheck.java:232)\ - Method calls method in (ParameterNameCheck.java:236)\ - Method calls method in (ParameterNameCheck.java:238)\ - - Method gets field in (AbbreviationAsWordInNameCheck.java:457)\ - - Method calls method in (AbbreviationAsWordInNameCheck.java:497)\ + - Method gets field in (AbbreviationAsWordInNameCheck.java:479)\ + - Method calls method in (AbbreviationAsWordInNameCheck.java:519)\ 2. Dependencies of Slice utils\ - Method has return type in (CheckUtil.java:0)\ - Method has return type in (CheckUtil.java:0)\ diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheck.java index 3b8a3969a3b..a58c9284c9a 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheck.java @@ -40,6 +40,7 @@ * * Google Style Guide to get to know how to avoid long abbreviations in names. *

+ *

'_' is considered as word separator in identifier name.

*

* {@code allowedAbbreviationLength} specifies how many consecutive capital letters are * allowed in the identifier. @@ -297,6 +298,27 @@ * } * *

+ * To configure to check variables, enforce + * no abbreviations (essentially camel case) except for + * words like 'ALLOWED'. + *

+ *

Configuration:

+ *
+ * <module name="AbbreviationAsWordInName">
+ *     <property name="allowedAbbreviations" value="ALLOWED"/>
+ *     <property name="ignoreStaticFinal" value="false"/>
+ * </module>
+ * 
+ *

Example:

+ *
+ * public class MyClass {
+ *     public int counterXYZ = 1;                // OK
+ *     public final int customerID = 2;          // OK
+ *     public static int nextID = 3;             // OK
+ *     public static final int MAX_ALLOWED = 4;  // OK, abbreviation is allowed
+ * }
+ * 
+ *

* Parent is {@code com.puppycrawl.tools.checkstyle.TreeWalker} *

*

@@ -583,8 +605,17 @@ private String getDisallowedAbbreviation(String str) { else if (abbrStarted) { abbrStarted = false; - final int endIndex = index - 1; - result = getAbbreviationIfIllegal(str, beginIndex, endIndex); + final int endIndex; + final int allowedLength; + if (symbol == '_') { + endIndex = index; + allowedLength = allowedAbbreviationLength + 1; + } + else { + endIndex = index - 1; + allowedLength = allowedAbbreviationLength; + } + result = getAbbreviationIfIllegal(str, beginIndex, endIndex, allowedLength); if (result != null) { break; } @@ -594,7 +625,7 @@ else if (abbrStarted) { // if abbreviation at the end of name (example: scaleX) if (abbrStarted) { final int endIndex = str.length() - 1; - result = getAbbreviationIfIllegal(str, beginIndex, endIndex); + result = getAbbreviationIfIllegal(str, beginIndex, endIndex, allowedAbbreviationLength); } return result; } @@ -606,13 +637,15 @@ else if (abbrStarted) { * @param str name * @param beginIndex begin index * @param endIndex end index + * @param allowedLength maximum allowed length for Abbreviation * @return the abbreviation if it is bigger than required and not in the * ignore list, otherwise {@code null} */ - private String getAbbreviationIfIllegal(String str, int beginIndex, int endIndex) { + private String getAbbreviationIfIllegal(String str, int beginIndex, int endIndex, + int allowedLength) { String result = null; final int abbrLength = endIndex - beginIndex; - if (abbrLength > allowedAbbreviationLength) { + if (abbrLength > allowedLength) { final String abbr = getAbbreviation(str, beginIndex, endIndex); if (!allowedAbbreviations.contains(abbr)) { result = abbr; diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/AbbreviationAsWordInNameCheck.xml b/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/AbbreviationAsWordInNameCheck.xml index b4fd8976d7e..b3172f37e5f 100644 --- a/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/AbbreviationAsWordInNameCheck.xml +++ b/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/AbbreviationAsWordInNameCheck.xml @@ -10,6 +10,7 @@ <a href="https://checkstyle.org/styleguides/google-java-style-20180523/javaguide.html#s5.3-camel-case"> Google Style Guide</a> to get to know how to avoid long abbreviations in names. </p> + <p>'_' is considered as word separator in identifier name.</p> <p> {@code allowedAbbreviationLength} specifies how many consecutive capital letters are allowed in the identifier. diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheckTest.java index c300bbb5ae1..3ea881caa20 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbbreviationAsWordInNameCheckTest.java @@ -467,4 +467,22 @@ public void testReceiver() throws Exception { expected); } + @Test + public void testInputAbbreviationAsWordInNameTypeSnakeStyle() throws Exception { + final String[] expected = { + "13:20: " + getWarningMessage("FLAG_IS_FIRST_RUN", 4), + "16:17: " + getWarningMessage("HYBRID_LOCK_PATH", 4), + "21:17: " + getWarningMessage("__DEMOS__TESTS_VAR", 4), + "28:16: " + getWarningMessage("TESTING_FAM_23456", 4), + "33:16: " + getWarningMessage("TESTING_23456_FAM", 4), + "38:16: " + getWarningMessage("_234VIOLATION", 4), + "41:16: " + getWarningMessage("VIOLATION23456", 4), + "72:21: " + getWarningMessage("getIsFIRST_Run", 4), + "77:21: " + getWarningMessage("getBoolean_VALUES", 4), + }; + + verifyWithInlineConfigParser( + getPath("InputAbbreviationAsWordInNameTypeSnakeStyle.java"), expected); + } + } diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/abbreviationaswordinname/InputAbbreviationAsWordInNameTypeSnakeStyle.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/abbreviationaswordinname/InputAbbreviationAsWordInNameTypeSnakeStyle.java new file mode 100644 index 00000000000..9e451d323eb --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/abbreviationaswordinname/InputAbbreviationAsWordInNameTypeSnakeStyle.java @@ -0,0 +1,80 @@ +/* +AbbreviationAsWordInName +allowedAbbreviations = ORDER, OBSERVATION, UNDERSCORE, TEST + + +*/ + + +package com.puppycrawl.tools.checkstyle.checks.naming.abbreviationaswordinname; + +public class InputAbbreviationAsWordInNameTypeSnakeStyle { + // violation below 'name 'FLAG_IS_FIRST_RUN' must contain no more than '4' .* cap.*.' + public boolean FLAG_IS_FIRST_RUN = false; + + // violation below 'name 'HYBRID_LOCK_PATH' must contain no more than '4' .* cap.*.' + private int HYBRID_LOCK_PATH; + + Boolean[] BOOL_VALS = { false, true }; + + // violation below 'name '__DEMOS__TESTS_VAR' must contain no more than '4' .* cap.*.' + private int __DEMOS__TESTS_VAR = 5; + + private int __DEMO__TEST_VAR = 6; + + private int TEST_FAM_23456 = 5; + + // violation below 'name 'TESTING_FAM_23456' must contain no more than '4' .* cap.*.' + public int TESTING_FAM_23456 = 10; + + private int TEST_23456_FAM = 15; + + // violation below 'name 'TESTING_23456_FAM' must contain no more than '4' .* cap.*.' + public int TESTING_23456_FAM = 20; + + public int TEST23456 = 30; + + // violation below 'name '_234VIOLATION' must contain no more than '4' .* cap.*.' + public int _234VIOLATION = 40; + + // violation below 'name 'VIOLATION23456' must contain no more than '4' .* cap.*.' + public int VIOLATION23456 = 50; + + void getTEST() { + } // ok + + void getORDER_OBSERVATION() {} // ok + + void getNONE_Test() {} + + void getCLR_Test() {} // ok + + void getUNDERSCORE() {} // ok + + void getTEST_OBSERVATION() {} // ok + + void getTEST_UNDERSCORE() {} // ok + + void getORDER() {} // ok + + void getOBSERVATION() {} // ok + + void getORDER_UNDERSCORE() {} // ok + + int getCLRTest() { // ok + int LINE_SEP = 1; + return LINE_SEP; + } + + void getNON_ETest() {} // OK + + // violation below 'name 'getIsFIRST_Run' must contain no more than '4' .* cap.*.' + private boolean getIsFIRST_Run() { + return false; + } + + // violation below 'name 'getBoolean_VALUES' must contain no more than '4' .* cap.*.' + private boolean getBoolean_VALUES() { + return BOOL_VALS[0]; + } +} diff --git a/src/xdocs/config_naming.xml b/src/xdocs/config_naming.xml index 505781eacff..2054b230523 100644 --- a/src/xdocs/config_naming.xml +++ b/src/xdocs/config_naming.xml @@ -37,6 +37,8 @@ to get to know how to avoid long abbreviations in names.

+

'_' is considered as word separator in identifier name.

+

allowedAbbreviationLength specifies how many consecutive capital letters are allowed in the identifier. @@ -344,6 +346,27 @@ public class MyClass { public final int customerID = 2; // violation public static int nextID = 3; // OK, ignored public static final int MAX_ALLOWED = 4; // violation +} + +

+ To configure to check variables, enforce + no abbreviations (essentially camel case) except for + words like 'ALLOWED'. +

+

Configuration:

+ +<module name="AbbreviationAsWordInName"> + <property name="allowedAbbreviations" value="ALLOWED"/> + <property name="ignoreStaticFinal" value="false"/> +</module> + +

Example:

+ +public class MyClass { + public int counterXYZ = 1; // OK + public final int customerID = 2; // OK + public static int nextID = 3; // OK + public static final int MAX_ALLOWED = 4; // OK, abbreviation is allowed }