mirror of
https://github.com/adelphes/android-dev-ext.git
synced 2025-12-23 09:59:25 +00:00
parse try-with-resources
This commit is contained in:
@@ -425,6 +425,7 @@ class Block extends Statement {
|
|||||||
statements = [];
|
statements = [];
|
||||||
}
|
}
|
||||||
class TryStatement extends Statement {
|
class TryStatement extends Statement {
|
||||||
|
resources = [];
|
||||||
block = null;
|
block = null;
|
||||||
catches = [];
|
catches = [];
|
||||||
}
|
}
|
||||||
@@ -1089,8 +1090,7 @@ function statementKeyword(tokens, mdecls, method, imports, typemap) {
|
|||||||
case 'try':
|
case 'try':
|
||||||
tokens.inc();
|
tokens.inc();
|
||||||
s = new TryStatement();
|
s = new TryStatement();
|
||||||
s.block = statementBlock(tokens, mdecls, method, imports, typemap);
|
tryStatement(s, tokens, mdecls, method, imports, typemap);
|
||||||
catchFinallyBlocks(s, tokens, mdecls, method, imports, typemap);
|
|
||||||
break;
|
break;
|
||||||
case 'return':
|
case 'return':
|
||||||
tokens.inc();
|
tokens.inc();
|
||||||
@@ -1162,6 +1162,44 @@ function nonVarDeclStatement(tokens, mdecls, method, imports, typemap) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {TryStatement} s
|
||||||
|
* @param {TokenList} tokens
|
||||||
|
* @param {MethodDeclarations} mdecls
|
||||||
|
* @param {SourceMC} method
|
||||||
|
* @param {ResolvedImport[]} imports
|
||||||
|
* @param {Map<string,CEIType>} typemap
|
||||||
|
*/
|
||||||
|
function tryStatement(s, tokens, mdecls, method, imports, typemap) {
|
||||||
|
mdecls.pushScope();
|
||||||
|
let is_try_with_resources = false;
|
||||||
|
if (tokens.isValue('(')) {
|
||||||
|
// try-with-resources
|
||||||
|
is_try_with_resources = true;
|
||||||
|
for (;;) {
|
||||||
|
const x = expression_or_var_decl(tokens, mdecls, method, imports, typemap);
|
||||||
|
s.resources.push(x);
|
||||||
|
if (Array.isArray(x)) {
|
||||||
|
mdecls.locals.push(...x);
|
||||||
|
}
|
||||||
|
if (tokens.isValue(';')) {
|
||||||
|
if (tokens.current.value !== ')') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tokens.expectValue(')')
|
||||||
|
}
|
||||||
|
s.block = statementBlock(tokens, mdecls, method, imports, typemap);
|
||||||
|
if (/^(catch|finally)$/.test(tokens.current.value)) {
|
||||||
|
catchFinallyBlocks(s, tokens, mdecls, method, imports, typemap);
|
||||||
|
} else if (!is_try_with_resources) {
|
||||||
|
addproblem(tokens, ParseProblem.Error(tokens.current, `Missing catch/finally block`));
|
||||||
|
}
|
||||||
|
mdecls.popScope();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {ForStatement} s
|
* @param {ForStatement} s
|
||||||
* @param {TokenList} tokens
|
* @param {TokenList} tokens
|
||||||
@@ -1306,9 +1344,6 @@ function catchFinallyBlocks(s, tokens, mdecls, method, imports, typemap) {
|
|||||||
mdecls.popScope();
|
mdecls.popScope();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!s.catches.length) {
|
|
||||||
addproblem(tokens, ParseProblem.Error(tokens.current, `Missing catch or finally block`));
|
|
||||||
}
|
|
||||||
const first_finally_idx = s.catches.findIndex(c => c instanceof Block);
|
const first_finally_idx = s.catches.findIndex(c => c instanceof Block);
|
||||||
if (first_finally_idx >= 0) {
|
if (first_finally_idx >= 0) {
|
||||||
if (s.catches.slice(first_finally_idx).find(c => !(c instanceof Block))) {
|
if (s.catches.slice(first_finally_idx).find(c => !(c instanceof Block))) {
|
||||||
|
|||||||
Reference in New Issue
Block a user