From 5eaba6cbaf69061220a9c51568ecf30e424cf8d2 Mon Sep 17 00:00:00 2001 From: Oliver Burn Date: Wed, 21 Sep 2011 20:42:19 +1000 Subject: [PATCH] Patch #3403265 from Dinesh Bolkensteyn --- .../tools/checkstyle/api/TokenTypes.java | 81 +++++++++++++++++++ .../tools/checkstyle/grammars/java.g | 20 ++++- .../grammars/InputJava7TryWithResources.java | 14 +++- 3 files changed, 110 insertions(+), 5 deletions(-) diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/api/TokenTypes.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/api/TokenTypes.java index 358788190..b435615f0 100755 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/api/TokenTypes.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/api/TokenTypes.java @@ -2004,6 +2004,87 @@ public final class TokenTypes * @see #LITERAL_FINALLY **/ public static final int LITERAL_TRY = GeneratedJavaTokenTypes.LITERAL_try; + + /** + * Java 7 try-with-resources construct. + * + *

For example:

+ *
+     * try (Foo foo = new Foo(); Bar bar = new Bar()) { }
+     * 
+ *

parses as:

+ *
+     * +--LITERAL_TRY (try)
+     *     |
+     *     +--RESOURCE_SPECIFICATION
+     *         |
+     *         +--LPAREN (()
+     *         +--RESOURCES
+     *             |
+     *             +--RESOURCE
+     *                 |
+     *                 +--MODIFIERS
+     *                 +--TYPE
+     *                     |
+     *                     +--IDENT (Foo)
+     *                 +--IDENT (foo)
+     *                 +--ASSIGN (=)
+     *                 +--EXPR
+     *                    |
+     *                    +--LITERAL_NEW (new)
+     *                       |
+     *                       +--IDENT (Foo)
+     *                       +--LPAREN (()
+     *                       +--ELIST
+     *                       +--RPAREN ())
+     *             +--SEMI (;)
+     *             +--RESOURCE
+     *                 |
+     *                 +--MODIFIERS
+     *                 +--TYPE
+     *                     |
+     *                     +--IDENT (Bar)
+     *                 +--IDENT (bar)
+     *                 +--ASSIGN (=)
+     *                 +--EXPR
+     *                    |
+     *                    +--LITERAL_NEW (new)
+     *                       |
+     *                       +--IDENT (Bar)
+     *                       +--LPAREN (()
+     *                       +--ELIST
+     *                       +--RPAREN ())
+     *         +--RPAREN ())
+     *     +--SLIST ({)
+     *         +--RCURLY (})
+     * 
+ * + * @see #LPAREN + * @see #RESOURCES + * @see #RESOURCE + * @see #SEMI + * @see #RPAREN + * @see #LITERAL_TRY + **/ + public static final int RESOURCE_SPECIFICATION = + GeneratedJavaTokenTypes.RESOURCE_SPECIFICATION; + + /** + * Java 7 try-with-resources construct. + * + * @see #RESOURCE_SPECIFICATION + **/ + public static final int RESOURCES = + GeneratedJavaTokenTypes.RESOURCES; + + /** + * Java 7 try-with-resources construct. + * + * @see #RESOURCE_SPECIFICATION + **/ + public static final int RESOURCE = + GeneratedJavaTokenTypes.RESOURCE; + /** * The catch keyword. * diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/grammars/java.g b/src/checkstyle/com/puppycrawl/tools/checkstyle/grammars/java.g index a3fa5be66..1821496d0 100755 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/grammars/java.g +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/grammars/java.g @@ -92,6 +92,9 @@ tokens { // we need to put it to the end to maintain binary compatibility // with previous versions DO_WHILE; + + //Tokens for Java 1.7 language enhancements + RESOURCE_SPECIFICATION; RESOURCES; RESOURCE; } { @@ -1126,15 +1129,26 @@ tryBlock : "try"^ // try-with-resources - (tryWithResources)? + (resourceSpecification)? compoundStatement (handler)* ( finallyHandler )? ; -tryWithResources - : LPAREN^ modifiers typeSpec[true] IDENT ASSIGN expression RPAREN +resourceSpecification + : LPAREN resources (SEMI)? RPAREN + {#resourceSpecification = #([RESOURCE_SPECIFICATION, "RESOURCE_SPECIFICATION"], #resourceSpecification);} + ; + +resources + : resource (SEMI resource)* + {#resources = #([RESOURCES, "RESOURCES"], #resources);} + ; + +resource + : modifiers typeSpec[true] IDENT ASSIGN expression + {#resource = #([RESOURCE, "RESOURCE"], #resource);} ; // an exception handler diff --git a/src/testinputs/com/puppycrawl/tools/checkstyle/grammars/InputJava7TryWithResources.java b/src/testinputs/com/puppycrawl/tools/checkstyle/grammars/InputJava7TryWithResources.java index e5dee0536..caeed9c55 100644 --- a/src/testinputs/com/puppycrawl/tools/checkstyle/grammars/InputJava7TryWithResources.java +++ b/src/testinputs/com/puppycrawl/tools/checkstyle/grammars/InputJava7TryWithResources.java @@ -16,10 +16,20 @@ public class InputJava7TryWithResources try (MyResource resource = new MyResource()) { } finally { } - try (MyResource resource = new MyResource()) { } + try (MyResource resource = new MyResource();) { } catch (Exception e) { } - try (MyResource resource = new MyResource()) { } + try (MyResource resource = new MyResource();) { } + catch (Exception e) { } + catch (Throwable t) { } + finally { } + + try (MyResource resource = new MyResource(); MyResource resource2 = new MyResource()) { } + catch (Exception e) { } + catch (Throwable t) { } + finally { } + + try (MyResource resource = new MyResource(); MyResource resource2 = new MyResource();) { } catch (Exception e) { } catch (Throwable t) { } finally { }