From 77ee05660fe2a86766ad0b3b3d76f8aa97305912 Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Mon, 13 Dec 2010 09:58:43 +0100 Subject: [PATCH] fix for throw without argument (use var from current catch context) --- .../antlr3/src/cs2j/CSharp/JavaMaker.g | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g index 42aa72e..8144dac 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g @@ -100,6 +100,10 @@ scope NSContext { // counter to ensure that the catch vars we introduce are unique protected int dummyCatchVarCtr = 0; + + protected CommonTree dupTree(CommonTree t) { + return (CommonTree)adaptor.DupTree(t); + } } /******************************************************************************************** @@ -1192,8 +1196,13 @@ goto_statement: | 'default') ';' ; return_statement: 'return'^ expression? ';'! ; -throw_statement: - 'throw'^ expression? ';'! ; +throw_statement +// If throw exp is missing then it is the var from closest enclosing catch +@init { + CommonTree var = null; + bool missingThrowExp = true; +}: + t='throw' (e=expression { missingThrowExp = false;})? { var = missingThrowExp ? dupTree($catch_clause::throwVar) : $e.tree; } ';' -> ^($t { var }); try_statement: t='try' block ( catch_clauses finally_clause? | finally_clause) -> ^($t block catch_clauses? finally_clause?); @@ -1202,11 +1211,12 @@ try_statement: catch_clauses: catch_clause+; catch_clause +scope { CommonTree throwVar; } @init { CommonTree ty = null, var = null; }: c='catch' ('(' given_t=class_type { ty = $given_t.tree; } (given_v=identifier { var = $given_v.tree; } | magic_v=magicCatchVar { var = $magic_v.tree; } ) ')' - | magic_t=magicThrowableType magic_v=magicCatchVar { ty = $magic_t.tree; var = $magic_v.tree; }) block + | magic_t=magicThrowableType magic_v=magicCatchVar { ty = $magic_t.tree; var = $magic_v.tree; }) { $catch_clause::throwVar = var; } block -> ^($c { ty } { var } block) ; finally_clause: