]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add AST::AltPattern class
authorOwen Avery <powerboat9.gamer@gmail.com>
Tue, 14 Feb 2023 22:28:35 +0000 (17:28 -0500)
committerArthur Cohen <arthur.cohen@embecosm.com>
Thu, 6 Apr 2023 08:47:24 +0000 (10:47 +0200)
gcc/rust/ChangeLog:

* ast/rust-ast-dump.cc
(Dump::visit): Add AltPattern visitor.
* ast/rust-ast-dump.h:
(Dump::visit): Add AltPattern visitor.
* ast/rust-ast-full-decls.h
(class AltPattern): Add declaration.
* ast/rust-ast-visitor.h:
(ASTVisitor::visit): Add AltPattern visitor.
* ast/rust-ast.cc
(AltPattern::as_string): Add definition.
(AltPattern::accept_vis): Add definition.
* ast/rust-pattern.h
(class AltPattern): Add declaration.
* checks/errors/rust-feature-gate.h:
(FeatureGate::visit) Add AltPattern visitor
* expand/rust-attribute-visitor.cc
(AttrVisitor::visit): Add AltPattern visitor.
* expand/rust-attribute-visitor.h:
(AttrVisitor::visit): Add AltPattern visitor.
* hir/rust-ast-lower-base.cc
(ASTLoweringBase::visit): Add AltPattern visitor.
* hir/rust-ast-lower-base.h:
(ASTLoweringBase::visit): Add AltPattern visitor.
* resolve/rust-ast-resolve-base.cc
(ResolverBase::visit): Add AltPattern visitor.
* resolve/rust-ast-resolve-base.h:
(ResolverBase::visit): Add AltPattern visitor.
* resolve/rust-early-name-resolver.cc
(EarlyNameResolver::visit): Add AltPattern visitor.
* resolve/rust-early-name-resolver.h:
(EarlyNameResolver::visit): Add AltPattern visitor.
* util/rust-attributes.cc
(AttributeChecker::visit): Add AltPattern visitor.
* util/rust-attributes.h:
(AttributeChecker::visit): Add AltPattern visitor.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
17 files changed:
gcc/rust/ast/rust-ast-dump.cc
gcc/rust/ast/rust-ast-dump.h
gcc/rust/ast/rust-ast-full-decls.h
gcc/rust/ast/rust-ast-visitor.h
gcc/rust/ast/rust-ast.cc
gcc/rust/ast/rust-pattern.h
gcc/rust/checks/errors/rust-feature-gate.h
gcc/rust/expand/rust-attribute-visitor.cc
gcc/rust/expand/rust-attribute-visitor.h
gcc/rust/hir/rust-ast-lower-base.cc
gcc/rust/hir/rust-ast-lower-base.h
gcc/rust/resolve/rust-ast-resolve-base.cc
gcc/rust/resolve/rust-ast-resolve-base.h
gcc/rust/resolve/rust-early-name-resolver.cc
gcc/rust/resolve/rust-early-name-resolver.h
gcc/rust/util/rust-attributes.cc
gcc/rust/util/rust-attributes.h

index 58eb35ad1db5aea7d9e917e43cb509cd7c9dd306..10fb313c2c764a8fe7eb853cc6e2963436258e8e 100644 (file)
@@ -1678,6 +1678,10 @@ void
 Dump::visit (SlicePattern &)
 {}
 
+void
+Dump::visit (AltPattern &)
+{}
+
 // rust-stmt.h
 void
 Dump::visit (EmptyStmt &)
index 56918f5fc9861d9fe2843ca62a0a78dcb88d70b7..dfe6db0dd96495e5e159b1c532bb5122c5578731 100644 (file)
@@ -293,6 +293,7 @@ private:
   void visit (TuplePattern &pattern);
   void visit (GroupedPattern &pattern);
   void visit (SlicePattern &pattern);
+  void visit (AltPattern &pattern);
 
   // rust-stmt.h
   void visit (EmptyStmt &stmt);
index 58b12a1be0e08f5f1c5866b0c2c0836c00ee397d..9d7b00ac5a2da1f605fef951b67bad0a378668b6 100644 (file)
@@ -249,6 +249,7 @@ class TuplePatternItemsRanged;
 class TuplePattern;
 class GroupedPattern;
 class SlicePattern;
+class AltPattern;
 
 // rust-type.h
 class TraitBound;
index aa59a115ee6ef36e4168633283a558a9c4025366..1083e834770c1c383b74360f4ff5725f6105398e 100644 (file)
@@ -203,6 +203,7 @@ public:
   virtual void visit (TuplePattern &pattern) = 0;
   virtual void visit (GroupedPattern &pattern) = 0;
   virtual void visit (SlicePattern &pattern) = 0;
+  virtual void visit (AltPattern &pattern) = 0;
 
   // rust-stmt.h
   virtual void visit (EmptyStmt &stmt) = 0;
index 972cba2e7bbeb2696b4d754678d42f0320b87989..07983b7da069aa6466743cddef399f2edead9b45 100644 (file)
@@ -2704,6 +2704,17 @@ SlicePattern::as_string () const
   return str;
 }
 
+std::string
+AltPattern::as_string () const
+{
+  std::string str ("AltPattern: ");
+
+  for (const auto &pattern : alts)
+    str += "\n " + pattern->as_string ();
+
+  return str;
+}
+
 std::string
 TuplePatternItemsMultiple::as_string () const
 {
@@ -5649,6 +5660,12 @@ SlicePattern::accept_vis (ASTVisitor &vis)
   vis.visit (*this);
 }
 
+void
+AltPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
 void
 EmptyStmt::accept_vis (ASTVisitor &vis)
 {
index 0e2f56e32164898da187444ced570b49edbbf475..a62e9b98d9340bba0d2a1e410e55dc2f939876be 100644 (file)
@@ -1563,6 +1563,72 @@ protected:
   }
 };
 
+// AST node for alternate patterns
+// joins together what are technically 'PatternNoTopAlt's
+class AltPattern : public Pattern
+{
+  std::vector<std::unique_ptr<Pattern>> alts;
+  Location locus;
+  NodeId node_id;
+
+public:
+  std::string as_string () const override;
+
+  AltPattern (std::vector<std::unique_ptr<Pattern>> alts, Location locus)
+    : alts (std::move (alts)), locus (locus),
+      node_id (Analysis::Mappings::get ()->get_next_node_id ())
+  {}
+
+  // Copy constructor with vector clone
+  AltPattern (AltPattern const &other) : locus (other.locus)
+  {
+    node_id = other.node_id;
+    alts.reserve (other.alts.size ());
+    for (const auto &e : other.alts)
+      alts.push_back (e->clone_pattern ());
+  }
+
+  // Overloaded assignment operator to vector clone
+  AltPattern &operator= (AltPattern const &other)
+  {
+    locus = other.locus;
+    node_id = other.node_id;
+
+    alts.reserve (other.alts.size ());
+    for (const auto &e : other.alts)
+      alts.push_back (e->clone_pattern ());
+
+    return *this;
+  }
+
+  // move constructors
+  AltPattern (AltPattern &&other) = default;
+  AltPattern &operator= (AltPattern &&other) = default;
+
+  Location get_locus () const override final { return locus; }
+
+  void accept_vis (ASTVisitor &vis) override;
+
+  // TODO: seems kinda dodgy. Think of better way.
+  std::vector<std::unique_ptr<Pattern>> &get_alts () { return alts; }
+  const std::vector<std::unique_ptr<Pattern>> &get_alts () const
+  {
+    return alts;
+  }
+
+  NodeId get_node_id () const { return node_id; }
+
+  NodeId get_pattern_node_id () const override final { return node_id; }
+
+protected:
+  /* Use covariance to implement clone function as returning this object rather
+   * than base */
+  AltPattern *clone_pattern_impl () const override
+  {
+    return new AltPattern (*this);
+  }
+};
+
 // Moved definition to rust-path.h
 class PathPattern;
 
index 05789cf4751e63ff5325654fc9717234b1d83494..20af14719bb1962a5a706ceabf3115ca32421eaa 100644 (file)
@@ -169,6 +169,7 @@ public:
   void visit (AST::TuplePattern &pattern) override {}
   void visit (AST::GroupedPattern &pattern) override {}
   void visit (AST::SlicePattern &pattern) override {}
+  void visit (AST::AltPattern &pattern) override {}
   void visit (AST::EmptyStmt &stmt) override {}
   void visit (AST::LetStmt &stmt) override {}
   void visit (AST::ExprStmtWithoutBlock &stmt) override {}
index 9abec9221ab2c57265548be570ab2624029726bc..3a94699558d9b8134d4af68131470bd9f973a87b 100644 (file)
@@ -3152,6 +3152,20 @@ AttrVisitor::visit (AST::SlicePattern &pattern)
       // TODO: quit stripping now? or keep going?
     }
 }
+void
+AttrVisitor::visit (AST::AltPattern &pattern)
+{
+  // can't strip individual patterns, only sub-patterns
+  for (auto &alt : pattern.get_alts ())
+    {
+      alt->accept_vis (*this);
+
+      if (alt->is_marked_for_strip ())
+       rust_error_at (alt->get_locus (),
+                      "cannot strip pattern in this position");
+      // TODO: quit stripping now? or keep going?
+    }
+}
 
 void
 AttrVisitor::visit (AST::EmptyStmt &)
index 9b0e315fc080584df663fef86244fdaa276b27bf..2d10735436f302665ca6db4316137f029ca1e95e 100644 (file)
@@ -258,6 +258,7 @@ public:
   void visit (AST::TuplePattern &pattern) override;
   void visit (AST::GroupedPattern &pattern) override;
   void visit (AST::SlicePattern &pattern) override;
+  void visit (AST::AltPattern &pattern) override;
 
   void visit (AST::EmptyStmt &) override;
   void visit (AST::LetStmt &stmt) override;
index 33795726b2f9f2468e95970b2ca5ebc97f84d49b..5d7b5d213401f92f932784a6f309a3e9b701b8a6 100644 (file)
@@ -461,6 +461,9 @@ ASTLoweringBase::visit (AST::GroupedPattern &)
 void
 ASTLoweringBase::visit (AST::SlicePattern &)
 {}
+void
+ASTLoweringBase::visit (AST::AltPattern &)
+{}
 
 // rust-stmt.h
 void
index 1af44aa239f3f9edc55e3deffbb4faac6024a643..85343aacdabc3bb05e61767eb3491b2f5850d1f2 100644 (file)
@@ -231,6 +231,7 @@ public:
   virtual void visit (AST::TuplePattern &pattern);
   virtual void visit (AST::GroupedPattern &pattern);
   virtual void visit (AST::SlicePattern &pattern);
+  virtual void visit (AST::AltPattern &pattern);
 
   // rust-stmt.h
   virtual void visit (AST::EmptyStmt &stmt);
index 0a78d26bcd45963e6074168a637e74156bd31a3e..5b3f4a0ae1193ca053be88d74ef631ea5dcac3bb 100644 (file)
@@ -582,6 +582,10 @@ void
 ResolverBase::visit (AST::SlicePattern &)
 {}
 
+void
+ResolverBase::visit (AST::AltPattern &)
+{}
+
 void
 ResolverBase::visit (AST::EmptyStmt &)
 {}
index 9d88f8fd5d346c308e668244839226fdd5387d22..aab1324c4544c45373fb3e5e5a369ae42fc223e2 100644 (file)
@@ -178,6 +178,7 @@ public:
   void visit (AST::TuplePattern &);
   void visit (AST::GroupedPattern &);
   void visit (AST::SlicePattern &);
+  void visit (AST::AltPattern &);
 
   void visit (AST::EmptyStmt &);
   void visit (AST::LetStmt &);
index 5f11ae239bdc3321e31bf15f711908f48c705753..f5054f964c76cd2e5fd4a7606ae71142b17f5499 100644 (file)
@@ -1052,6 +1052,13 @@ EarlyNameResolver::visit (AST::SlicePattern &pattern)
     item->accept_vis (*this);
 }
 
+void
+EarlyNameResolver::visit (AST::AltPattern &pattern)
+{
+  for (auto &alt : pattern.get_alts ())
+    alt->accept_vis (*this);
+}
+
 void
 EarlyNameResolver::visit (AST::EmptyStmt &)
 {}
index 21b92e9b7a49a76aa6e4bb360de591acd2d31560..84ee518e23b5bfe1c332be4fafc15228c18c041f 100644 (file)
@@ -249,6 +249,7 @@ private:
   virtual void visit (AST::TuplePattern &pattern);
   virtual void visit (AST::GroupedPattern &pattern);
   virtual void visit (AST::SlicePattern &pattern);
+  virtual void visit (AST::AltPattern &pattern);
   virtual void visit (AST::EmptyStmt &stmt);
   virtual void visit (AST::LetStmt &stmt);
   virtual void visit (AST::ExprStmtWithoutBlock &stmt);
index 0458f6902b7e7cecceddcb897a4c9fda2b5bbc5b..4f63dd09dac3a565d54213526426d554636e7d68 100644 (file)
@@ -767,6 +767,10 @@ void
 AttributeChecker::visit (AST::SlicePattern &)
 {}
 
+void
+AttributeChecker::visit (AST::AltPattern &)
+{}
+
 // rust-stmt.h
 void
 AttributeChecker::visit (AST::EmptyStmt &)
index c08378cf77480171346ec77d81d795907b3085ce..805e3a8f40aed67fc976e9d2eed8d19503c67d78 100644 (file)
@@ -242,6 +242,7 @@ private:
   void visit (AST::TuplePattern &pattern);
   void visit (AST::GroupedPattern &pattern);
   void visit (AST::SlicePattern &pattern);
+  void visit (AST::AltPattern &pattern);
 
   // rust-stmt.h
   void visit (AST::EmptyStmt &stmt);