From: Pierre-Emmanuel Patry Date: Thu, 27 Apr 2023 09:01:32 +0000 (+0200) Subject: gccrs: tokenstream: Convert group markers X-Git-Tag: basepoints/gcc-15~2572 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c8941ffd6025f713913bf8564308383c9f3b093;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/ast/rust-ast-tokenstream.cc b/gcc/rust/ast/rust-ast-tokenstream.cc index bd0b6e4cd191..417c0f30c1aa 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 // . #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 &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 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 24be831009a9..cf0f490025c0 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 // . +#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 collect_tokens () const; + ProcMacro::TokenStream collect () const; + private: std::vector &tokens;