From: Rico Tzschichholz Date: Thu, 22 Dec 2022 15:58:58 +0000 (+0100) Subject: parser: Move parsing of IS and AS type checks to dedicated function X-Git-Tag: 0.56.4~21 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=560591be5b16849ca1efb734ef7f7cb2d6ba404f;p=thirdparty%2Fvala.git parser: Move parsing of IS and AS type checks to dedicated function --- diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala index 7c7c48309..5c431006e 100644 --- a/vala/valagenieparser.vala +++ b/vala/valagenieparser.vala @@ -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; } } diff --git a/vala/valaparser.vala b/vala/valaparser.vala index 68d19e588..8052c97b0 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -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; } }