summaryrefslogtreecommitdiff
path: root/src/hir/generic_params.cpp
blob: 399bddbfaa6ba0927bb897c51148e9b4e39c7ca6 (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
56
57
58
59
60
61
/*
 */
#include "generic_params.hpp"

namespace HIR {
    ::std::ostream& operator<<(::std::ostream& os, const GenericBound& x)
    {
        TU_MATCH(::HIR::GenericBound, (x), (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;
            )
        )
        return os;
    }
    
    ::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 << ", ";
                os << b;
                comma_needed = true;
            }
        }
        return os;
    }
}