From 1f8a1bbff69b3a3e9feea8084291baad0d4a28eb Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Thu, 2 Nov 2023 18:23:03 +0100 Subject: [PATCH] Move SingleASTNode implementation out of header Those functions implementation put additional constraints on the headers which makes the codebase harder to work with. gcc/rust/ChangeLog: * ast/rust-ast.h: Move implementation from here... * ast/rust-ast.cc (SingleASTNode::SingleASTNode): ...to here. (SingleASTNode::operator=): ...and here... (SingleASTNode::accept_vis): ...and here... (SingleASTNode::is_error): ...and here... (SingleASTNode::as_string): ...also here. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/ast/rust-ast.cc | 174 +++++++++++++++++++++++++++++++++++++++ gcc/rust/ast/rust-ast.h | 169 ++----------------------------------- 2 files changed, 179 insertions(+), 164 deletions(-) diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index 1f9a0ef31e6d..ce269309afe9 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ +#include "rust-ast.h" #include "rust-system.h" #include "rust-ast-full.h" #include "rust-diagnostics.h" @@ -37,6 +38,179 @@ along with GCC; see the file COPYING3. If not see namespace Rust { namespace AST { +SingleASTNode::SingleASTNode (SingleASTNode const &other) +{ + kind = other.kind; + switch (kind) + { + case EXPRESSION: + expr = other.expr->clone_expr (); + break; + + case ITEM: + item = other.item->clone_item (); + break; + + case STMT: + stmt = other.stmt->clone_stmt (); + break; + + case EXTERN: + 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_inherent_impl_item (); + break; + + case TRAIT_IMPL: + trait_impl_item = other.trait_impl_item->clone_trait_impl_item (); + break; + + case TYPE: + type = other.type->clone_type (); + break; + } +} + +SingleASTNode +SingleASTNode::operator= (SingleASTNode const &other) +{ + kind = other.kind; + switch (kind) + { + case EXPRESSION: + expr = other.expr->clone_expr (); + break; + + case ITEM: + item = other.item->clone_item (); + break; + + case STMT: + stmt = other.stmt->clone_stmt (); + break; + + case EXTERN: + 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_inherent_impl_item (); + break; + + case TRAIT_IMPL: + trait_impl_item = other.trait_impl_item->clone_trait_impl_item (); + break; + + case TYPE: + type = other.type->clone_type (); + break; + } + return *this; +} + +void +SingleASTNode::accept_vis (ASTVisitor &vis) +{ + switch (kind) + { + case EXPRESSION: + expr->accept_vis (vis); + break; + + case ITEM: + item->accept_vis (vis); + break; + + case STMT: + stmt->accept_vis (vis); + break; + + case EXTERN: + 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); + break; + + case TYPE: + type->accept_vis (vis); + break; + } +} + +bool +SingleASTNode::is_error () +{ + switch (kind) + { + case EXPRESSION: + return expr == nullptr; + case ITEM: + return item == nullptr; + case STMT: + 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 TYPE: + return type == nullptr; + } + + rust_unreachable (); + return true; +} + +std::string +SingleASTNode::as_string () const +{ + switch (kind) + { + case EXPRESSION: + return "Expr: " + expr->as_string (); + case ITEM: + return "Item: " + item->as_string (); + case STMT: + 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 TYPE: + return "Type: " + type->as_string (); + } + + rust_unreachable (); + return ""; +} + std::string Crate::as_string () const { diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h index 35612935d7c3..8b3f6fef8802 100644 --- a/gcc/rust/ast/rust-ast.h +++ b/gcc/rust/ast/rust-ast.h @@ -1708,84 +1708,9 @@ class SingleASTNode : public Visitable : kind (TYPE), type (std::move (type)) {} - SingleASTNode (SingleASTNode const &other) - { - kind = other.kind; - switch (kind) - { - case EXPRESSION: - expr = other.expr->clone_expr (); - break; - - case ITEM: - item = other.item->clone_item (); - break; - - case STMT: - stmt = other.stmt->clone_stmt (); - break; - - case EXTERN: - external_item = other.external_item->clone_external_item (); - break; - - case TRAIT: - trait_item = other.trait_item->clone_trait_item (); - break; + SingleASTNode (SingleASTNode const &other); - case IMPL: - impl_item = other.impl_item->clone_inherent_impl_item (); - break; - - case TRAIT_IMPL: - trait_impl_item = other.trait_impl_item->clone_trait_impl_item (); - break; - - case TYPE: - type = other.type->clone_type (); - break; - } - } - - SingleASTNode operator= (SingleASTNode const &other) - { - kind = other.kind; - switch (kind) - { - case EXPRESSION: - expr = other.expr->clone_expr (); - break; - - case ITEM: - item = other.item->clone_item (); - break; - - case STMT: - stmt = other.stmt->clone_stmt (); - break; - - case EXTERN: - 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_inherent_impl_item (); - break; - - case TRAIT_IMPL: - trait_impl_item = other.trait_impl_item->clone_trait_impl_item (); - break; - - case TYPE: - type = other.type->clone_type (); - break; - } - return *this; - } + SingleASTNode operator= (SingleASTNode const &other); SingleASTNode (SingleASTNode &&other) = default; SingleASTNode &operator= (SingleASTNode &&other) = default; @@ -1863,95 +1788,11 @@ class SingleASTNode : public Visitable return std::move (type); } - void accept_vis (ASTVisitor &vis) override - { - switch (kind) - { - case EXPRESSION: - expr->accept_vis (vis); - break; - - case ITEM: - item->accept_vis (vis); - break; - - case STMT: - stmt->accept_vis (vis); - break; - - case EXTERN: - 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); - break; - - case TYPE: - type->accept_vis (vis); - break; - } - } - - bool is_error () - { - switch (kind) - { - case EXPRESSION: - return expr == nullptr; - case ITEM: - return item == nullptr; - case STMT: - 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 TYPE: - return type == nullptr; - } + void accept_vis (ASTVisitor &vis) override; - rust_unreachable (); - return true; - } + bool is_error (); - std::string as_string () const - { - switch (kind) - { - case EXPRESSION: - return "Expr: " + expr->as_string (); - case ITEM: - return "Item: " + item->as_string (); - case STMT: - 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 TYPE: - return "Type: " + type->as_string (); - } - - rust_unreachable (); - return ""; - } + std::string as_string () const; }; // A crate AST object - holds all the data for a single compilation unit