- m = re.match(rf'''(?x)
- (?P<try>try|finally)\s*|
- (?P<catch>catch\s*(?P<err>\(\s*{_NAME_RE}\s*\)))|
- (?P<switch>switch)\s*\(|
- (?P<for>for)\s*\(|''', expr)
- if m and m.group('try'):
- if expr[m.end()] == '{':
- try_expr, expr = self._separate_at_paren(expr[m.end():], '}')
- else:
- try_expr, expr = expr[m.end() - 1:], ''
+ m = re.match(r'''(?x)
+ (?P<try>try)\s*\{|
+ (?P<if>if)\s*\(|
+ (?P<switch>switch)\s*\(|
+ (?P<for>for)\s*\(
+ ''', expr)
+ md = m.groupdict() if m else {}
+ if md.get('if'):
+ cndn, expr = self._separate_at_paren(expr[m.end() - 1:])
+ if_expr, expr = self._separate_at_paren(expr.lstrip())
+ # TODO: "else if" is not handled
+ else_expr = None
+ m = re.match(r'else\s*{', expr)
+ if m:
+ else_expr, expr = self._separate_at_paren(expr[m.end() - 1:])
+ cndn = _js_ternary(self.interpret_expression(cndn, local_vars, allow_recursion))
+ ret, should_abort = self.interpret_statement(
+ if_expr if cndn else else_expr, local_vars, allow_recursion)
+ if should_abort:
+ return ret, True
+
+ if md.get('try'):
+ try_expr, expr = self._separate_at_paren(expr[m.end() - 1:])
+ err = None