]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add name resolution and ast lowering for slice pattern
authorMahmoud Mohamed <mahadelr19@gmail.com>
Mon, 20 Mar 2023 12:31:28 +0000 (15:31 +0300)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:21:13 +0000 (18:21 +0100)
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>
gcc/rust/hir/rust-ast-lower-pattern.cc
gcc/rust/hir/rust-ast-lower-pattern.h
gcc/rust/resolve/rust-ast-resolve-pattern.cc
gcc/rust/resolve/rust-ast-resolve-pattern.h

index 04ba26998c2f663f08f8d0ca4adf19af32717240..0aef80c30fbb51849ddbdbf3cc16080cb658adac 100644 (file)
@@ -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
index 9095a25f8737541efbff6fe09823f44491789b46..4da644cfffc24bdcf4f14bab78624f0964774b9f 100644 (file)
@@ -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 ();
index 5b896c9b32e7494ebd0922915c0bdb0d49c66278..a2a88cf7ac6372d4c4f3584d719c5fbf420a0352 100644 (file)
@@ -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
index e3183e8ad296d329caa2c505997d6d88d13046c0..bcf862b4d5512a3dcede24e7cf95b7d4d2845504 100644 (file)
@@ -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);