From e76ae6ed8d34160d87b490f5f3ee92f7ba74f5aa Mon Sep 17 00:00:00 2001 From: Dmitriy Komanov Date: Sat, 17 Aug 2013 22:09:48 +0400 Subject: [PATCH] Support for '&' in nested generics --- .../whitespace/GenericWhitespaceCheck.java | 44 ++++++++++++++++++- .../InputGenericWhitespaceCheck.java | 12 +++++ .../GenericWhitespaceCheckTest.java | 2 + 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheck.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheck.java index 0b539f52c..424974974 100755 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheck.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheck.java @@ -106,8 +106,27 @@ public class GenericWhitespaceCheck extends Check } } else { - // In a nested Generic type, so can only be a '>' or ',' - if ((line.charAt(after) != '>') && (line.charAt(after) != ',')) + // In a nested Generic type, so can only be a '>' or ',' or '&' + + // In case of several extends definitions: + // + // class IntEnumValueType & IntEnum> + // ^ + // should be whitespace if followed by & -+ + // + int indexOfAmp = line.indexOf('&', after); + if ((indexOfAmp != -1) && whitespaceBetween(after, indexOfAmp, line)) + { + if (indexOfAmp - after == 0) + { + log(aAST.getLineNo(), after, "ws.notPreceded", "&"); + } + else if (indexOfAmp - after != 1) + { + log(aAST.getLineNo(), after, "ws.followed", ">"); + } + } + else if ((line.charAt(after) != '>') && (line.charAt(after) != ',')) { log(aAST.getLineNo(), after, "ws.followed", ">"); } @@ -158,4 +177,25 @@ public class GenericWhitespaceCheck extends Check log(aAST.getLineNo(), after, "ws.followed", "<"); } } + + /** + * Returns whether the specified string contains only whitespace between + * specified indices. + * + * @param fromIndex the index to start the search from. Inclusive + * @param toIndex the index to finish the search. Exclusive + * @param aLine the line to check + * @return whether there are only whitespaces (or nothing) + */ + private static boolean whitespaceBetween(int fromIndex, int toIndex, String aLine) + { + for (int i = fromIndex; i < toIndex; i++) + { + if (!Character.isWhitespace(aLine.charAt(i))) + { + return false; + } + } + return true; + } } diff --git a/src/testinputs/com/puppycrawl/tools/checkstyle/whitespace/InputGenericWhitespaceCheck.java b/src/testinputs/com/puppycrawl/tools/checkstyle/whitespace/InputGenericWhitespaceCheck.java index 976d10771..6c084b8f7 100755 --- a/src/testinputs/com/puppycrawl/tools/checkstyle/whitespace/InputGenericWhitespaceCheck.java +++ b/src/testinputs/com/puppycrawl/tools/checkstyle/whitespace/InputGenericWhitespaceCheck.java @@ -50,4 +50,16 @@ class InputGenericWhitespaceCheck implements Comparable InputGenericWhitespaceCheck(List things) { } + + public interface IntEnum { + } + + public static class IntEnumValueType & IntEnum> { + } + + public static class IntEnumValueType& IntEnum> { + } + + public static class IntEnumValueType & IntEnum> { + } } diff --git a/src/tests/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheckTest.java b/src/tests/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheckTest.java index 3f139a223..3315ab67c 100755 --- a/src/tests/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheckTest.java +++ b/src/tests/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheckTest.java @@ -69,6 +69,8 @@ public class GenericWhitespaceCheckTest "30:21: '>' is followed by an illegal character.", "42:21: '<' is preceded with whitespace.", "42:30: '>' is followed by whitespace.", + "60:59: '&' is not preceded with whitespace.", + "63:59: '>' is followed by whitespace.", }; verify(mCheckConfig, getPath("whitespace/InputGenericWhitespaceCheck.java"),