ast: lowering: Add translate_visibility() static function
This function desugars `AST::Visibility`s into `HIR::Visibility`s, performing all the necessary checks and conversions
This commit is contained in:
parent
2a264a3693
commit
7d806eba2b
|
@ -632,6 +632,8 @@ public:
|
||||||
: public_vis_type (public_vis_type), in_path (std::move (in_path))
|
: 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.
|
// Returns whether visibility is in an error state.
|
||||||
bool is_error () const
|
bool is_error () const
|
||||||
{
|
{
|
||||||
|
@ -684,6 +686,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string as_string () const;
|
std::string as_string () const;
|
||||||
|
const SimplePath &get_path () const { return in_path; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Clone function implementation - not currently virtual but may be if
|
// Clone function implementation - not currently virtual but may be if
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "rust-diagnostics.h"
|
#include "rust-diagnostics.h"
|
||||||
|
|
||||||
|
#include "rust-ast-lower.h"
|
||||||
#include "rust-ast-lower-base.h"
|
#include "rust-ast-lower-base.h"
|
||||||
#include "rust-ast-lower-enumitem.h"
|
#include "rust-ast-lower-enumitem.h"
|
||||||
#include "rust-ast-lower-type.h"
|
#include "rust-ast-lower-type.h"
|
||||||
|
@ -59,7 +60,7 @@ public:
|
||||||
mappings->get_next_localdef_id (crate_num));
|
mappings->get_next_localdef_id (crate_num));
|
||||||
|
|
||||||
// should be lowered from module.get_vis()
|
// 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>> ();
|
auto items = std::vector<std::unique_ptr<Item>> ();
|
||||||
|
|
||||||
|
@ -99,7 +100,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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;
|
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
|
||||||
if (alias.has_generics ())
|
if (alias.has_generics ())
|
||||||
|
@ -146,7 +147,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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;
|
std::vector<HIR::TupleField> fields;
|
||||||
for (AST::TupleField &field : struct_decl.get_fields ())
|
for (AST::TupleField &field : struct_decl.get_fields ())
|
||||||
|
@ -154,7 +155,8 @@ public:
|
||||||
if (field.get_field_type ()->is_marked_for_strip ())
|
if (field.get_field_type ()->is_marked_for_strip ())
|
||||||
continue;
|
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
|
HIR::Type *type
|
||||||
= ASTLoweringType::translate (field.get_field_type ().get ());
|
= ASTLoweringType::translate (field.get_field_type ().get ());
|
||||||
|
|
||||||
|
@ -209,7 +211,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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 ();
|
bool is_unit = struct_decl.is_unit_struct ();
|
||||||
std::vector<HIR::StructField> fields;
|
std::vector<HIR::StructField> fields;
|
||||||
|
@ -218,7 +221,7 @@ public:
|
||||||
if (field.get_field_type ()->is_marked_for_strip ())
|
if (field.get_field_type ()->is_marked_for_strip ())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
HIR::Visibility vis = HIR::Visibility::create_public ();
|
HIR::Visibility vis = translate_visibility (field.get_visibility ());
|
||||||
HIR::Type *type
|
HIR::Type *type
|
||||||
= ASTLoweringType::translate (field.get_field_type ().get ());
|
= ASTLoweringType::translate (field.get_field_type ().get ());
|
||||||
|
|
||||||
|
@ -276,7 +279,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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 ();
|
// bool is_unit = enum_decl.is_zero_variant ();
|
||||||
std::vector<std::unique_ptr<HIR::EnumItem>> items;
|
std::vector<std::unique_ptr<HIR::EnumItem>> items;
|
||||||
|
@ -326,7 +329,7 @@ public:
|
||||||
std::unique_ptr<HIR::WhereClauseItem> (i));
|
std::unique_ptr<HIR::WhereClauseItem> (i));
|
||||||
}
|
}
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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;
|
std::vector<HIR::StructField> variants;
|
||||||
for (AST::StructField &variant : union_decl.get_variants ())
|
for (AST::StructField &variant : union_decl.get_variants ())
|
||||||
|
@ -334,7 +337,8 @@ public:
|
||||||
if (variant.get_field_type ()->is_marked_for_strip ())
|
if (variant.get_field_type ()->is_marked_for_strip ())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
HIR::Visibility vis = HIR::Visibility::create_public ();
|
// FIXME: Does visibility apply here?
|
||||||
|
HIR::Visibility vis = translate_visibility (variant.get_visibility ());
|
||||||
HIR::Type *type
|
HIR::Type *type
|
||||||
= ASTLoweringType::translate (variant.get_field_type ().get ());
|
= ASTLoweringType::translate (variant.get_field_type ().get ());
|
||||||
|
|
||||||
|
@ -375,7 +379,7 @@ public:
|
||||||
|
|
||||||
void visit (AST::StaticItem &var) override
|
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::Type *type = ASTLoweringType::translate (var.get_type ().get ());
|
||||||
HIR::Expr *expr = ASTLoweringExpr::translate (var.get_expr ().get ());
|
HIR::Expr *expr = ASTLoweringExpr::translate (var.get_expr ().get ());
|
||||||
|
@ -401,7 +405,7 @@ public:
|
||||||
|
|
||||||
void visit (AST::ConstantItem &constant) override
|
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::Type *type = ASTLoweringType::translate (constant.get_type ().get ());
|
||||||
HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ().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::WhereClause where_clause (std::move (where_clause_items));
|
||||||
HIR::FunctionQualifiers qualifiers
|
HIR::FunctionQualifiers qualifiers
|
||||||
= lower_qualifiers (function.get_qualifiers ());
|
= lower_qualifiers (function.get_qualifiers ());
|
||||||
HIR::Visibility vis = HIR::Visibility::create_public ();
|
HIR::Visibility vis = translate_visibility (function.get_visibility ());
|
||||||
|
|
||||||
// need
|
// need
|
||||||
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
|
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
|
||||||
|
@ -530,7 +534,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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;
|
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
|
||||||
if (impl_block.has_generics ())
|
if (impl_block.has_generics ())
|
||||||
|
@ -619,7 +623,7 @@ public:
|
||||||
}
|
}
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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;
|
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
|
||||||
if (trait.has_generics ())
|
if (trait.has_generics ())
|
||||||
|
@ -692,7 +696,7 @@ public:
|
||||||
std::unique_ptr<HIR::WhereClauseItem> (i));
|
std::unique_ptr<HIR::WhereClauseItem> (i));
|
||||||
}
|
}
|
||||||
HIR::WhereClause where_clause (std::move (where_clause_items));
|
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;
|
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
|
||||||
if (impl_block.has_generics ())
|
if (impl_block.has_generics ())
|
||||||
|
@ -774,7 +778,7 @@ public:
|
||||||
|
|
||||||
void visit (AST::ExternBlock &extern_block) override
|
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;
|
std::vector<std::unique_ptr<HIR::ExternalItem>> extern_items;
|
||||||
for (auto &item : extern_block.get_extern_items ())
|
for (auto &item : extern_block.get_extern_items ())
|
||||||
|
|
|
@ -26,6 +26,41 @@
|
||||||
namespace Rust {
|
namespace Rust {
|
||||||
namespace HIR {
|
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 (AST::Crate &astCrate) : astCrate (astCrate) {}
|
||||||
|
|
||||||
ASTLowering::~ASTLowering () {}
|
ASTLowering::~ASTLowering () {}
|
||||||
|
|
|
@ -32,6 +32,14 @@ namespace HIR {
|
||||||
bool
|
bool
|
||||||
struct_field_name_exists (std::vector<HIR::StructField> &fields,
|
struct_field_name_exists (std::vector<HIR::StructField> &fields,
|
||||||
HIR::StructField &new_field);
|
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
|
class ASTLowering
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue