]> 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>
Thu, 22 Dec 2022 15:58:58 +0000 (16:58 +0100)
vala/valagenieparser.vala
vala/valaparser.vala

index 9781cd3390ecc4ffa6f7245b82fc6ef679acfb83..cca9919ebf6b03646fd5af4e5b9631975cb1e22b 100644 (file)
@@ -1440,9 +1440,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 ());
@@ -1451,14 +1464,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 ();
@@ -1466,21 +1479,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 a5d33895676d4ca7a4162ec3d545324efe745a36..d932b8b2de4bb828c5ca95e519e12729a057b012 100644 (file)
@@ -1427,9 +1427,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;
@@ -1440,7 +1453,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 {
@@ -1452,7 +1465,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 {
@@ -1465,21 +1478,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;
                        }
                }