[gcc r14-7567] gccrs: tokenstream: Convert group markers

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:41:14 GMT 2024


https://gcc.gnu.org/g:5c8941ffd6025f713913bf8564308383c9f3b093

commit r14-7567-g5c8941ffd6025f713913bf8564308383c9f3b093
Author: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date:   Thu Apr 27 11:01:32 2023 +0200

    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>

Diff:
---
 gcc/rust/ast/rust-ast-tokenstream.cc | 42 ++++++++++++++++++++++++++++++++++++
 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 bd0b6e4cd19..417c0f30c1a 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 24be831009a..cf0f490025c 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;


More information about the Gcc-cvs mailing list