nixd
Loading...
Searching...
No Matches
Nodes.cpp
Go to the documentation of this file.
2
3using namespace nixf;
4
5namespace {
6
7std::vector<InterpolablePart>
8mergeFragments(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;
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
54 std::vector<InterpolablePart> Fragments)
55 : Node(NK_InterpolableParts, Range),
56 Fragments(mergeFragments(std::move(Fragments))) {}
InterpolatedParts(LexerCursorRange Range, std::vector< InterpolablePart > Fragments)
Definition Nodes.cpp:53
const char * name() const
Definition Basic.h:40