]> gcc.gnu.org Git - gcc.git/commitdiff
gccrs: ast: Add some expr TokenStream visitors
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Wed, 22 Mar 2023 13:44:05 +0000 (14:44 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:28:41 +0000 (18:28 +0100)
Implement some TokenStream expression visitor functions.

gcc/rust/ChangeLog:

* ast/rust-ast-tokenstream.cc (TokenStream::visit): Implement
visitor.
* ast/rust-ast-tokenstream.h: Add function prototype for missing
component.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/ast/rust-ast-tokenstream.cc
gcc/rust/ast/rust-ast-tokenstream.h

index d68c19a44fed445a2a20b3df2c165c8b46a9a6f1..18337ac076c1b9a5d7aa85bbaaed5323cf20d988 100644 (file)
@@ -998,36 +998,93 @@ TokenStream::visit (ArrayIndexExpr &expr)
 }
 
 void
-TokenStream::visit (TupleExpr &)
-{}
+TokenStream::visit (TupleExpr &expr)
+{
+  visit_items_as_lines (expr.get_outer_attrs ());
+  tokens.push_back (Rust::Token::make (LEFT_PAREN, expr.get_locus ()));
+  visit_items_joined_by_separator (expr.get_tuple_elems (), COMMA);
+  tokens.push_back (Rust::Token::make (RIGHT_PAREN, Location ()));
+}
 
 void
-TokenStream::visit (TupleIndexExpr &)
-{}
+TokenStream::visit (TupleIndexExpr &expr)
+{
+  visit (expr.get_tuple_expr ());
+  tokens.push_back (Rust::Token::make (DOT, expr.get_locus ()));
+  tokens.push_back (
+    Rust::Token::make_int (Location (),
+                          std::to_string (expr.get_tuple_index ())));
+}
 
 void
-TokenStream::visit (StructExprStruct &)
-{}
+TokenStream::visit (StructExprStruct &expr)
+{
+  visit (expr.get_struct_name ());
+  tokens.push_back (Rust::Token::make (LEFT_CURLY, expr.get_locus ()));
+  // FIXME: Reference says it should have fields but node doesn't have them for
+  // now. We need to disambiguate with StructExprUnit and visit fields.
+  gcc_unreachable ();
+  tokens.push_back (Rust::Token::make (RIGHT_CURLY, Location ()));
+}
 
 void
-TokenStream::visit (StructExprFieldIdentifier &)
-{}
+TokenStream::visit (StructExprFieldIdentifier &expr)
+{
+  // TODO: Add attributes
+  // visit_items_as_lines (expr.get_attrs ());
+  auto id = expr.get_field_name ();
+  tokens.push_back (
+    Rust::Token::make_identifier (expr.get_locus (), std::move (id)));
+}
 
 void
-TokenStream::visit (StructExprFieldIdentifierValue &)
-{}
+TokenStream::visit (StructExprFieldIdentifierValue &expr)
+{
+  // TODO: Add attributes
+  // visit_items_as_lines (expr.get_attrs ());
+  auto id = expr.get_field_name ();
+  tokens.push_back (
+    Rust::Token::make_identifier (expr.get_locus (), std::move (id)));
+  tokens.push_back (Rust::Token::make (COLON, Location ()));
+  visit (expr.get_value ());
+}
 
 void
-TokenStream::visit (StructExprFieldIndexValue &)
-{}
+TokenStream::visit (StructExprFieldIndexValue &expr)
+{
+  // TODO: Add attributes
+  // visit_items_as_lines (expr.get_attrs ());
+  tokens.push_back (Rust::Token::make_int (expr.get_locus (),
+                                          std::to_string (expr.get_index ())));
+  tokens.push_back (Rust::Token::make (COLON, Location ()));
+  visit (expr.get_value ());
+}
 
 void
-TokenStream::visit (StructExprStructFields &)
-{}
+TokenStream::visit (StructBase &base)
+{
+  tokens.push_back (Rust::Token::make (DOT_DOT, Location ()));
+  visit (base.get_base_struct ());
+}
+
+void
+TokenStream::visit (StructExprStructFields &expr)
+{
+  visit_items_joined_by_separator (expr.get_fields (), COMMA);
+  if (expr.has_struct_base ())
+    {
+      tokens.push_back (Rust::Token::make (COMMA, Location ()));
+      visit (expr.get_struct_base ());
+      trailing_comma ();
+    }
+}
 
 void
 TokenStream::visit (StructExprStructBase &)
-{}
+{
+  // FIXME: Implement this node
+  gcc_unreachable ();
+}
 
 void
 TokenStream::visit (CallExpr &expr)
index 58459c6317a5fe540fb9fd90d61f4a3c184d7d56..58b90fba010b6d82f8841f81aab2b24b655fd400 100644 (file)
@@ -161,6 +161,7 @@ private:
   void visit (StructExprFieldIdentifier &field);
   void visit (StructExprFieldIdentifierValue &field);
   void visit (StructExprFieldIndexValue &field);
+  void visit (StructBase &base);
   void visit (StructExprStructFields &expr);
   void visit (StructExprStructBase &expr);
   void visit (CallExpr &expr);
This page took 0.061818 seconds and 5 git commands to generate.