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 { }