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-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=144566870cb7263ba7827459bf2ec2a9aa86e193;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 9781cd339..cca9919eb 100644 --- a/vala/valagenieparser.vala +++ b/vala/valagenieparser.vala @@ -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; } } diff --git a/vala/valaparser.vala b/vala/valaparser.vala index a5d338956..d932b8b2d 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -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; } }