[vala/wip/printer] parser: Handle incomplete expression statements



commit 27a649851bc9f024ef646cc1e38844ec0fe5f344
Author: Princeton Ferro <princetonferro gmail com>
Date:   Thu Apr 9 21:15:45 2020 +0200

    parser: Handle incomplete expression statements
    
    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                                  |  1 +
 .../ast/incomplete-member-access-end-of-scope.test | 24 ++++++++++++++++++++++
 vala/valaparser.vala                               | 14 ++++++++++++-
 3 files changed, 38 insertions(+), 1 deletion(-)
---
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:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]