diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-01-18 20:03:37 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-02-03 13:33:40 +0100 |
commit | 2517adbe43d77b7afe94e4c581996ad07b4c3e4e (patch) | |
tree | 540ba4c028132e4b2383d03f52f59b8c47812d67 /vala/valaparser.vala | |
parent | ec37f4cef2bf5746fcc19ad1289b124bd9b0076a (diff) | |
download | vala-2517adbe43d77b7afe94e4c581996ad07b4c3e4e.tar.gz |
parser: Make parse_argument_list/parse_initializer more robust
... when --keep-going was passed or the input appears to be incomplete
Diffstat (limited to 'vala/valaparser.vala')
-rw-r--r-- | vala/valaparser.vala | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/vala/valaparser.vala b/vala/valaparser.vala index fd2b31ad2..aaae5a25a 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -579,7 +579,18 @@ public class Vala.Parser : CodeVisitor { var list = new ArrayList<Expression> (); if (current () != TokenType.CLOSE_PARENS) { do { - list.add (parse_argument ()); + try { + list.add (parse_argument ()); + } catch (ParseError e) { + if (current () == TokenType.CLOSE_PARENS) { + prev (); + report_parse_error (new ParseError.SYNTAX ("incomplete argument list")); + } else if (context.keep_going) { + report_parse_error (e); + } else { + throw e; + } + } } while (accept (TokenType.COMMA)); } expect (TokenType.CLOSE_PARENS); @@ -2732,7 +2743,18 @@ public class Vala.Parser : CodeVisitor { expect (TokenType.OPEN_BRACE); var initializer = new InitializerList (get_src (begin)); while (current () != TokenType.CLOSE_BRACE) { - initializer.append (parse_argument ()); + try { + initializer.append (parse_argument ()); + } catch (ParseError e) { + if (current () == TokenType.CLOSE_BRACE) { + prev (); + report_parse_error (new ParseError.SYNTAX ("incomplete initializer")); + } else if (context.keep_going) { + report_parse_error (e); + } else { + throw e; + } + } if (!accept (TokenType.COMMA)) { break; |