diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-02-14 17:28:35 -0500 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-04-06 10:47:24 +0200 |
commit | 8628486f4873f72a51e57cf0904f5b0f177053ad (patch) | |
tree | 6ab97cf9c5469de9499b3d97ed08d88814d96a5a | |
parent | 6774d569c61cb0cc80fc9e809cd92dda0010c9c3 (diff) | |
download | gcc-8628486f4873f72a51e57cf0904f5b0f177053ad.zip gcc-8628486f4873f72a51e57cf0904f5b0f177053ad.tar.gz gcc-8628486f4873f72a51e57cf0904f5b0f177053ad.tar.bz2 |
gccrs: Add AST::AltPattern class
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>
-rw-r--r-- | gcc/rust/ast/rust-ast-dump.cc | 4 | ||||
-rw-r--r-- | gcc/rust/ast/rust-ast-dump.h | 1 | ||||
-rw-r--r-- | gcc/rust/ast/rust-ast-full-decls.h | 1 | ||||
-rw-r--r-- | gcc/rust/ast/rust-ast-visitor.h | 1 | ||||
-rw-r--r-- | gcc/rust/ast/rust-ast.cc | 17 | ||||
-rw-r--r-- | gcc/rust/ast/rust-pattern.h | 66 | ||||
-rw-r--r-- | gcc/rust/checks/errors/rust-feature-gate.h | 1 | ||||
-rw-r--r-- | gcc/rust/expand/rust-attribute-visitor.cc | 14 | ||||
-rw-r--r-- | gcc/rust/expand/rust-attribute-visitor.h | 1 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-base.cc | 3 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-base.h | 1 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-base.cc | 4 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-base.h | 1 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-early-name-resolver.cc | 7 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-early-name-resolver.h | 1 | ||||
-rw-r--r-- | gcc/rust/util/rust-attributes.cc | 4 | ||||
-rw-r--r-- | gcc/rust/util/rust-attributes.h | 1 |
17 files changed, 128 insertions, 0 deletions
diff --git a/gcc/rust/ast/rust-ast-dump.cc b/gcc/rust/ast/rust-ast-dump.cc index 58eb35a..10fb313 100644 --- a/gcc/rust/ast/rust-ast-dump.cc +++ b/gcc/rust/ast/rust-ast-dump.cc @@ -1678,6 +1678,10 @@ void Dump::visit (SlicePattern &) {} +void +Dump::visit (AltPattern &) +{} + // rust-stmt.h void Dump::visit (EmptyStmt &) diff --git a/gcc/rust/ast/rust-ast-dump.h b/gcc/rust/ast/rust-ast-dump.h index 56918f5..dfe6db0 100644 --- a/gcc/rust/ast/rust-ast-dump.h +++ b/gcc/rust/ast/rust-ast-dump.h @@ -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); diff --git a/gcc/rust/ast/rust-ast-full-decls.h b/gcc/rust/ast/rust-ast-full-decls.h index 58b12a1..9d7b00a 100644 --- a/gcc/rust/ast/rust-ast-full-decls.h +++ b/gcc/rust/ast/rust-ast-full-decls.h @@ -249,6 +249,7 @@ class TuplePatternItemsRanged; class TuplePattern; class GroupedPattern; class SlicePattern; +class AltPattern; // rust-type.h class TraitBound; diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h index aa59a11..1083e83 100644 --- a/gcc/rust/ast/rust-ast-visitor.h +++ b/gcc/rust/ast/rust-ast-visitor.h @@ -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; diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index 972cba2..07983b7 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -2705,6 +2705,17 @@ SlicePattern::as_string () const } 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 { std::string str; @@ -5650,6 +5661,12 @@ SlicePattern::accept_vis (ASTVisitor &vis) } void +AltPattern::accept_vis (ASTVisitor &vis) +{ + vis.visit (*this); +} + +void EmptyStmt::accept_vis (ASTVisitor &vis) { vis.visit (*this); diff --git a/gcc/rust/ast/rust-pattern.h b/gcc/rust/ast/rust-pattern.h index 0e2f56e..a62e9b9 100644 --- a/gcc/rust/ast/rust-pattern.h +++ b/gcc/rust/ast/rust-pattern.h @@ -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; diff --git a/gcc/rust/checks/errors/rust-feature-gate.h b/gcc/rust/checks/errors/rust-feature-gate.h index 05789cf..20af147 100644 --- a/gcc/rust/checks/errors/rust-feature-gate.h +++ b/gcc/rust/checks/errors/rust-feature-gate.h @@ -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 {} diff --git a/gcc/rust/expand/rust-attribute-visitor.cc b/gcc/rust/expand/rust-attribute-visitor.cc index 9abec92..3a94699 100644 --- a/gcc/rust/expand/rust-attribute-visitor.cc +++ b/gcc/rust/expand/rust-attribute-visitor.cc @@ -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 &) diff --git a/gcc/rust/expand/rust-attribute-visitor.h b/gcc/rust/expand/rust-attribute-visitor.h index 9b0e315..2d10735 100644 --- a/gcc/rust/expand/rust-attribute-visitor.h +++ b/gcc/rust/expand/rust-attribute-visitor.h @@ -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; diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc index 3379572..5d7b5d2 100644 --- a/gcc/rust/hir/rust-ast-lower-base.cc +++ b/gcc/rust/hir/rust-ast-lower-base.cc @@ -461,6 +461,9 @@ ASTLoweringBase::visit (AST::GroupedPattern &) void ASTLoweringBase::visit (AST::SlicePattern &) {} +void +ASTLoweringBase::visit (AST::AltPattern &) +{} // rust-stmt.h void diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h index 1af44aa..85343aa 100644 --- a/gcc/rust/hir/rust-ast-lower-base.h +++ b/gcc/rust/hir/rust-ast-lower-base.h @@ -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); diff --git a/gcc/rust/resolve/rust-ast-resolve-base.cc b/gcc/rust/resolve/rust-ast-resolve-base.cc index 0a78d26..5b3f4a0 100644 --- a/gcc/rust/resolve/rust-ast-resolve-base.cc +++ b/gcc/rust/resolve/rust-ast-resolve-base.cc @@ -583,6 +583,10 @@ ResolverBase::visit (AST::SlicePattern &) {} void +ResolverBase::visit (AST::AltPattern &) +{} + +void ResolverBase::visit (AST::EmptyStmt &) {} diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h b/gcc/rust/resolve/rust-ast-resolve-base.h index 9d88f8f..aab1324 100644 --- a/gcc/rust/resolve/rust-ast-resolve-base.h +++ b/gcc/rust/resolve/rust-ast-resolve-base.h @@ -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 &); diff --git a/gcc/rust/resolve/rust-early-name-resolver.cc b/gcc/rust/resolve/rust-early-name-resolver.cc index 5f11ae2..f5054f9 100644 --- a/gcc/rust/resolve/rust-early-name-resolver.cc +++ b/gcc/rust/resolve/rust-early-name-resolver.cc @@ -1053,6 +1053,13 @@ EarlyNameResolver::visit (AST::SlicePattern &pattern) } void +EarlyNameResolver::visit (AST::AltPattern &pattern) +{ + for (auto &alt : pattern.get_alts ()) + alt->accept_vis (*this); +} + +void EarlyNameResolver::visit (AST::EmptyStmt &) {} diff --git a/gcc/rust/resolve/rust-early-name-resolver.h b/gcc/rust/resolve/rust-early-name-resolver.h index 21b92e9..84ee518 100644 --- a/gcc/rust/resolve/rust-early-name-resolver.h +++ b/gcc/rust/resolve/rust-early-name-resolver.h @@ -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); diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index 0458f69..4f63dd0 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -767,6 +767,10 @@ void AttributeChecker::visit (AST::SlicePattern &) {} +void +AttributeChecker::visit (AST::AltPattern &) +{} + // rust-stmt.h void AttributeChecker::visit (AST::EmptyStmt &) diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h index c08378c..805e3a8 100644 --- a/gcc/rust/util/rust-attributes.h +++ b/gcc/rust/util/rust-attributes.h @@ -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); |