aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2022-04-11 14:16:45 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2022-04-11 17:18:02 +0200
commit7d806eba2b6b9726455861ecab9705cb123f0df7 (patch)
treef746a8bae6d6cfe81c75d0fe32c05f87349047b2 /gcc
parent2a264a36932288c2a1fe848b03eab977267761dd (diff)
downloadgcc-7d806eba2b6b9726455861ecab9705cb123f0df7.zip
gcc-7d806eba2b6b9726455861ecab9705cb123f0df7.tar.gz
gcc-7d806eba2b6b9726455861ecab9705cb123f0df7.tar.bz2
ast: lowering: Add translate_visibility() static function
This function desugars `AST::Visibility`s into `HIR::Visibility`s, performing all the necessary checks and conversions
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-item.h3
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h36
-rw-r--r--gcc/rust/hir/rust-ast-lower.cc35
-rw-r--r--gcc/rust/hir/rust-ast-lower.h8
4 files changed, 66 insertions, 16 deletions
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index a279088..aa6bef4 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 376e6c2..c926926 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 c373ae9..1da823a 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 de14138..e1df5b2 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: