Skip to content

Commit 7d806eb

Browse files
committed
ast: lowering: Add translate_visibility() static function
This function desugars `AST::Visibility`s into `HIR::Visibility`s, performing all the necessary checks and conversions
1 parent 2a264a3 commit 7d806eb

File tree

4 files changed

+66
-16
lines changed

4 files changed

+66
-16
lines changed

gcc/rust/ast/rust-item.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,8 @@ struct Visibility
632632
: public_vis_type (public_vis_type), in_path (std::move (in_path))
633633
{}
634634

635+
PublicVisType get_public_vis_type () { return public_vis_type; }
636+
635637
// Returns whether visibility is in an error state.
636638
bool is_error () const
637639
{
@@ -684,6 +686,7 @@ struct Visibility
684686
}
685687

686688
std::string as_string () const;
689+
const SimplePath &get_path () const { return in_path; }
687690

688691
protected:
689692
// Clone function implementation - not currently virtual but may be if

gcc/rust/hir/rust-ast-lower-item.h

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "rust-diagnostics.h"
2323

24+
#include "rust-ast-lower.h"
2425
#include "rust-ast-lower-base.h"
2526
#include "rust-ast-lower-enumitem.h"
2627
#include "rust-ast-lower-type.h"
@@ -59,7 +60,7 @@ class ASTLoweringItem : public ASTLoweringBase
5960
mappings->get_next_localdef_id (crate_num));
6061

6162
// should be lowered from module.get_vis()
62-
HIR::Visibility vis = HIR::Visibility::create_public ();
63+
HIR::Visibility vis = translate_visibility (module.get_visibility ());
6364

6465
auto items = std::vector<std::unique_ptr<Item>> ();
6566

@@ -99,7 +100,7 @@ class ASTLoweringItem : public ASTLoweringBase
99100
}
100101

101102
HIR::WhereClause where_clause (std::move (where_clause_items));
102-
HIR::Visibility vis = HIR::Visibility::create_public ();
103+
HIR::Visibility vis = translate_visibility (alias.get_visibility ());
103104

104105
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
105106
if (alias.has_generics ())
@@ -146,15 +147,16 @@ class ASTLoweringItem : public ASTLoweringBase
146147
}
147148

148149
HIR::WhereClause where_clause (std::move (where_clause_items));
149-
HIR::Visibility vis = HIR::Visibility::create_public ();
150+
HIR::Visibility vis = translate_visibility (struct_decl.get_visibility ());
150151

151152
std::vector<HIR::TupleField> fields;
152153
for (AST::TupleField &field : struct_decl.get_fields ())
153154
{
154155
if (field.get_field_type ()->is_marked_for_strip ())
155156
continue;
156157

157-
HIR::Visibility vis = HIR::Visibility::create_public ();
158+
// FIXME: How do we get the visibility from here?
159+
HIR::Visibility vis = translate_visibility (field.get_visibility ());
158160
HIR::Type *type
159161
= ASTLoweringType::translate (field.get_field_type ().get ());
160162

@@ -209,7 +211,8 @@ class ASTLoweringItem : public ASTLoweringBase
209211
}
210212

211213
HIR::WhereClause where_clause (std::move (where_clause_items));
212-
HIR::Visibility vis = HIR::Visibility::create_public ();
214+
215+
HIR::Visibility vis = translate_visibility (struct_decl.get_visibility ());
213216

214217
bool is_unit = struct_decl.is_unit_struct ();
215218
std::vector<HIR::StructField> fields;
@@ -218,7 +221,7 @@ class ASTLoweringItem : public ASTLoweringBase
218221
if (field.get_field_type ()->is_marked_for_strip ())
219222
continue;
220223

221-
HIR::Visibility vis = HIR::Visibility::create_public ();
224+
HIR::Visibility vis = translate_visibility (field.get_visibility ());
222225
HIR::Type *type
223226
= ASTLoweringType::translate (field.get_field_type ().get ());
224227

@@ -276,7 +279,7 @@ class ASTLoweringItem : public ASTLoweringBase
276279
}
277280

278281
HIR::WhereClause where_clause (std::move (where_clause_items));
279-
HIR::Visibility vis = HIR::Visibility::create_public ();
282+
HIR::Visibility vis = translate_visibility (enum_decl.get_visibility ());
280283

281284
// bool is_unit = enum_decl.is_zero_variant ();
282285
std::vector<std::unique_ptr<HIR::EnumItem>> items;
@@ -326,15 +329,16 @@ class ASTLoweringItem : public ASTLoweringBase
326329
std::unique_ptr<HIR::WhereClauseItem> (i));
327330
}
328331
HIR::WhereClause where_clause (std::move (where_clause_items));
329-
HIR::Visibility vis = HIR::Visibility::create_public ();
332+
HIR::Visibility vis = translate_visibility (union_decl.get_visibility ());
330333

331334
std::vector<HIR::StructField> variants;
332335
for (AST::StructField &variant : union_decl.get_variants ())
333336
{
334337
if (variant.get_field_type ()->is_marked_for_strip ())
335338
continue;
336339

337-
HIR::Visibility vis = HIR::Visibility::create_public ();
340+
// FIXME: Does visibility apply here?
341+
HIR::Visibility vis = translate_visibility (variant.get_visibility ());
338342
HIR::Type *type
339343
= ASTLoweringType::translate (variant.get_field_type ().get ());
340344

@@ -375,7 +379,7 @@ class ASTLoweringItem : public ASTLoweringBase
375379

376380
void visit (AST::StaticItem &var) override
377381
{
378-
HIR::Visibility vis = HIR::Visibility::create_public ();
382+
HIR::Visibility vis = translate_visibility (var.get_visibility ());
379383

380384
HIR::Type *type = ASTLoweringType::translate (var.get_type ().get ());
381385
HIR::Expr *expr = ASTLoweringExpr::translate (var.get_expr ().get ());
@@ -401,7 +405,7 @@ class ASTLoweringItem : public ASTLoweringBase
401405

402406
void visit (AST::ConstantItem &constant) override
403407
{
404-
HIR::Visibility vis = HIR::Visibility::create_public ();
408+
HIR::Visibility vis = translate_visibility (constant.get_visibility ());
405409

406410
HIR::Type *type = ASTLoweringType::translate (constant.get_type ().get ());
407411
HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ().get ());
@@ -441,7 +445,7 @@ class ASTLoweringItem : public ASTLoweringBase
441445
HIR::WhereClause where_clause (std::move (where_clause_items));
442446
HIR::FunctionQualifiers qualifiers
443447
= lower_qualifiers (function.get_qualifiers ());
444-
HIR::Visibility vis = HIR::Visibility::create_public ();
448+
HIR::Visibility vis = translate_visibility (function.get_visibility ());
445449

446450
// need
447451
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
@@ -530,7 +534,7 @@ class ASTLoweringItem : public ASTLoweringBase
530534
}
531535

532536
HIR::WhereClause where_clause (std::move (where_clause_items));
533-
HIR::Visibility vis = HIR::Visibility::create_public ();
537+
HIR::Visibility vis = translate_visibility (impl_block.get_visibility ());
534538

535539
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
536540
if (impl_block.has_generics ())
@@ -619,7 +623,7 @@ class ASTLoweringItem : public ASTLoweringBase
619623
}
620624
HIR::WhereClause where_clause (std::move (where_clause_items));
621625

622-
HIR::Visibility vis = HIR::Visibility::create_public ();
626+
HIR::Visibility vis = translate_visibility (trait.get_visibility ());
623627

624628
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
625629
if (trait.has_generics ())
@@ -692,7 +696,7 @@ class ASTLoweringItem : public ASTLoweringBase
692696
std::unique_ptr<HIR::WhereClauseItem> (i));
693697
}
694698
HIR::WhereClause where_clause (std::move (where_clause_items));
695-
HIR::Visibility vis = HIR::Visibility::create_public ();
699+
HIR::Visibility vis = translate_visibility (impl_block.get_visibility ());
696700

697701
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
698702
if (impl_block.has_generics ())
@@ -774,7 +778,7 @@ class ASTLoweringItem : public ASTLoweringBase
774778

775779
void visit (AST::ExternBlock &extern_block) override
776780
{
777-
HIR::Visibility vis = HIR::Visibility::create_public ();
781+
HIR::Visibility vis = translate_visibility (extern_block.get_visibility ());
778782

779783
std::vector<std::unique_ptr<HIR::ExternalItem>> extern_items;
780784
for (auto &item : extern_block.get_extern_items ())

gcc/rust/hir/rust-ast-lower.cc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,41 @@
2626
namespace Rust {
2727
namespace HIR {
2828

29+
Visibility
30+
translate_visibility (const AST::Visibility &vis)
31+
{
32+
// FIXME: How do we create a private visibility here? Is it always private if
33+
// the AST vis is an error?
34+
// FIXME: We need to add a `create_private()` static function to the
35+
// AST::Visibility class and use it when the vis is empty in the parser...
36+
if (vis.is_error ())
37+
return Visibility::create_error ();
38+
39+
// FIXME: ... And then use this?
40+
// if (vis.is_private ())
41+
// return Visibility::create_private ();
42+
43+
switch (vis.get_public_vis_type ())
44+
{
45+
case AST::Visibility::NONE:
46+
return Visibility (Visibility::VisType::PUBLIC);
47+
case AST::Visibility::SELF:
48+
return Visibility (Visibility::VisType::PRIVATE);
49+
// Desugar pub(crate) into pub(in crate) and so on
50+
case AST::Visibility::CRATE:
51+
return Visibility (Visibility::PUBLIC,
52+
AST::SimplePath::from_str ("crate"));
53+
case AST::Visibility::SUPER:
54+
return Visibility (Visibility::PUBLIC,
55+
AST::SimplePath::from_str ("super"));
56+
case AST::Visibility::IN_PATH:
57+
return Visibility (Visibility::VisType::PUBLIC, vis.get_path ());
58+
break;
59+
}
60+
61+
return Visibility::create_error ();
62+
}
63+
2964
ASTLowering::ASTLowering (AST::Crate &astCrate) : astCrate (astCrate) {}
3065

3166
ASTLowering::~ASTLowering () {}

gcc/rust/hir/rust-ast-lower.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ namespace HIR {
3232
bool
3333
struct_field_name_exists (std::vector<HIR::StructField> &fields,
3434
HIR::StructField &new_field);
35+
36+
/**
37+
* Lowers a Visibility from the AST into an HIR Visibility, desugaring it in
38+
* the process
39+
*/
40+
Visibility
41+
translate_visibility (const AST::Visibility &vis);
42+
3543
class ASTLowering
3644
{
3745
public:

0 commit comments

Comments
 (0)