summaryrefslogtreecommitdiff
path: root/src/hir/generic_params.cpp
blob: 40608cea725efa01e32518bae2a551aa11f463b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
 */
#include "generic_params.hpp"

namespace HIR {
    ::std::ostream& operator<<(::std::ostream& os, const ::HIR::GenericParams::PrintArgs& x)
    {
        if( x.gp.m_lifetimes.size() > 0 || x.gp.m_types.size() > 0 )
        {
            os << "<";
            for(const auto& lft : x.gp.m_lifetimes) {
                os << "'" << lft << ",";
            }
            for(const auto& typ : x.gp.m_types) {
                os << typ.m_name;
                if( ! typ.m_is_sized )
                    os << ": ?Sized";
                if( !typ.m_default.m_data.is_Infer() )
                    os << " = " << typ.m_default;
                os << ",";
            }
            os << ">";
        }
        return os;
    }
    ::std::ostream& operator<<(::std::ostream& os, const ::HIR::GenericParams::PrintBounds& x)
    {
        if( x.gp.m_bounds.size() > 0 )
        {
            os << " where ";
            bool comma_needed = false;
            for(const auto& b : x.gp.m_bounds)
            {
                if(comma_needed)
                    os << ", ";
                TU_MATCH(::HIR::GenericBound, (b), (e),
                (Lifetime,
                    os << "'" << e.test << ": '" << e.valid_for;
                    ),
                (TypeLifetime,
                    os << e.type << ": '" << e.valid_for;
                    ),
                (TraitBound,
                    os << e.type << ": " << e.trait.m_path;
                    ),
                (TypeEquality,
                    os << e.type << " = " << e.other_type;
                    )
                )
                comma_needed = true;
            }
        }
        return os;
    }
}