diff options
author | Princeton Ferro <princetonferro@gmail.com> | 2020-04-09 21:15:45 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-04-09 21:27:52 +0200 |
commit | 27a649851bc9f024ef646cc1e38844ec0fe5f344 (patch) | |
tree | 46d5bfc6e4a5d3ea487d0ad33d4fe885c4469a51 | |
parent | 9ae5de971d6f90961287e15441a264236a3ebd98 (diff) | |
download | vala-wip/printer.tar.gz |
parser: Handle incomplete expression statementswip/printer
Incomplete expression statements are parsed as expression statements
now, rather than local variable declarations. This primarily affects
incomplete member access expressions at the end of blocks.
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/ast/incomplete-member-access-end-of-scope.test | 24 | ||||
-rw-r--r-- | vala/valaparser.vala | 14 |
3 files changed, 38 insertions, 1 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 62c70ccfa..363be76cf 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -637,6 +637,7 @@ TESTS = \ scanner/string-escape-x-digit-length.test \ scanner/string-escape-x-empty.test \ scanner/string-escape-x.vala \ + ast/incomplete-member-access-end-of-scope.test \ ast/switch-statement.test \ parser/array-creation-invalid.test \ parser/assignment.vala \ diff --git a/tests/ast/incomplete-member-access-end-of-scope.test b/tests/ast/incomplete-member-access-end-of-scope.test new file mode 100644 index 000000000..d2f895a25 --- /dev/null +++ b/tests/ast/incomplete-member-access-end-of-scope.test @@ -0,0 +1,24 @@ +AST + +Input: + +class Thing { + public int property; +} + +void main () { + var thing = new Thing (); + thing. +} + +Output: + +1.1 | 1.11 | ValaClass +2.2 | 2.20 | ValaField +5.1 | 5.9 | ValaMethod +5.14 | 8.1 | ValaBlock +6.2 | 6.25 | ValaDeclarationStatement +6.14 | 6.25 | ValaObjectCreationExpression +6.18 | 6.22 | ValaMemberAccess +7.2 | 7.7 | ValaExpressionStatement +7.2 | 7.7 | ValaMemberAccess diff --git a/vala/valaparser.vala b/vala/valaparser.vala index cd96f4595..ebf30891e 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -1704,7 +1704,19 @@ public class Vala.Parser : CodeVisitor { var begin = get_location (); // decide between declaration and expression statement - skip_type (); + try { + skip_type (); + } catch (ParseError e) { + prev (); + var token = current (); + next (); + if (context.keep_going && (token == TokenType.DOT || token == TokenType.DOUBLE_COLON)) { + rollback (begin); + return true; + } else { + throw e; + } + } switch (current ()) { // invocation expression case TokenType.OPEN_PARENS: |