]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
parser: Handle incomplete expression statements wip/printer
authorPrinceton Ferro <princetonferro@gmail.com>
Thu, 9 Apr 2020 19:15:45 +0000 (21:15 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 9 Apr 2020 19:27:52 +0000 (21:27 +0200)
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.

tests/Makefile.am
tests/ast/incomplete-member-access-end-of-scope.test [new file with mode: 0644]
vala/valaparser.vala

index 62c70ccfa3ee842ed1277581ea4554778c48b5f2..363be76cf25fd50c757f251e66a2e847fe8af91b 100644 (file)
@@ -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 (file)
index 0000000..d2f895a
--- /dev/null
@@ -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
index cd96f4595be46dc7d3603f7b94f4fcd700fc60e3..ebf30891edabc72ddb6f9c62240b78cb08a183e5 100644 (file)
@@ -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: