Patch #3403265 from Dinesh Bolkensteyn

This commit is contained in:
Oliver Burn 2011-09-21 20:42:19 +10:00
parent e62b456579
commit 5eaba6cbaf
3 changed files with 110 additions and 5 deletions

View File

@ -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.
*
* <p>For example:</p>
* <pre>
* try (Foo foo = new Foo(); Bar bar = new Bar()) { }
* </pre>
* <p>parses as:</p>
* <pre>
* +--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 (})
* </pre>
*
* @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 <code>catch</code> keyword.
*

View File

@ -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

View File

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