| |
| // Copyright (C) 2025-2026 Free Software Foundation, Inc. |
| |
| // This file is part of GCC. |
| |
| // GCC is free software; you can redistribute it and/or modify it under |
| // the terms of the GNU General Public License as published by the Free |
| // Software Foundation; either version 3, or (at your option) any later |
| // version. |
| |
| // GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| // for more details. |
| |
| // You should have received a copy of the GNU General Public License |
| // along with GCC; see the file COPYING3. If not see |
| // <http://www.gnu.org/licenses/>. |
| |
| #ifndef RUST_PARSE_UTILS_H |
| #define RUST_PARSE_UTILS_H |
| |
| #include "rust-ast.h" |
| |
| namespace Rust { |
| namespace Parse { |
| /* Utility structure to return members of an attribute body, was initially a |
| * tuple but tuples are ugly*/ |
| struct AttributeBody |
| { |
| AST::SimplePath path; |
| std::unique_ptr<AST::AttrInput> input; |
| location_t locus; |
| }; |
| |
| namespace Utils { |
| |
| /* Returns true if the token id matches the delimiter type. Note that this only |
| * operates for END delimiter tokens. */ |
| inline bool |
| token_id_matches_delims (TokenId token_id, AST::DelimType delim_type) |
| { |
| return ((token_id == RIGHT_PAREN && delim_type == AST::PARENS) |
| || (token_id == RIGHT_SQUARE && delim_type == AST::SQUARE) |
| || (token_id == RIGHT_CURLY && delim_type == AST::CURLY)); |
| } |
| |
| /* Determines whether token is a valid simple path segment. This does not |
| * include scope resolution operators. */ |
| inline bool |
| is_simple_path_segment (TokenId id) |
| { |
| switch (id) |
| { |
| case IDENTIFIER: |
| case SUPER: |
| case SELF: |
| case CRATE: |
| return true; |
| case DOLLAR_SIGN: |
| // assume that dollar sign leads to $crate |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| /* Returns whether the token id is (or is likely to be) a right angle bracket. |
| * i.e. '>', '>>', '>=' and '>>=' tokens. */ |
| inline bool |
| is_right_angle_tok (TokenId id) |
| { |
| switch (id) |
| { |
| case RIGHT_ANGLE: |
| case RIGHT_SHIFT: |
| case GREATER_OR_EQUAL: |
| case RIGHT_SHIFT_EQ: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| /* Returns whether the token can start a type (i.e. there is a valid type |
| * beginning with the token). */ |
| inline bool |
| can_tok_start_type (TokenId id) |
| { |
| switch (id) |
| { |
| case EXCLAM: |
| case LEFT_SQUARE: |
| case LEFT_ANGLE: |
| case UNDERSCORE: |
| case ASTERISK: |
| case AMP: |
| case LIFETIME: |
| case IDENTIFIER: |
| case SUPER: |
| case SELF: |
| case SELF_ALIAS: |
| case CRATE: |
| case DOLLAR_SIGN: |
| case SCOPE_RESOLUTION: |
| case LEFT_PAREN: |
| case FOR: |
| case ASYNC: |
| case CONST: |
| case UNSAFE: |
| case EXTERN_KW: |
| case FN_KW: |
| case IMPL: |
| case DYN: |
| case QUESTION_MARK: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| } // namespace Utils |
| |
| } // namespace Parse |
| } // namespace Rust |
| |
| #endif /* !RUST_PARSE_UTILS_H */ |