]> git.ipfire.org Git - people/ms/gcc.git/commitdiff
Feat: add visit (AST::Attribute &)
authorJiakun Fan <120090316@link.cuhk.edu.cn>
Tue, 14 Mar 2023 17:49:33 +0000 (17:49 +0000)
committerPhilip Herron <philip.herron@embecosm.com>
Fri, 17 Mar 2023 16:38:54 +0000 (16:38 +0000)
gcc/rust/ChangeLog:

* hir/rust-hir-dump.cc (Dump::go): fix format
(Dump::visit):impl `visit (AST::Attribute &)`
and `visit (Lifetime &)`
* hir/rust-hir-dump.h:add `visit (AST::Attribute &)`

Signed-off-by: Jiakun Fan <120090316@link.cuhk.edu.cn>
gcc/rust/hir/rust-hir-dump.cc
gcc/rust/hir/rust-hir-dump.h

index f2df4a0da707f836b97b17f90dcbe30aecbcce02..1585df5506bfb1b5ed90304f4665c3fcd5571706 100644 (file)
@@ -51,7 +51,9 @@ Dump::go (HIR::Crate &crate)
       stream << std::endl;
       item->accept_vis (*this);
     }
+  stream << std::endl;
   stream << indentation;
+
   stream << "]," << std::endl;
   indentation.decrement ();
   //
@@ -66,8 +68,39 @@ Dump::go (HIR::Crate &crate)
 }
 
 void
-Dump::visit (Lifetime &)
-{}
+Dump::visit (AST::Attribute &attribute)
+{
+  std::string path_str = attribute.get_path ().as_string ();
+  stream << path_str;
+  if (attribute.has_attr_input ())
+    stream << attribute.get_attr_input ().as_string ();
+}
+
+void
+Dump::visit (Lifetime &lifetime)
+{
+  if (lifetime.is_error ())
+    {
+      stream << "error lifetime";
+      return;
+    }
+
+  switch (lifetime.get_lifetime_type ())
+    {
+    case AST::Lifetime::LifetimeType::NAMED:
+      stream << "'" << lifetime.get_name ();
+      break;
+    case AST::Lifetime::LifetimeType::STATIC:
+      stream << "'static";
+      break;
+    case AST::Lifetime::LifetimeType::WILDCARD:
+      stream << "'_";
+      break;
+    default:
+      stream << "ERROR-MARK-STRING: lifetime type failure";
+      break;
+    }
+}
 void
 Dump::visit (LifetimeParam &)
 {}
@@ -235,44 +268,48 @@ Dump::visit (ClosureExpr &)
 void
 Dump::visit (BlockExpr &block_expr)
 {
-  stream << "BlockExpr: [";
-  indentation.increment ();
-  stream << std::endl;
+  stream << "BlockExpr: [\n";
 
+  indentation.increment ();
   // TODO: inner attributes
-  stream << std::string (indent, indent_char);
-  stream << "inner attributes: ";
   if (!block_expr.inner_attrs.empty ())
     {
-      for (const auto &attr : block_expr.inner_attrs)
+      stream << indentation << "inner_attrs: [";
+      indentation.increment ();
+      for (auto &attr : block_expr.inner_attrs)
        {
-         stream << std::endl;
-         stream << std::string (indent, indent_char);
-         stream << attr.as_string ();
-         // stream << attr.accept_vis(*self);
+         stream << "\n";
+         stream << indentation;
+         visit (attr);
        }
+      indentation.decrement ();
+      stream << "\n" << indentation << "]\n";
     }
 
-  stream << std::endl;
-
   // statements
+  // impl null pointer check
+
   if (block_expr.has_statements ())
     {
       auto &stmts = block_expr.get_statements ();
       for (auto &stmt : stmts)
        {
          stream << indentation << "Stmt: {\n";
-         // stream << indentation;
          stmt->accept_vis (*this);
          stream << "\n";
          stream << indentation << "}\n";
        }
     }
 
-  // // TODO: print tail expression if exists
+  // final expression
+  if (block_expr.has_expr ())
+    {
+      stream << indentation << "final expression:";
+      stream << "\n" << indentation << block_expr.expr->as_string ();
+    }
 
   indentation.decrement ();
-  stream << indentation << "]";
+  stream << "\n" << indentation << "]";
 }
 
 void
index ebdad505851d12c5cef356542ea7d15d28b99297..d0256340d4d9f94b419536f65a7718fe3b467d78 100644 (file)
@@ -37,6 +37,7 @@ private:
   Indent indentation;
   std::ostream &stream;
 
+  void visit (AST::Attribute &attribute);
   virtual void visit (Lifetime &) override;
   virtual void visit (LifetimeParam &) override;
   virtual void visit (PathInExpression &) override;