nixd
Toggle main menu visibility
Loading...
Searching...
No Matches
libnixf
src
Basic
Nodes.cpp
Go to the documentation of this file.
1
#include "
nixf/Basic/Nodes/Simple.h
"
2
3
using namespace
nixf
;
4
5
namespace
{
6
7
std::vector<InterpolablePart>
8
mergeFragments(std::vector<InterpolablePart> Fragments) {
9
if
(Fragments.empty())
10
return
Fragments;
11
12
// Check if the fragment forms a string literal (i.e. no interpolation)
13
for
(
const
InterpolablePart
&Frag : Fragments) {
14
if
(Frag.kind() ==
InterpolablePart::SPK_Interpolation
)
15
return
Fragments;
16
}
17
18
// Concatenate the fragments into a singe "Escaped"
19
// TODO: perform actual escaping.
20
std::string Escaped;
21
for
(
const
InterpolablePart
&Frag : Fragments) {
22
assert(Frag.kind() ==
InterpolablePart::SPK_Escaped
&&
23
"Only Escaped fragments can be concatenated"
);
24
Escaped += Frag.escaped();
25
}
26
27
Fragments.clear();
28
Fragments.emplace_back(std::move(Escaped));
29
30
return
Fragments;
31
}
32
33
}
// namespace
34
35
[[nodiscard]]
const
char
*
Node::name
(
NodeKind
Kind) {
36
switch
(Kind) {
37
#define EXPR(NAME) \
38
case NK_##NAME: \
39
return #NAME;
40
#define NODE(NAME) \
41
case NK_##NAME: \
42
return #NAME;
43
#include "
nixf/Basic/NodeKinds.inc
"
44
#undef EXPR
45
#undef NODE
46
default
:
47
assert(
false
&&
"Not yet implemented!"
);
48
}
49
assert(
false
&&
"Not yet implemented!"
);
50
__builtin_unreachable();
51
}
52
53
InterpolatedParts::InterpolatedParts
(
LexerCursorRange
Range,
54
std::vector<InterpolablePart> Fragments)
55
:
Node
(NK_InterpolableParts, Range),
56
Fragments(mergeFragments(std::move(Fragments))) {}
NodeKinds.inc
Simple.h
nixf::InterpolablePart
Definition
Simple.h:50
nixf::InterpolablePart::SPK_Interpolation
@ SPK_Interpolation
Definition
Simple.h:54
nixf::InterpolablePart::SPK_Escaped
@ SPK_Escaped
Definition
Simple.h:53
nixf::InterpolatedParts::InterpolatedParts
InterpolatedParts(LexerCursorRange Range, std::vector< InterpolablePart > Fragments)
Definition
Nodes.cpp:53
nixf::LexerCursorRange
Definition
Range.h:105
nixf::Node::name
const char * name() const
Definition
Basic.h:40
nixf::Node::NodeKind
NodeKind
Definition
Basic.h:14
nixf::Node::Node
Node(NodeKind Kind, LexerCursorRange Range)
Definition
Basic.h:30
nixf
Definition
Diagnostic.h:19
Generated by
1.17.0