diff options
12 files changed, 348 insertions, 4 deletions
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/java.g b/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/java.g index c4b51b269..2eebc040c 100644 --- a/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/java.g +++ b/src/main/resources/com/puppycrawl/tools/checkstyle/grammars/java.g @@ -259,7 +259,9 @@ classTypeSpec[boolean addImagNode] ; classOrInterfaceType[boolean addImagNode] - : IDENT (options{warnWhenFollowAmbig=false;}: typeArguments[addImagNode])? + : ({LA(1) == AT}? annotations + | ) + IDENT (options{warnWhenFollowAmbig=false;}: typeArguments[addImagNode])? (options{greedy=true; }: // match as many as possible DOT^ IDENT (options{warnWhenFollowAmbig=false;}: typeArguments[addImagNode])? @@ -268,9 +270,11 @@ classOrInterfaceType[boolean addImagNode] // A generic type argument is a class type, a possibly bounded wildcard type or a built-in type array typeArgument[boolean addImagNode] -: ( classTypeSpec[addImagNode] +: ( ({LA(1) == AT}? annotations + | ) ( + classTypeSpec[addImagNode] | builtInTypeArraySpec[addImagNode] - | wildcardType[addImagNode] + | wildcardType[addImagNode]) ) {#typeArgument = #(#[TYPE_ARGUMENT,"TYPE_ARGUMENT"], #typeArgument);} ; @@ -912,7 +916,8 @@ ctorHead // This is a list of exception classes that the method is declared to throw throwsClause - : "throws"^ identifier ( COMMA identifier )* + : "throws"^ ({LA(1) == AT}? annotations + | ) identifier ( COMMA identifier )* ; @@ -1397,6 +1402,7 @@ postfixExpression ) | "class" | newExpression + | annotations ) //Java 8 method references. For example: List<Integer> numbers = Arrays.asList(1,2,3,4,5,6); numbers.forEach(System.out::println); diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/java8/AnnotationTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/java8/AnnotationTest.java new file mode 100644 index 000000000..a68537758 --- /dev/null +++ b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/java8/AnnotationTest.java @@ -0,0 +1,150 @@ +//////////////////////////////////////////////////////////////////////////////// +// checkstyle: Checks Java source code for adherence to a set of rules. +// Copyright (C) 2001-2014 Oliver Burn +// +// 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.grammars.java8; + +import org.junit.Test; + +import com.puppycrawl.tools.checkstyle.BaseCheckTestSupport; +import com.puppycrawl.tools.checkstyle.DefaultConfiguration; +import com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck; + +public class AnnotationTest extends BaseCheckTestSupport +{ + + @Test + public void testSimpleTypeAnnotation() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest1.java"), expected); + + } + + @Test + public void testAnnotationOnClass() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest2.java"), expected); + + } + + @Test + public void testClassCastTypeAnnotation() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest3.java"), expected); + + } + + @Test + public void testMethodParametersTypeAnnotation() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest4.java"), expected); + + } + + @Test + public void testAnnotationInThrows() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest5.java"), expected); + + } + + @Test + public void testAnnotationInGeneric() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest6.java"), expected); + + } + + @Test + public void testAnnotationOnConstructorCall() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest7.java"), expected); + + } + + @Test + public void testAnnotationNestedCall() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest8.java"), expected); + + } + + @Test + public void testAnnotationOnWildcards() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest9.java"), expected); + + } + + @Test + public void testAnnotationInCatchParameters() + throws Exception + { + final DefaultConfiguration checkConfig = + createCheckConfig(MemberNameCheck.class); + final String[] expected = {}; + verify(checkConfig, + getPath("grammars/java8/InputAnnotationsTest10.java"), expected); + + } + +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest1.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest1.java new file mode 100644 index 000000000..e17bd3e81 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest1.java @@ -0,0 +1,14 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.util.List; + +public class InputAnnotationsTest1 { + + @NonNull + List<Integer> numbers; + + @interface NonNull { + + } + +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest10.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest10.java new file mode 100644 index 000000000..0783b13c1 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest10.java @@ -0,0 +1,23 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +public class InputAnnotationsTest10 { + public static Object methodName(Object str) { + try { + return null; + + } catch (@MyAnnotation1(name = "ABC", version = 1) Exception ex) { + return ""; + } + } + + @Target(ElementType.TYPE_USE) + @interface MyAnnotation1 { + + String name(); + int version(); + } +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest2.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest2.java new file mode 100644 index 000000000..672f0f1f0 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest2.java @@ -0,0 +1,15 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Schedule +public class InputAnnotationsTest2 { + + +} + +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) +@interface Schedule { + +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest3.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest3.java new file mode 100644 index 000000000..fbd9e8b0a --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest3.java @@ -0,0 +1,18 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + + + +public class InputAnnotationsTest3 { + + public static void methodName(Object str) { + String myString = (@NonNull String) str; + } + + @Target(ElementType.TYPE_USE) + @interface NonNull { + } + +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest4.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest4.java new file mode 100644 index 000000000..fab0f7b45 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest4.java @@ -0,0 +1,17 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + + +public class InputAnnotationsTest4 { + + public static void methodName(@NotNull String args) { + + } + + @Target(ElementType.TYPE_USE) + @interface NotNull { + + } +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest5.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest5.java new file mode 100644 index 000000000..fc0393109 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest5.java @@ -0,0 +1,16 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + + +public class InputAnnotationsTest5 { + + + void monitorTemperature() throws @Critical Exception { } + + @Target(ElementType.TYPE_USE) + @interface Critical { + + } +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest6.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest6.java new file mode 100644 index 000000000..30f3e241f --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest6.java @@ -0,0 +1,17 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.util.List; + +public class InputAnnotationsTest6 { + + abstract class UnmodifiableList<T> implements @Readonly List<@Readonly T> { + } + + @Target(ElementType.TYPE_USE) + @interface Readonly { + + } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest7.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest7.java new file mode 100644 index 000000000..6c26e9315 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest7.java @@ -0,0 +1,19 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.util.List; + +public class InputAnnotationsTest7 { + + public static void main(String[] args) { + Object object = new @Interned Object(); + + } + + @Target(ElementType.TYPE_USE) + @interface Interned { + + } + +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest8.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest8.java new file mode 100644 index 000000000..c882d1434 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest8.java @@ -0,0 +1,34 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.util.Map; + +public class InputAnnotationsTest8 { + + public void main(String[] args) { + Map.@NotNull Entry entry; + MyObject myObject = new MyObject(); + myObject.<@NotBlank String>myMethod(); + myObject.new @NotNull MyObject2(); + + } + + @Target(ElementType.TYPE_USE) + @interface NotNull { + + } + + @Target(ElementType.TYPE_USE) + @interface NotBlank { + + } + + class MyObject{ + + public void myMethod(){}; + + class MyObject2{} + } + +}
\ No newline at end of file diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest9.java b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest9.java new file mode 100644 index 000000000..f91a5532f --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/grammars/java8/InputAnnotationsTest9.java @@ -0,0 +1,15 @@ +package com.puppycrawl.tools.checkstyle.grammars.java8; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.util.List; + +public class InputAnnotationsTest9 { + public static <T> void methodName(Object str) { + List<@Immutable ? extends Comparable<T>> unchangeable; + } + + @Target(ElementType.TYPE_USE) + @interface Immutable { + } +}
\ No newline at end of file |