diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-04-27 11:01:32 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:37:16 +0100 |
commit | 5c8941ffd6025f713913bf8564308383c9f3b093 (patch) | |
tree | 52d7709ad171e54887a404eab7bcae95729242d5 /gcc | |
parent | 0a0006806086f9c5b68dc82253ebbf5fe264330e (diff) | |
download | gcc-5c8941ffd6025f713913bf8564308383c9f3b093.zip gcc-5c8941ffd6025f713913bf8564308383c9f3b093.tar.gz gcc-5c8941ffd6025f713913bf8564308383c9f3b093.tar.bz2 |
gccrs: tokenstream: Convert group markers
Add conversion for group delimiters.
gcc/rust/ChangeLog:
* ast/rust-ast-tokenstream.cc (pop_group): Add a function to
easily collect a group from a given stack at the end of it.
(TokenStream::collect): Collect tokens as a rust compatible
Tokenstream type.
* ast/rust-ast-tokenstream.h (RUST_AST_TOKENSTREAM_H): Move
includes to stay constrained by guards.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/ast/rust-ast-tokenstream.cc | 42 | ||||
-rw-r--r-- | gcc/rust/ast/rust-ast-tokenstream.h | 8 |
2 files changed, 48 insertions, 2 deletions
diff --git a/gcc/rust/ast/rust-ast-tokenstream.cc b/gcc/rust/ast/rust-ast-tokenstream.cc index bd0b6e4..417c0f3 100644 --- a/gcc/rust/ast/rust-ast-tokenstream.cc +++ b/gcc/rust/ast/rust-ast-tokenstream.cc @@ -16,6 +16,7 @@ // along with GCC; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. #include "rust-ast-tokenstream.h" +#include "libproc_macro/proc_macro.h" namespace Rust { namespace AST { @@ -29,6 +30,47 @@ TokenStream::collect_tokens () const return tokens; } +static void +pop_group (std::vector<ProcMacro::TokenStream> &streams, + ProcMacro::Delimiter delim) +{ + auto g = ProcMacro::Group::make_group (streams.back (), delim); + streams.pop_back (); + auto tt = ProcMacro::TokenTree::make_tokentree (g); + + streams.back ().push (tt); +} + +ProcMacro::TokenStream +TokenStream::collect () const +{ + std::vector<ProcMacro::TokenStream> trees; + trees.push_back (ProcMacro::TokenStream::make_tokenstream ()); + for (auto &token : collect_tokens ()) + { + switch (token->get_id ()) + { + case RIGHT_PAREN: + pop_group (trees, ProcMacro::PARENTHESIS); + break; + case RIGHT_CURLY: + pop_group (trees, ProcMacro::BRACE); + break; + case RIGHT_SQUARE: + pop_group (trees, ProcMacro::BRACKET); + break; + case LEFT_SQUARE: + case LEFT_CURLY: + case LEFT_PAREN: + trees.push_back (ProcMacro::TokenStream::make_tokenstream ()); + break; + default: + gcc_unreachable (); + } + } + return trees.back (); +} + void TokenStream::visit (AST::Crate &crate) { diff --git a/gcc/rust/ast/rust-ast-tokenstream.h b/gcc/rust/ast/rust-ast-tokenstream.h index 24be831..cf0f490 100644 --- a/gcc/rust/ast/rust-ast-tokenstream.h +++ b/gcc/rust/ast/rust-ast-tokenstream.h @@ -16,13 +16,15 @@ // along with GCC; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. +#ifndef RUST_AST_TOKENSTREAM_H +#define RUST_AST_TOKENSTREAM_H + #include "rust-token.h" #include "rust-ast-visitor.h" #include "rust-ast.h" #include "rust-ast-full.h" -#ifndef RUST_AST_TOKENSTREAM_H -#define RUST_AST_TOKENSTREAM_H +#include "libproc_macro/tokenstream.h" namespace Rust { namespace AST { @@ -38,6 +40,8 @@ public: std::vector<TokenPtr> collect_tokens () const; + ProcMacro::TokenStream collect () const; + private: std::vector<TokenPtr> &tokens; |