From 9f4a1747941b6fac6a431cee5796b594adbdb117 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 7 Aug 2016 22:33:35 +0800 Subject: HIR - Add clone method to GenericParams --- src/hir/generic_params.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++++ src/hir/generic_params.hpp | 3 +++ 2 files changed, 52 insertions(+) diff --git a/src/hir/generic_params.cpp b/src/hir/generic_params.cpp index 399bddbf..041567b7 100644 --- a/src/hir/generic_params.cpp +++ b/src/hir/generic_params.cpp @@ -59,3 +59,52 @@ namespace HIR { return os; } } + +::HIR::GenericParams HIR::GenericParams::clone() const +{ + ::HIR::GenericParams rv; + rv.m_types.resize(m_types.size()); + for(const auto& type : m_types) + { + rv.m_types.push_back(::HIR::TypeParamDef { + type.m_name, + type.m_default.clone(), + type.m_is_sized + }); + } + rv.m_lifetimes = m_lifetimes; + rv.m_bounds.resize(m_bounds.size()); + for(const auto& bound : m_bounds) + { + TU_MATCH(::HIR::GenericBound, (bound), (e), + (Lifetime, + rv.m_bounds.push_back(::HIR::GenericBound::make_Lifetime(e)); + ), + (TypeLifetime, + rv.m_bounds.push_back(::HIR::GenericBound::make_TypeLifetime({ + e.type.clone(), + e.valid_for + })); + ), + (TraitBound, + rv.m_bounds.push_back(::HIR::GenericBound::make_TraitBound({ + e.type.clone(), + e.trait.clone() + })); + )/*, + (NotTrait, + rv.m_bounds.push_back(::HIR::GenericBound::make_NotTrait({ + e.type.clone(), + e.trait.clone() + })); + )*/, + (TypeEquality, + rv.m_bounds.push_back(::HIR::GenericBound::make_TypeEquality({ + e.type.clone(), + e.other_type.clone() + })); + ) + ) + } + return rv; +} diff --git a/src/hir/generic_params.hpp b/src/hir/generic_params.hpp index 6d1a62e6..a17f61f5 100644 --- a/src/hir/generic_params.hpp +++ b/src/hir/generic_params.hpp @@ -46,6 +46,9 @@ struct GenericParams ::std::vector m_bounds; + //GenericParams() {} + + GenericParams clone() const; struct PrintArgs { const GenericParams& gp; -- cgit v1.2.3