Skip to content

Commit

Permalink
Move SingleASTNode implementation out of header
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
P-E-P committed Nov 6, 2023
1 parent 78ba5b7 commit 1f8a1bb
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 164 deletions.
174 changes: 174 additions & 0 deletions gcc/rust/ast/rust-ast.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
<http://www.gnu.org/licenses/>. */

#include "rust-ast.h"
#include "rust-system.h"
#include "rust-ast-full.h"
#include "rust-diagnostics.h"
Expand All @@ -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
{
Expand Down
169 changes: 5 additions & 164 deletions gcc/rust/ast/rust-ast.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 1f8a1bb

Please sign in to comment.