diff options
Diffstat (limited to 'src/hir/generic_params.cpp')
-rw-r--r-- | src/hir/generic_params.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
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; +} |