diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-04-11 14:16:45 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-04-11 17:18:02 +0200 |
commit | 7d806eba2b6b9726455861ecab9705cb123f0df7 (patch) | |
tree | f746a8bae6d6cfe81c75d0fe32c05f87349047b2 /gcc | |
parent | 2a264a36932288c2a1fe848b03eab977267761dd (diff) | |
download | gcc-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.h | 3 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.h | 36 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower.cc | 35 | ||||
-rw-r--r-- | 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 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: |