Skip to content

Commit

Permalink
derive(Clone): chore: Cleanup
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* expand/rust-derive-clone.cc: Cleanup implementation, avoid repetitions.
	* expand/rust-derive-clone.h: Likewise.
  • Loading branch information
CohenArthur committed Feb 4, 2025
1 parent 1ed767a commit ddd37fb
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 25 deletions.
34 changes: 12 additions & 22 deletions gcc/rust/expand/rust-derive-clone.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

#include "rust-derive-clone.h"
#include "rust-ast.h"
#include "rust-ast-dump.h"
#include "rust-expr.h"
#include "rust-item.h"
#include "rust-path.h"
Expand Down Expand Up @@ -169,21 +168,10 @@ DeriveClone::visit_struct (StructStruct &item)
item.get_generic_params ());
}

PathInExpression
DeriveClone::variant_match_path (Enum &item, const Identifier &variant)
{
return PathInExpression ({builder.path_segment (
item.get_identifier ().as_string ()),
builder.path_segment (variant.as_string ())},
{}, loc, false);
}

MatchCase
DeriveClone::clone_enum_identifier (Enum &item,
DeriveClone::clone_enum_identifier (PathInExpression variant_path,
const std::unique_ptr<EnumItem> &variant)
{
auto variant_path = variant_match_path (item, variant->get_identifier ());

auto pattern = std::unique_ptr<Pattern> (new ReferencePattern (
std::unique_ptr<Pattern> (new PathInExpression (variant_path)), false,
false, loc));
Expand All @@ -193,10 +181,9 @@ DeriveClone::clone_enum_identifier (Enum &item,
}

MatchCase
DeriveClone::clone_enum_tuple (Enum &item, const EnumItemTuple &variant)
DeriveClone::clone_enum_tuple (PathInExpression variant_path,
const EnumItemTuple &variant)
{
auto variant_path = variant_match_path (item, variant.get_identifier ());

auto patterns = std::vector<std::unique_ptr<Pattern>> ();
auto cloned_patterns = std::vector<std::unique_ptr<Expr>> ();

Expand Down Expand Up @@ -232,10 +219,9 @@ DeriveClone::clone_enum_tuple (Enum &item, const EnumItemTuple &variant)
}

MatchCase
DeriveClone::clone_enum_struct (Enum &item, const EnumItemStruct &variant)
DeriveClone::clone_enum_struct (PathInExpression variant_path,
const EnumItemStruct &variant)
{
auto variant_path = variant_match_path (item, variant.get_identifier ());

auto field_patterns = std::vector<std::unique_ptr<StructPatternField>> ();
auto cloned_fields = std::vector<std::unique_ptr<StructExprField>> ();

Expand Down Expand Up @@ -314,21 +300,25 @@ DeriveClone::visit_enum (Enum &item)

for (const auto &variant : item.get_variants ())
{
auto path
= builder.variant_path (item.get_identifier ().as_string (),
variant->get_identifier ().as_string ());

switch (variant->get_enum_item_kind ())
{
// Identifiers and discriminated variants are the same for a clone - we
// just return the same variant
case EnumItem::Kind::Identifier:
case EnumItem::Kind::Discriminant:
cases.emplace_back (clone_enum_identifier (item, variant));
cases.emplace_back (clone_enum_identifier (path, variant));
break;
case EnumItem::Kind::Tuple:
cases.emplace_back (
clone_enum_tuple (item, static_cast<EnumItemTuple &> (*variant)));
clone_enum_tuple (path, static_cast<EnumItemTuple &> (*variant)));
break;
case EnumItem::Kind::Struct:
cases.emplace_back (
clone_enum_struct (item, static_cast<EnumItemStruct &> (*variant)));
clone_enum_struct (path, static_cast<EnumItemStruct &> (*variant)));
break;
}
}
Expand Down
8 changes: 5 additions & 3 deletions gcc/rust/expand/rust-derive-clone.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,12 @@ class DeriveClone : DeriveVisitor
/**
* Implementation of clone for all possible variants of an enum
*/
MatchCase clone_enum_identifier (Enum &item,
MatchCase clone_enum_identifier (PathInExpression variant_path,
const std::unique_ptr<EnumItem> &variant);
MatchCase clone_enum_tuple (Enum &item, const EnumItemTuple &variant);
MatchCase clone_enum_struct (Enum &item, const EnumItemStruct &variant);
MatchCase clone_enum_tuple (PathInExpression variant_path,
const EnumItemTuple &variant);
MatchCase clone_enum_struct (PathInExpression variant_path,
const EnumItemStruct &variant);

virtual void visit_struct (StructStruct &item);
virtual void visit_tuple (TupleStruct &item);
Expand Down

0 comments on commit ddd37fb

Please sign in to comment.