]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
parser: Move parsing of IS and AS type checks to dedicated function
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 22 Dec 2022 15:58:58 +0000 (16:58 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 30 Jan 2023 15:32:00 +0000 (16:32 +0100)
vala/valagenieparser.vala
vala/valaparser.vala

index 7c7c483093789389797f2876afa5d7e86016efb4..5c431006ea7a93898ea345412149be30d59b0741 100644 (file)
@@ -1433,9 +1433,22 @@ public class Vala.Genie.Parser : CodeVisitor {
                return left;
        }
 
-       Expression parse_relational_expression () throws ParseError {
+       Expression parse_type_check_expression () throws ParseError {
                var begin = get_location ();
                var left = parse_shift_expression ();
+               if (accept (TokenType.ISA)) {
+                       var type = parse_type (true, false);
+                       left = new TypeCheck (left, type, get_src (begin));
+               } else if (accept (TokenType.AS)) {
+                       var type = parse_type (true, false);
+                       left = new CastExpression.silent (left, type, get_src (begin));
+               }
+               return left;
+       }
+
+       Expression parse_relational_expression () throws ParseError {
+               var begin = get_location ();
+               var left = parse_type_check_expression ();
                bool found = true;
                while (found) {
                        var operator = get_binary_operator (current ());
@@ -1444,14 +1457,14 @@ public class Vala.Genie.Parser : CodeVisitor {
                        case BinaryOperator.LESS_THAN_OR_EQUAL:
                        case BinaryOperator.GREATER_THAN_OR_EQUAL:
                                next ();
-                               var right = parse_shift_expression ();
+                               var right = parse_type_check_expression ();
                                left = new BinaryExpression (operator, left, right, get_src (begin));
                                break;
                        case BinaryOperator.GREATER_THAN:
                                next ();
                                // ignore >> and >>= (two tokens due to generics)
                                if (current () != TokenType.OP_GT && current () != TokenType.OP_GE) {
-                                       var right = parse_shift_expression ();
+                                       var right = parse_type_check_expression ();
                                        left = new BinaryExpression (operator, left, right, get_src (begin));
                                } else {
                                        prev ();
@@ -1459,21 +1472,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                                }
                                break;
                        default:
-                               switch (current ()) {
-                               case TokenType.ISA:
-                                       next ();
-                                       var type = parse_type (true, false);
-                                       left = new TypeCheck (left, type, get_src (begin));
-                                       break;
-                               case TokenType.AS:
-                                       next ();
-                                       var type = parse_type (true, false);
-                                       left = new CastExpression.silent (left, type, get_src (begin));
-                                       break;
-                               default:
-                                       found = false;
-                                       break;
-                               }
+                               found = false;
                                break;
                        }
                }
index 68d19e588edf56865ff40c010e372daadd2c85c6..8052c97b03142ea5f44e82dc25a91ca3f2db22f3 100644 (file)
@@ -1420,9 +1420,22 @@ public class Vala.Parser : CodeVisitor {
                return left;
        }
 
-       Expression parse_relational_expression () throws ParseError {
+       Expression parse_type_check_expression () throws ParseError {
                var begin = get_location ();
                var left = parse_shift_expression ();
+               if (accept (TokenType.IS)) {
+                       var type = parse_type (true, false);
+                       left = new TypeCheck (left, type, get_src (begin));
+               } else if (accept (TokenType.AS)) {
+                       var type = parse_type (true, false);
+                       left = new CastExpression.silent (left, type, get_src (begin));
+               }
+               return left;
+       }
+
+       Expression parse_relational_expression () throws ParseError {
+               var begin = get_location ();
+               var left = parse_type_check_expression ();
 
                bool first = true;
                bool found = true;
@@ -1433,7 +1446,7 @@ public class Vala.Parser : CodeVisitor {
                        case BinaryOperator.LESS_THAN_OR_EQUAL:
                        case BinaryOperator.GREATER_THAN_OR_EQUAL:
                                next ();
-                               var right = parse_shift_expression ();
+                               var right = parse_type_check_expression ();
                                if (first) {
                                        left = new BinaryExpression (operator, left, right, get_src (begin));
                                } else {
@@ -1445,7 +1458,7 @@ public class Vala.Parser : CodeVisitor {
                                next ();
                                // ignore >> and >>= (two tokens due to generics)
                                if (current () != TokenType.OP_GT && current () != TokenType.OP_GE) {
-                                       var right = parse_shift_expression ();
+                                       var right = parse_type_check_expression ();
                                        if (first) {
                                                left = new BinaryExpression (operator, left, right, get_src (begin));
                                        } else {
@@ -1458,21 +1471,7 @@ public class Vala.Parser : CodeVisitor {
                                }
                                break;
                        default:
-                               switch (current ()) {
-                               case TokenType.IS:
-                                       next ();
-                                       var type = parse_type (true, false);
-                                       left = new TypeCheck (left, type, get_src (begin));
-                                       break;
-                               case TokenType.AS:
-                                       next ();
-                                       var type = parse_type (true, false);
-                                       left = new CastExpression.silent (left, type, get_src (begin));
-                                       break;
-                               default:
-                                       found = false;
-                                       break;
-                               }
+                               found = false;
                                break;
                        }
                }