blob: 9b7979f30a2cb63d82361863ae0c1b9e29b3d9b1 (
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/*
*/
#include <iostream>
#include "interpolated_fragment.hpp"
#include <ast/ast.hpp>
#include <ast/expr.hpp> // For definition of ExprNode
InterpolatedFragment::~InterpolatedFragment()
{
if( m_ptr )
{
switch(m_type)
{
case InterpolatedFragment::TT: delete reinterpret_cast<TokenTree*>(m_ptr); break;
case InterpolatedFragment::PAT: delete reinterpret_cast<AST::Pattern*>(m_ptr); break;
case InterpolatedFragment::PATH:delete reinterpret_cast<AST::Path*>(m_ptr); break;
case InterpolatedFragment::TYPE:delete reinterpret_cast<TypeRef*>(m_ptr); break;
case InterpolatedFragment::EXPR:
case InterpolatedFragment::STMT:
case InterpolatedFragment::BLOCK:
delete reinterpret_cast<AST::ExprNode*>(m_ptr);
break;
case InterpolatedFragment::META:
delete reinterpret_cast<AST::Attribute*>(m_ptr);
break;
case InterpolatedFragment::ITEM:
delete reinterpret_cast<AST::Named<AST::Item>*>(m_ptr);
break;
}
}
}
InterpolatedFragment::InterpolatedFragment(InterpolatedFragment&& x):
m_type( x.m_type )
{
m_ptr = x.m_ptr, x.m_ptr = nullptr;
}
InterpolatedFragment& InterpolatedFragment::operator=(InterpolatedFragment&& x)
{
m_type = x.m_type;
m_ptr = x.m_ptr, x.m_ptr = nullptr;
return *this;
}
InterpolatedFragment::InterpolatedFragment(InterpolatedFragment::Type type, AST::ExprNode* ptr):
m_type( type ),
m_ptr( ptr )
{
}
InterpolatedFragment::InterpolatedFragment(AST::Attribute v):
m_type( InterpolatedFragment::META ),
m_ptr( new AST::Attribute(mv$(v)) )
{
}
InterpolatedFragment::InterpolatedFragment(::AST::Named<::AST::Item> v):
m_type( InterpolatedFragment::ITEM ),
m_ptr( new ::AST::Named<::AST::Item>( mv$(v) ) )
{
}
InterpolatedFragment::InterpolatedFragment(TokenTree v):
m_type( InterpolatedFragment::TT ),
m_ptr( new TokenTree(mv$(v)) )
{
}
InterpolatedFragment::InterpolatedFragment(AST::Path v):
m_type( InterpolatedFragment::PATH ),
m_ptr( new AST::Path(mv$(v)) )
{
}
InterpolatedFragment::InterpolatedFragment(AST::Pattern v):
m_type( InterpolatedFragment::PAT ),
m_ptr( new AST::Pattern(mv$(v)) )
{
}
InterpolatedFragment::InterpolatedFragment(TypeRef v):
m_type( InterpolatedFragment::TYPE ),
m_ptr( new TypeRef(mv$(v)) )
{
}
::std::ostream& operator<<(::std::ostream& os, InterpolatedFragment const& x)
{
switch(x.m_type)
{
case InterpolatedFragment::TT:
os << "tt[" << x.as_tt() << "]";
break;
case InterpolatedFragment::PAT:
os << "pat[" << *reinterpret_cast<AST::Pattern*>(x.m_ptr) << "]";
break;
case InterpolatedFragment::PATH:
os << "path[" << *reinterpret_cast<AST::Path*>(x.m_ptr) << "]";
break;
case InterpolatedFragment::TYPE:
os << "type[" << *reinterpret_cast<TypeRef*>(x.m_ptr) << "]";
break;
case InterpolatedFragment::EXPR:
os << "expr[" << *reinterpret_cast<const AST::ExprNode*>(x.m_ptr) << "]";
break;
case InterpolatedFragment::STMT:
os << "stmt[" << *reinterpret_cast<const AST::ExprNode*>(x.m_ptr) << "]";
break;
case InterpolatedFragment::BLOCK:
os << "block[" << *reinterpret_cast<const AST::ExprNode*>(x.m_ptr) << "]";
break;
case InterpolatedFragment::META:
os << "meta[" << *reinterpret_cast<const AST::Attribute*>(x.m_ptr) << "]";
break;
case InterpolatedFragment::ITEM: {
const auto& named_item = *reinterpret_cast<const AST::Named<AST::Item>*>(x.m_ptr);
os << "item[" << named_item.data.tag_str() << "(" << named_item.name << ")]";
} break;
}
return os;
}
|