aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/hir/rust-ast-lower-stmt.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/hir/rust-ast-lower-stmt.h')
-rw-r--r--gcc/rust/hir/rust-ast-lower-stmt.h124
1 files changed, 122 insertions, 2 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-stmt.h b/gcc/rust/hir/rust-ast-lower-stmt.h
index b0763e6..c495932 100644
--- a/gcc/rust/hir/rust-ast-lower-stmt.h
+++ b/gcc/rust/hir/rust-ast-lower-stmt.h
@@ -44,8 +44,6 @@ public:
return resolver.translated;
}
- virtual ~ASTLoweringStmt () {}
-
void visit (AST::ExprStmtWithBlock &stmt) override
{
HIR::ExprWithBlock *expr
@@ -110,6 +108,128 @@ public:
mappings->insert_hir_stmt (crate_num, mapping.get_hirid (), translated);
}
+ void visit (AST::TupleStruct &struct_decl) override
+ {
+ std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
+ if (struct_decl.has_generics ())
+ {
+ generic_params
+ = lower_generic_params (struct_decl.get_generic_params ());
+ }
+
+ std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
+ HIR::WhereClause where_clause (std::move (where_clause_items));
+ HIR::Visibility vis = HIR::Visibility::create_public ();
+
+ std::vector<HIR::TupleField> fields;
+ struct_decl.iterate ([&] (AST::TupleField &field) mutable -> bool {
+ HIR::Visibility vis = HIR::Visibility::create_public ();
+ HIR::Type *type
+ = ASTLoweringType::translate (field.get_field_type ().get ());
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, field.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ mappings->get_next_localdef_id (
+ crate_num));
+
+ // FIXME
+ // AST::TupleField is missing Location info
+ Location field_locus;
+ HIR::TupleField translated_field (mapping,
+ std::unique_ptr<HIR::Type> (type), vis,
+ field_locus, field.get_outer_attrs ());
+ fields.push_back (std::move (translated_field));
+ return true;
+ });
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, struct_decl.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ mappings->get_next_localdef_id (crate_num));
+
+ translated = new HIR::TupleStruct (mapping, std::move (fields),
+ struct_decl.get_identifier (),
+ std::move (generic_params),
+ std::move (where_clause), vis,
+ struct_decl.get_outer_attrs (),
+ struct_decl.get_locus ());
+
+ mappings->insert_hir_stmt (mapping.get_crate_num (), mapping.get_hirid (),
+ translated);
+ mappings->insert_location (crate_num, mapping.get_hirid (),
+ struct_decl.get_locus ());
+ }
+
+ void visit (AST::StructStruct &struct_decl) override
+ {
+ std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
+ if (struct_decl.has_generics ())
+ {
+ generic_params
+ = lower_generic_params (struct_decl.get_generic_params ());
+ }
+
+ std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
+ HIR::WhereClause where_clause (std::move (where_clause_items));
+ HIR::Visibility vis = HIR::Visibility::create_public ();
+
+ bool is_unit = struct_decl.is_unit_struct ();
+ std::vector<HIR::StructField> fields;
+ struct_decl.iterate ([&] (AST::StructField &field) mutable -> bool {
+ HIR::Visibility vis = HIR::Visibility::create_public ();
+ HIR::Type *type
+ = ASTLoweringType::translate (field.get_field_type ().get ());
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, field.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ mappings->get_next_localdef_id (
+ crate_num));
+
+ // FIXME
+ // AST::StructField is missing Location info
+ Location field_locus;
+ HIR::StructField translated_field (mapping, field.get_field_name (),
+ std::unique_ptr<HIR::Type> (type), vis,
+ field_locus, field.get_outer_attrs ());
+ fields.push_back (std::move (translated_field));
+ return true;
+ });
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, struct_decl.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ mappings->get_next_localdef_id (crate_num));
+
+ translated = new HIR::StructStruct (mapping, std::move (fields),
+ struct_decl.get_identifier (),
+ std::move (generic_params),
+ std::move (where_clause), is_unit, vis,
+ struct_decl.get_outer_attrs (),
+ struct_decl.get_locus ());
+
+ mappings->insert_hir_stmt (mapping.get_crate_num (), mapping.get_hirid (),
+ translated);
+ mappings->insert_location (crate_num, mapping.get_hirid (),
+ struct_decl.get_locus ());
+ }
+
+ void visit (AST::EmptyStmt &empty) override
+ {
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, empty.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ mappings->get_next_localdef_id (crate_num));
+
+ translated = new HIR::EmptyStmt (mapping, empty.get_locus ());
+
+ mappings->insert_hir_stmt (mapping.get_crate_num (), mapping.get_hirid (),
+ translated);
+ mappings->insert_location (crate_num, mapping.get_hirid (),
+ empty.get_locus ());
+ }
+
private:
ASTLoweringStmt () : translated (nullptr), terminated (false) {}