summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrinceton Ferro <princetonferro@gmail.com>2020-04-09 21:15:45 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2020-04-09 21:27:52 +0200
commit27a649851bc9f024ef646cc1e38844ec0fe5f344 (patch)
tree46d5bfc6e4a5d3ea487d0ad33d4fe885c4469a51
parent9ae5de971d6f90961287e15441a264236a3ebd98 (diff)
downloadvala-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.am1
-rw-r--r--tests/ast/incomplete-member-access-end-of-scope.test24
-rw-r--r--vala/valaparser.vala14
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: