diff options
author | Mahmoud Mohamed <mahadelr19@gmail.com> | 2023-03-20 15:31:28 +0300 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-20 21:07:17 +0000 |
commit | 1eba43033b139581d7152f9bfc5a0ae6277f9fee (patch) | |
tree | dc1c720537bfced7e7ff1286e216ce66cfd253e0 | |
parent | a505e2913b41b2b415b9808a17d3a5a746d89f10 (diff) | |
download | gcc-1eba43033b139581d7152f9bfc5a0ae6277f9fee.zip gcc-1eba43033b139581d7152f9bfc5a0ae6277f9fee.tar.gz gcc-1eba43033b139581d7152f9bfc5a0ae6277f9fee.tar.bz2 |
Add name resolution and ast lowering for slice pattern
gcc/rust/ChangeLog:
* hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::visit):
Add lowering for SlicePattern.
* hir/rust-ast-lower-pattern.h: Likewise.
* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::visit):
Add name resolution visit for SlicePattern.
* resolve/rust-ast-resolve-pattern.h: Likewise.
Signed-off-by: Mahmoud Mohamed <mahadelr19@gmail.com>
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-pattern.cc | 23 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-pattern.h | 1 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-pattern.cc | 9 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-pattern.h | 1 |
4 files changed, 32 insertions, 2 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc index 1961c74..db72314 100644 --- a/gcc/rust/hir/rust-ast-lower-pattern.cc +++ b/gcc/rust/hir/rust-ast-lower-pattern.cc @@ -83,7 +83,7 @@ ASTLoweringPattern::visit (AST::TupleStructPattern &pattern) AST::TupleStructItemsNoRange &items_no_range = static_cast<AST::TupleStructItemsNoRange &> (*items.get ()); - std::vector<std::unique_ptr<HIR::Pattern> > patterns; + std::vector<std::unique_ptr<HIR::Pattern>> patterns; for (auto &inner_pattern : items_no_range.get_patterns ()) { HIR::Pattern *p @@ -114,7 +114,7 @@ ASTLoweringPattern::visit (AST::StructPattern &pattern) auto &raw_elems = pattern.get_struct_pattern_elems (); rust_assert (!raw_elems.has_etc ()); - std::vector<std::unique_ptr<HIR::StructPatternField> > fields; + std::vector<std::unique_ptr<HIR::StructPatternField>> fields; for (auto &field : raw_elems.get_struct_pattern_fields ()) { HIR::StructPatternField *f = nullptr; @@ -278,5 +278,24 @@ ASTLoweringPattern::visit (AST::ReferencePattern &pattern) } } +void +ASTLoweringPattern::visit (AST::SlicePattern &pattern) +{ + std::vector<std::unique_ptr<HIR::Pattern>> items; + for (auto &p : pattern.get_items ()) + { + HIR::Pattern *item = ASTLoweringPattern::translate (p.get ()); + items.push_back (std::unique_ptr<HIR::Pattern> (item)); + } + + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, pattern.get_node_id (), + mappings->get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + + translated + = new HIR::SlicePattern (mapping, std::move (items), pattern.get_locus ()); +} + } // namespace HIR } // namespace Rust diff --git a/gcc/rust/hir/rust-ast-lower-pattern.h b/gcc/rust/hir/rust-ast-lower-pattern.h index 2d175a2..8c10514 100644 --- a/gcc/rust/hir/rust-ast-lower-pattern.h +++ b/gcc/rust/hir/rust-ast-lower-pattern.h @@ -41,6 +41,7 @@ public: void visit (AST::RangePattern &pattern) override; void visit (AST::GroupedPattern &pattern) override; void visit (AST::ReferencePattern &pattern) override; + void visit (AST::SlicePattern &pattern) override; private: ASTLoweringPattern (); diff --git a/gcc/rust/resolve/rust-ast-resolve-pattern.cc b/gcc/rust/resolve/rust-ast-resolve-pattern.cc index 7eab1f0..b9ed9f2 100644 --- a/gcc/rust/resolve/rust-ast-resolve-pattern.cc +++ b/gcc/rust/resolve/rust-ast-resolve-pattern.cc @@ -375,5 +375,14 @@ PatternDeclaration::visit (AST::RangePattern &pattern) resolve_range_pattern_bound (pattern.get_lower_bound ().get ()); } +void +PatternDeclaration::visit (AST::SlicePattern &pattern) +{ + for (auto &p : pattern.get_items ()) + { + p->accept_vis (*this); + } +} + } // namespace Resolver } // namespace Rust diff --git a/gcc/rust/resolve/rust-ast-resolve-pattern.h b/gcc/rust/resolve/rust-ast-resolve-pattern.h index 4ed1ab9..a51182a 100644 --- a/gcc/rust/resolve/rust-ast-resolve-pattern.h +++ b/gcc/rust/resolve/rust-ast-resolve-pattern.h @@ -108,6 +108,7 @@ public: void visit (AST::TuplePattern &pattern) override; void visit (AST::RangePattern &pattern) override; void visit (AST::AltPattern &pattern) override; + void visit (AST::SlicePattern &pattern) override; void add_new_binding (Identifier ident, NodeId node_id, BindingTypeInfo info); void check_bindings_consistency (std::vector<BindingMap> &binding_maps); |