public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] ast: lowering: Add translate_visibility() static function
@ 2022-06-08 12:27 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-06-08 12:27 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:7d806eba2b6b9726455861ecab9705cb123f0df7

commit 7d806eba2b6b9726455861ecab9705cb123f0df7
Author: Arthur Cohen <arthur.cohen@embecosm.com>
Date:   Mon Apr 11 14:16:45 2022 +0200

    ast: lowering: Add translate_visibility() static function
    
    This function desugars `AST::Visibility`s into `HIR::Visibility`s,
    performing all the necessary checks and conversions

Diff:
---
 gcc/rust/ast/rust-item.h           |  3 +++
 gcc/rust/hir/rust-ast-lower-item.h | 36 ++++++++++++++++++++----------------
 gcc/rust/hir/rust-ast-lower.cc     | 35 +++++++++++++++++++++++++++++++++++
 gcc/rust/hir/rust-ast-lower.h      |  8 ++++++++
 4 files changed, 66 insertions(+), 16 deletions(-)

diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index a279088cd87..aa6bef42f71 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -632,6 +632,8 @@ public:
     : public_vis_type (public_vis_type), in_path (std::move (in_path))
   {}
 
+  PublicVisType get_public_vis_type () { return public_vis_type; }
+
   // Returns whether visibility is in an error state.
   bool is_error () const
   {
@@ -684,6 +686,7 @@ public:
   }
 
   std::string as_string () const;
+  const SimplePath &get_path () const { return in_path; }
 
 protected:
   // Clone function implementation - not currently virtual but may be if
diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h
index 376e6c2aabc..c926926c26e 100644
--- a/gcc/rust/hir/rust-ast-lower-item.h
+++ b/gcc/rust/hir/rust-ast-lower-item.h
@@ -21,6 +21,7 @@
 
 #include "rust-diagnostics.h"
 
+#include "rust-ast-lower.h"
 #include "rust-ast-lower-base.h"
 #include "rust-ast-lower-enumitem.h"
 #include "rust-ast-lower-type.h"
@@ -59,7 +60,7 @@ public:
 				   mappings->get_next_localdef_id (crate_num));
 
     // should be lowered from module.get_vis()
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (module.get_visibility ());
 
     auto items = std::vector<std::unique_ptr<Item>> ();
 
@@ -99,7 +100,7 @@ public:
       }
 
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (alias.get_visibility ());
 
     std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
     if (alias.has_generics ())
@@ -146,7 +147,7 @@ public:
       }
 
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (struct_decl.get_visibility ());
 
     std::vector<HIR::TupleField> fields;
     for (AST::TupleField &field : struct_decl.get_fields ())
@@ -154,7 +155,8 @@ public:
 	if (field.get_field_type ()->is_marked_for_strip ())
 	  continue;
 
-	HIR::Visibility vis = HIR::Visibility::create_public ();
+	// FIXME: How do we get the visibility from here?
+	HIR::Visibility vis = translate_visibility (field.get_visibility ());
 	HIR::Type *type
 	  = ASTLoweringType::translate (field.get_field_type ().get ());
 
@@ -209,7 +211,8 @@ public:
       }
 
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+
+    HIR::Visibility vis = translate_visibility (struct_decl.get_visibility ());
 
     bool is_unit = struct_decl.is_unit_struct ();
     std::vector<HIR::StructField> fields;
@@ -218,7 +221,7 @@ public:
 	if (field.get_field_type ()->is_marked_for_strip ())
 	  continue;
 
-	HIR::Visibility vis = HIR::Visibility::create_public ();
+	HIR::Visibility vis = translate_visibility (field.get_visibility ());
 	HIR::Type *type
 	  = ASTLoweringType::translate (field.get_field_type ().get ());
 
@@ -276,7 +279,7 @@ public:
       }
 
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (enum_decl.get_visibility ());
 
     // bool is_unit = enum_decl.is_zero_variant ();
     std::vector<std::unique_ptr<HIR::EnumItem>> items;
@@ -326,7 +329,7 @@ public:
 	  std::unique_ptr<HIR::WhereClauseItem> (i));
       }
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (union_decl.get_visibility ());
 
     std::vector<HIR::StructField> variants;
     for (AST::StructField &variant : union_decl.get_variants ())
@@ -334,7 +337,8 @@ public:
 	if (variant.get_field_type ()->is_marked_for_strip ())
 	  continue;
 
-	HIR::Visibility vis = HIR::Visibility::create_public ();
+	// FIXME: Does visibility apply here?
+	HIR::Visibility vis = translate_visibility (variant.get_visibility ());
 	HIR::Type *type
 	  = ASTLoweringType::translate (variant.get_field_type ().get ());
 
@@ -375,7 +379,7 @@ public:
 
   void visit (AST::StaticItem &var) override
   {
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (var.get_visibility ());
 
     HIR::Type *type = ASTLoweringType::translate (var.get_type ().get ());
     HIR::Expr *expr = ASTLoweringExpr::translate (var.get_expr ().get ());
@@ -401,7 +405,7 @@ public:
 
   void visit (AST::ConstantItem &constant) override
   {
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (constant.get_visibility ());
 
     HIR::Type *type = ASTLoweringType::translate (constant.get_type ().get ());
     HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ().get ());
@@ -441,7 +445,7 @@ public:
     HIR::WhereClause where_clause (std::move (where_clause_items));
     HIR::FunctionQualifiers qualifiers
       = lower_qualifiers (function.get_qualifiers ());
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (function.get_visibility ());
 
     // need
     std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
@@ -530,7 +534,7 @@ public:
       }
 
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (impl_block.get_visibility ());
 
     std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
     if (impl_block.has_generics ())
@@ -619,7 +623,7 @@ public:
       }
     HIR::WhereClause where_clause (std::move (where_clause_items));
 
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (trait.get_visibility ());
 
     std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
     if (trait.has_generics ())
@@ -692,7 +696,7 @@ public:
 	  std::unique_ptr<HIR::WhereClauseItem> (i));
       }
     HIR::WhereClause where_clause (std::move (where_clause_items));
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (impl_block.get_visibility ());
 
     std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
     if (impl_block.has_generics ())
@@ -774,7 +778,7 @@ public:
 
   void visit (AST::ExternBlock &extern_block) override
   {
-    HIR::Visibility vis = HIR::Visibility::create_public ();
+    HIR::Visibility vis = translate_visibility (extern_block.get_visibility ());
 
     std::vector<std::unique_ptr<HIR::ExternalItem>> extern_items;
     for (auto &item : extern_block.get_extern_items ())
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index c373ae90a15..1da823a8e32 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -26,6 +26,41 @@
 namespace Rust {
 namespace HIR {
 
+Visibility
+translate_visibility (const AST::Visibility &vis)
+{
+  // FIXME: How do we create a private visibility here? Is it always private if
+  // the AST vis is an error?
+  // FIXME: We need to add a `create_private()` static function to the
+  // AST::Visibility class and use it when the vis is empty in the parser...
+  if (vis.is_error ())
+    return Visibility::create_error ();
+
+  // FIXME: ... And then use this?
+  // if (vis.is_private ())
+  //   return Visibility::create_private ();
+
+  switch (vis.get_public_vis_type ())
+    {
+    case AST::Visibility::NONE:
+      return Visibility (Visibility::VisType::PUBLIC);
+    case AST::Visibility::SELF:
+      return Visibility (Visibility::VisType::PRIVATE);
+    // Desugar pub(crate) into pub(in crate) and so on
+    case AST::Visibility::CRATE:
+      return Visibility (Visibility::PUBLIC,
+			 AST::SimplePath::from_str ("crate"));
+    case AST::Visibility::SUPER:
+      return Visibility (Visibility::PUBLIC,
+			 AST::SimplePath::from_str ("super"));
+    case AST::Visibility::IN_PATH:
+      return Visibility (Visibility::VisType::PUBLIC, vis.get_path ());
+      break;
+    }
+
+  return Visibility::create_error ();
+}
+
 ASTLowering::ASTLowering (AST::Crate &astCrate) : astCrate (astCrate) {}
 
 ASTLowering::~ASTLowering () {}
diff --git a/gcc/rust/hir/rust-ast-lower.h b/gcc/rust/hir/rust-ast-lower.h
index de141380081..e1df5b24b33 100644
--- a/gcc/rust/hir/rust-ast-lower.h
+++ b/gcc/rust/hir/rust-ast-lower.h
@@ -32,6 +32,14 @@ namespace HIR {
 bool
 struct_field_name_exists (std::vector<HIR::StructField> &fields,
 			  HIR::StructField &new_field);
+
+/**
+ * Lowers a Visibility from the AST into an HIR Visibility, desugaring it in
+ * the process
+ */
+Visibility
+translate_visibility (const AST::Visibility &vis);
+
 class ASTLowering
 {
 public:


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-06-08 12:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-08 12:27 [gcc/devel/rust/master] ast: lowering: Add translate_visibility() static function Thomas Schwinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).