From 1460044f87ef6801d5c17cf94a9a87282bff9464 Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Wed, 20 Dec 2023 02:30:20 -0500 Subject: gccrs: Unify storage of associated items in SingleASTNode gcc/rust/ChangeLog: * ast/rust-ast-fragment.cc (Fragment::assert_single_fragment): Update. * ast/rust-ast.h (class TraitImplItem): Move definition before that of TraitItem. (class TraitItem): Inherit from TraitImplItem instead of AssociatedItem. (class SingleASTNode): Unify handling of associated items. (SingleASTNode::take_assoc_item): Move from... (SingleASTNode::take_impl_item): ...here, but leave stub calling take_assoc_item behind. (SingleASTNode::take_trait_item): Cast associated item to TraitItem. (SingleASTNode::take_trait_impl_item): Cast associated item to TraitImplItem. * ast/rust-ast.cc (SingleASTNode::SingleASTNode): Unify handling of associated items. (SingleASTNode::operator=): Likewise. (SingleASTNode::accept_vis): Likewise. (SingleASTNode::is_error): Likewise. (SingleASTNode::as_string): Likewise. * ast/rust-item.h (class Function): Remove direct inheritence from AssociatedItem. (class ConstantItem): Likewise. * ast/rust-macro.h (class MacroInvocation): Remove direct inheritence from AssociatedItem and TraitImplItem. --- gcc/rust/ast/rust-ast-fragment.cc | 4 +-- gcc/rust/ast/rust-ast.cc | 52 +++++++------------------------- gcc/rust/ast/rust-ast.h | 63 ++++++++++++++++++--------------------- gcc/rust/ast/rust-item.h | 8 ++--- gcc/rust/ast/rust-macro.h | 2 -- 5 files changed, 42 insertions(+), 87 deletions(-) (limited to 'gcc/rust') diff --git a/gcc/rust/ast/rust-ast-fragment.cc b/gcc/rust/ast/rust-ast-fragment.cc index e7574519465..d8bf4aa213b 100644 --- a/gcc/rust/ast/rust-ast-fragment.cc +++ b/gcc/rust/ast/rust-ast-fragment.cc @@ -153,14 +153,12 @@ void Fragment::assert_single_fragment (SingleASTNode::NodeType expected) const { static const std::map str_map = { - {SingleASTNode::NodeType::IMPL, "impl"}, + {SingleASTNode::NodeType::ASSOC_ITEM, "associated item"}, {SingleASTNode::NodeType::ITEM, "item"}, {SingleASTNode::NodeType::TYPE, "type"}, {SingleASTNode::NodeType::EXPRESSION, "expr"}, {SingleASTNode::NodeType::STMT, "stmt"}, {SingleASTNode::NodeType::EXTERN, "extern"}, - {SingleASTNode::NodeType::TRAIT, "trait"}, - {SingleASTNode::NodeType::TRAIT_IMPL, "trait impl"}, }; auto actual = nodes[0].get_kind (); diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index b9096032d41..360a9ceb6db 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -60,16 +60,8 @@ SingleASTNode::SingleASTNode (SingleASTNode const &other) external_item = other.external_item->clone_external_item (); break; - case TRAIT: - trait_item = other.trait_item->clone_trait_item (); - break; - - case IMPL: - impl_item = other.impl_item->clone_associated_item (); - break; - - case TRAIT_IMPL: - trait_impl_item = other.trait_impl_item->clone_trait_impl_item (); + case ASSOC_ITEM: + assoc_item = other.assoc_item->clone_associated_item (); break; case TYPE: @@ -100,16 +92,8 @@ SingleASTNode::operator= (SingleASTNode const &other) external_item = other.external_item->clone_external_item (); break; - case TRAIT: - trait_item = other.trait_item->clone_trait_item (); - break; - - case IMPL: - impl_item = other.impl_item->clone_associated_item (); - break; - - case TRAIT_IMPL: - trait_impl_item = other.trait_impl_item->clone_trait_impl_item (); + case ASSOC_ITEM: + assoc_item = other.assoc_item->clone_associated_item (); break; case TYPE: @@ -140,16 +124,8 @@ SingleASTNode::accept_vis (ASTVisitor &vis) external_item->accept_vis (vis); break; - case TRAIT: - trait_item->accept_vis (vis); - break; - - case IMPL: - impl_item->accept_vis (vis); - break; - - case TRAIT_IMPL: - trait_impl_item->accept_vis (vis); + case ASSOC_ITEM: + assoc_item->accept_vis (vis); break; case TYPE: @@ -171,12 +147,8 @@ SingleASTNode::is_error () return stmt == nullptr; case EXTERN: return external_item == nullptr; - case TRAIT: - return trait_item == nullptr; - case IMPL: - return impl_item == nullptr; - case TRAIT_IMPL: - return trait_impl_item == nullptr; + case ASSOC_ITEM: + return assoc_item == nullptr; case TYPE: return type == nullptr; } @@ -198,12 +170,8 @@ SingleASTNode::as_string () const return "Stmt: " + stmt->as_string (); case EXTERN: return "External Item: " + external_item->as_string (); - case TRAIT: - return "Trait Item: " + trait_item->as_string (); - case IMPL: - return "Impl Item: " + impl_item->as_string (); - case TRAIT_IMPL: - return "Trait Impl Item: " + trait_impl_item->as_string (); + case ASSOC_ITEM: + return "Associated Item: " + assoc_item->as_string (); case TYPE: return "Type: " + type->as_string (); } diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h index a45085489e8..256a527118a 100644 --- a/gcc/rust/ast/rust-ast.h +++ b/gcc/rust/ast/rust-ast.h @@ -1657,8 +1657,22 @@ public: virtual location_t get_locus () const = 0; }; +// Abstract base class for items used in a trait impl +class TraitImplItem : public AssociatedItem +{ +protected: + virtual TraitImplItem *clone_associated_item_impl () const override = 0; + +public: + // Unique pointer custom clone function + std::unique_ptr clone_trait_impl_item () const + { + return std::unique_ptr (clone_associated_item_impl ()); + } +}; + // Item used in trait declarations - abstract base class -class TraitItem : virtual public AssociatedItem +class TraitItem : public TraitImplItem { protected: TraitItem (location_t locus) @@ -1689,20 +1703,6 @@ public: location_t get_locus () const override { return locus; } }; -// Abstract base class for items used in a trait impl -class TraitImplItem : virtual public AssociatedItem -{ -protected: - virtual TraitImplItem *clone_associated_item_impl () const override = 0; - -public: - // Unique pointer custom clone function - std::unique_ptr clone_trait_impl_item () const - { - return std::unique_ptr (clone_associated_item_impl ()); - } -}; - // Abstract base class for an item used inside an extern block class ExternalItem : public Visitable { @@ -1831,9 +1831,7 @@ public: ITEM, STMT, EXTERN, - TRAIT, - IMPL, - TRAIT_IMPL, + ASSOC_ITEM, TYPE, }; @@ -1845,9 +1843,7 @@ private: std::unique_ptr item; std::unique_ptr stmt; std::unique_ptr external_item; - std::unique_ptr trait_item; - std::unique_ptr impl_item; - std::unique_ptr trait_impl_item; + std::unique_ptr assoc_item; std::unique_ptr type; public: @@ -1867,16 +1863,8 @@ public: : kind (EXTERN), external_item (std::move (item)) {} - SingleASTNode (std::unique_ptr item) - : kind (TRAIT), trait_item (std::move (item)) - {} - SingleASTNode (std::unique_ptr item) - : kind (IMPL), impl_item (std::move (item)) - {} - - SingleASTNode (std::unique_ptr trait_impl_item) - : kind (TRAIT_IMPL), trait_impl_item (std::move (trait_impl_item)) + : kind (ASSOC_ITEM), assoc_item (std::move (item)) {} SingleASTNode (std::unique_ptr type) @@ -1936,7 +1924,8 @@ public: std::unique_ptr take_trait_item () { rust_assert (!is_error ()); - return std::move (trait_item); + return std::unique_ptr ( + static_cast (assoc_item.release ())); } std::unique_ptr take_external_item () @@ -1945,16 +1934,22 @@ public: return std::move (external_item); } - std::unique_ptr take_impl_item () + std::unique_ptr take_assoc_item () { rust_assert (!is_error ()); - return std::move (impl_item); + return std::move (assoc_item); + } + + std::unique_ptr take_impl_item () + { + return take_assoc_item (); } std::unique_ptr take_trait_impl_item () { rust_assert (!is_error ()); - return std::move (trait_impl_item); + return std::unique_ptr ( + static_cast (assoc_item.release ())); } std::unique_ptr take_type () diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h index a995273de12..5b9eb64560d 100644 --- a/gcc/rust/ast/rust-item.h +++ b/gcc/rust/ast/rust-item.h @@ -1289,9 +1289,7 @@ protected: class LetStmt; // Rust function declaration AST node -class Function : public VisItem, - virtual public AssociatedItem, - public TraitImplItem +class Function : public VisItem, public TraitImplItem { FunctionQualifiers qualifiers; Identifier function_name; @@ -2314,9 +2312,7 @@ protected: /* "Constant item" AST node - used for constant, compile-time expressions * within module scope (like constexpr) */ -class ConstantItem : public VisItem, - virtual public AssociatedItem, - public TraitImplItem +class ConstantItem : public VisItem, public TraitImplItem { // either has an identifier or "_" - maybe handle in identifier? // bool identifier_is_underscore; diff --git a/gcc/rust/ast/rust-macro.h b/gcc/rust/ast/rust-macro.h index 41c21cffa95..bcf5b0b5a99 100644 --- a/gcc/rust/ast/rust-macro.h +++ b/gcc/rust/ast/rust-macro.h @@ -598,8 +598,6 @@ class MacroInvocation : public TypeNoBounds, public Pattern, public Item, public TraitItem, - public TraitImplItem, - virtual public AssociatedItem, public ExternalItem, public ExprWithoutBlock { -- cgit v1.2.3