From: Arthur Cohen <arthur.co...@embecosm.com> gcc/rust/ChangeLog:
* expand/rust-derive-clone.cc: Cleanup implementation, avoid repetitions. * expand/rust-derive-clone.h: Likewise. --- gcc/rust/expand/rust-derive-clone.cc | 34 ++++++++++------------------ gcc/rust/expand/rust-derive-clone.h | 8 ++++--- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/gcc/rust/expand/rust-derive-clone.cc b/gcc/rust/expand/rust-derive-clone.cc index b1b39668f51..d0ffbbdafa7 100644 --- a/gcc/rust/expand/rust-derive-clone.cc +++ b/gcc/rust/expand/rust-derive-clone.cc @@ -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" @@ -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)); @@ -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>> (); @@ -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>> (); @@ -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; } } diff --git a/gcc/rust/expand/rust-derive-clone.h b/gcc/rust/expand/rust-derive-clone.h index d48ec5d2889..61224ba527b 100644 --- a/gcc/rust/expand/rust-derive-clone.h +++ b/gcc/rust/expand/rust-derive-clone.h @@ -73,10 +73,12 @@ private: /** * 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); -- 2.45.2