diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-10-25 17:34:21 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-10-27 10:18:33 +0100 |
commit | 1a9746032345e1bffeb9ff2c92473bf90f843379 (patch) | |
tree | dd88e4e97bcdc94943fc75309c51e6ecb9926d69 /gcc | |
parent | b01e62c136b1ebf27894c68669e265e67b941300 (diff) | |
download | gcc-1a9746032345e1bffeb9ff2c92473bf90f843379.zip gcc-1a9746032345e1bffeb9ff2c92473bf90f843379.tar.gz gcc-1a9746032345e1bffeb9ff2c92473bf90f843379.tar.bz2 |
Add HIR lowering for where clause items
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 | 72 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-type.h | 72 |
3 files changed, 140 insertions, 7 deletions
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h index a5d9a0a..fb7cc17 100644 --- a/gcc/rust/ast/rust-item.h +++ b/gcc/rust/ast/rust-item.h @@ -188,7 +188,6 @@ protected: class LifetimeWhereClauseItem : public WhereClauseItem { Lifetime lifetime; - std::vector<Lifetime> lifetime_bounds; Location locus; NodeId node_id; @@ -212,6 +211,8 @@ public: std::vector<Lifetime> &get_lifetime_bounds () { return lifetime_bounds; } + Location get_locus () const { return locus; } + protected: // Clone function implementation as (not pure) virtual method LifetimeWhereClauseItem *clone_where_clause_item_impl () const override diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h index 9372e94..db0425f 100644 --- a/gcc/rust/hir/rust-ast-lower-item.h +++ b/gcc/rust/hir/rust-ast-lower-item.h @@ -95,6 +95,14 @@ public: void visit (AST::TypeAlias &alias) override { std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; + for (auto &item : alias.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } + HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::Visibility vis = HIR::Visibility::create_public (); @@ -134,6 +142,14 @@ public: } std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; + for (auto &item : struct_decl.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } + HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::Visibility vis = HIR::Visibility::create_public (); @@ -186,6 +202,14 @@ public: } std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; + for (auto &item : struct_decl.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } + HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::Visibility vis = HIR::Visibility::create_public (); @@ -242,6 +266,14 @@ public: } std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; + for (auto &item : enum_decl.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } + HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::Visibility vis = HIR::Visibility::create_public (); @@ -282,6 +314,13 @@ public: } std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; + for (auto &item : union_decl.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::Visibility vis = HIR::Visibility::create_public (); @@ -380,8 +419,15 @@ public: void visit (AST::Function &function) override { - // ignore for now and leave empty std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; + for (auto &item : function.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } + HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::FunctionQualifiers qualifiers ( HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal); @@ -466,6 +512,13 @@ public: void visit (AST::InherentImpl &impl_block) override { std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; + for (auto &item : impl_block.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::Visibility vis = HIR::Visibility::create_public (); @@ -545,8 +598,15 @@ public: void visit (AST::Trait &trait) override { std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; - + for (auto &item : trait.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } HIR::WhereClause where_clause (std::move (where_clause_items)); + HIR::Visibility vis = HIR::Visibility::create_public (); std::vector<std::unique_ptr<HIR::GenericParam>> generic_params; @@ -632,7 +692,13 @@ public: void visit (AST::TraitImpl &impl_block) override { std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; - + for (auto &item : impl_block.get_where_clause ().get_items ()) + { + HIR::WhereClauseItem *i + = ASTLowerWhereClauseItem::translate (*item.get ()); + where_clause_items.push_back ( + std::unique_ptr<HIR::WhereClauseItem> (i)); + } HIR::WhereClause where_clause (std::move (where_clause_items)); HIR::Visibility vis = HIR::Visibility::create_public (); diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h index 0a71e3a..8205d07 100644 --- a/gcc/rust/hir/rust-ast-lower-type.h +++ b/gcc/rust/hir/rust-ast-lower-type.h @@ -60,7 +60,7 @@ public: void visit (AST::TypePath &path) override { - std::vector<std::unique_ptr<HIR::TypePathSegment> > translated_segments; + std::vector<std::unique_ptr<HIR::TypePathSegment>> translated_segments; path.iterate_segments ([&] (AST::TypePathSegment *seg) mutable -> bool { translated_segment = nullptr; @@ -188,7 +188,7 @@ public: void visit (AST::TupleType &tuple) override { - std::vector<std::unique_ptr<HIR::Type> > elems; + std::vector<std::unique_ptr<HIR::Type>> elems; for (auto &e : tuple.get_elems ()) { HIR::Type *t = ASTLoweringType::translate (e.get ()); @@ -340,7 +340,7 @@ public: void visit (AST::TypeParam ¶m) override { AST::Attribute outer_attr = AST::Attribute::create_empty (); - std::vector<std::unique_ptr<HIR::TypeParamBound> > type_param_bounds; + std::vector<std::unique_ptr<HIR::TypeParamBound>> type_param_bounds; if (param.has_type_param_bounds ()) { for (auto &bound : param.get_type_param_bounds ()) @@ -422,6 +422,72 @@ private: HIR::TypeParamBound *translated; }; +class ASTLowerWhereClauseItem : public ASTLoweringBase +{ + using Rust::HIR::ASTLoweringBase::visit; + +public: + static HIR::WhereClauseItem *translate (AST::WhereClauseItem &item) + { + ASTLowerWhereClauseItem compiler; + item.accept_vis (compiler); + rust_assert (compiler.translated != nullptr); + return compiler.translated; + } + + void visit (AST::LifetimeWhereClauseItem &item) override + { + HIR::Lifetime l = lower_lifetime (item.get_lifetime ()); + std::vector<HIR::Lifetime> lifetime_bounds; + for (auto &lifetime_bound : item.get_lifetime_bounds ()) + { + HIR::Lifetime ll = lower_lifetime (lifetime_bound); + lifetime_bounds.push_back (std::move (ll)); + } + + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, item.get_node_id (), + mappings->get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + + translated = new HIR::LifetimeWhereClauseItem (mapping, std::move (l), + std::move (lifetime_bounds), + item.get_locus ()); + } + + void visit (AST::TypeBoundWhereClauseItem &item) override + { + // FIXME + std::vector<HIR::LifetimeParam> for_lifetimes; + + std::unique_ptr<HIR::Type> bound_type = std::unique_ptr<HIR::Type> ( + ASTLoweringType::translate (item.get_type ().get ())); + + std::vector<std::unique_ptr<HIR::TypeParamBound>> type_param_bounds; + for (auto &bound : item.get_type_param_bounds ()) + { + HIR::TypeParamBound *b + = ASTLoweringTypeBounds::translate (bound.get ()); + type_param_bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b)); + } + + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, item.get_node_id (), + mappings->get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + + translated + = new HIR::TypeBoundWhereClauseItem (mapping, std::move (for_lifetimes), + std::move (bound_type), + std::move (type_param_bounds)); + } + +private: + ASTLowerWhereClauseItem () : ASTLoweringBase (), translated (nullptr) {} + + HIR::WhereClauseItem *translated; +}; + } // namespace HIR } // namespace Rust |