From 24ab0e93ad43a656fca70f6a7fd16b9d559bafdf Mon Sep 17 00:00:00 2001 From: Mauryan Kansara Date: Mon, 8 Apr 2024 10:35:36 +0530 Subject: [PATCH] Issue #14765: fix OverloadMethodsDeclarationOrderCheck --- .../OverloadMethodsDeclarationOrderCheck.java | 6 +++- ...rloadMethodsDeclarationOrderCheckTest.java | 9 ++++-- ...verloadMethodsDeclarationOrderRecords.java | 2 +- .../InputOverloadMethodsDeclarationOrder.java | 31 +++++++++++++++++++ .../Example1.txt | 2 ++ .../Example2.txt | 3 +- .../overloadmethodsdeclarationorder.xml | 5 ++- 7 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheck.java index 8ea37af8b1f..8fc95c85513 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheck.java @@ -110,7 +110,11 @@ private void checkOverloadMethodsGrouping(DetailAST objectBlock) { final String methodName = currentToken.findFirstToken(TokenTypes.IDENT).getText(); final Integer previousIndex = methodIndexMap.get(methodName); - if (previousIndex != null && currentIndex - previousIndex > allowedDistance) { + final DetailAST previousSibling = currentToken.getPreviousSibling(); + final boolean isMethod = previousSibling.getType() == TokenTypes.METHOD_DEF; + + if (previousIndex != null + && (!isMethod || currentIndex - previousIndex > allowedDistance)) { final int previousLineWithOverloadMethod = methodLineNumberMap.get(methodName); log(currentToken, MSG_KEY, diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheckTest.java index b36e42cab88..a3890d49905 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/OverloadMethodsDeclarationOrderCheckTest.java @@ -41,8 +41,12 @@ public void testDefault() throws Exception { final String[] expected = { "32:5: " + getCheckMessage(MSG_KEY, 21), "60:9: " + getCheckMessage(MSG_KEY, 49), - "72:5: " + getCheckMessage(MSG_KEY, 70), - "115:5: " + getCheckMessage(MSG_KEY, 104), + "65:9: " + getCheckMessage(MSG_KEY, 60), + "80:5: " + getCheckMessage(MSG_KEY, 78), + "124:5: " + getCheckMessage(MSG_KEY, 113), + "135:5: " + getCheckMessage(MSG_KEY, 129), + "146:9: " + getCheckMessage(MSG_KEY, 140), + "149:5: " + getCheckMessage(MSG_KEY, 135), }; verifyWithInlineConfigParser( getPath("InputOverloadMethodsDeclarationOrder.java"), expected); @@ -55,6 +59,7 @@ public void testOverloadMethodsDeclarationOrderRecords() throws Exception { "21:9: " + getCheckMessage(MSG_KEY, 15), "41:9: " + getCheckMessage(MSG_KEY, 35), "57:9: " + getCheckMessage(MSG_KEY, 50), + "63:9: " + getCheckMessage(MSG_KEY, 57), }; verifyWithInlineConfigParser( getNonCompilablePath("InputOverloadMethodsDeclarationOrderRecords.java"), diff --git a/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrderRecords.java b/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrderRecords.java index 6a3146bce93..9e5579828c7 100644 --- a/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrderRecords.java +++ b/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrderRecords.java @@ -60,7 +60,7 @@ public void foo() { // violation public MyClass() { } - public void foo(int i, String s) { + public void foo(int i, String s) { // violation } public void foo(String s, int i) { diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrder.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrder.java index 55aad4289a8..8760702682c 100644 --- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrder.java +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/InputOverloadMethodsDeclarationOrder.java @@ -60,6 +60,14 @@ public void fooMethod() public void overloadMethod(String s, Boolean b, int i) // violation { //some foo code + }; + + public void overloadMethod(double d) // violation + // because there is an unnecessary semicolon at the + // end of the above method, + // separating the overloaded methods. + { + // some foo code } }; } @@ -101,6 +109,7 @@ public void overloadMethod(String s) //some foo code } + // comments between overloaded methods are allowed. public void overloadMethod(boolean b) { //some foo code @@ -116,6 +125,28 @@ public void overloadMethod(String s, Boolean b, int i) // violation { //some foo code } + + void test() {} + + String str; + + private interface Testing {} + + void test(int x) {} // violation + + private class Inner { + void test() {} + + void test(String str) {} + + void test2() {} + + String str; + + void test(int x) {} // violation + } + + void test(double d) {} // violation } enum Foo2 { diff --git a/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example1.txt b/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example1.txt index e79e5db8bae..5524f7ccb11 100644 --- a/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example1.txt +++ b/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example1.txt @@ -10,6 +10,8 @@ public void foo(int i) {} public void foo(String s) {} public void foo(String s, int i) {} +// comments between overloaded methods are allowed. public void foo(int i, String s) {} public void notFoo() {} +private interface Testing() {} // xdoc section -- end diff --git a/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example2.txt b/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example2.txt index 41156b571c2..4209781f38c 100644 --- a/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example2.txt +++ b/src/xdocs-examples/resources/com/puppycrawl/tools/checkstyle/checks/coding/overloadmethodsdeclarationorder/Example2.txt @@ -11,5 +11,6 @@ public void foo(int i) {} // OK public void foo(String s) {} // OK public void notFoo() {} // violation. Have to be after foo(String s, int i) public void foo(int i, String s) {} -public void foo(String s, int i) {} +private interface Testing() {} +public void foo(String s, int i) {} // violation. Have to be after foo(int i, String s) // xdoc section -- end diff --git a/src/xdocs/checks/coding/overloadmethodsdeclarationorder.xml b/src/xdocs/checks/coding/overloadmethodsdeclarationorder.xml index aaea853c3c9..f67381b0182 100644 --- a/src/xdocs/checks/coding/overloadmethodsdeclarationorder.xml +++ b/src/xdocs/checks/coding/overloadmethodsdeclarationorder.xml @@ -30,8 +30,10 @@ public void foo(int i) {} public void foo(String s) {} public void foo(String s, int i) {} +// comments between overloaded methods are allowed. public void foo(int i, String s) {} public void notFoo() {} +private interface Testing() {}

Example of incorrect grouping of overloaded methods:

@@ -39,7 +41,8 @@ public void foo(int i) {} // OK public void foo(String s) {} // OK public void notFoo() {} // violation. Have to be after foo(String s, int i) public void foo(int i, String s) {} -public void foo(String s, int i) {} +private interface Testing() {} +public void foo(String s, int i) {} // violation. Have to be after foo(int i, String s)