nixd
Loading...
Searching...
No Matches
Simple.h
Go to the documentation of this file.
1#pragma once
2
3#include "Basic.h"
4
5#include <boost/container/small_vector.hpp>
6
7#include <memory>
8#include <vector>
9
10namespace nixf {
11
12using NixInt = int64_t;
13using NixFloat = double;
14
15class ExprInt : public Expr {
16 const NixInt Value;
17
18public:
20 : Expr(NK_ExprInt, Range), Value(Value) {}
21 [[nodiscard]] NixInt value() const { return Value; }
22
23 [[nodiscard]] ChildVector children() const override { return {}; }
24};
25
26class ExprFloat : public Expr {
27 const NixFloat Value;
28
29public:
31 : Expr(NK_ExprFloat, Range), Value(Value) {}
32 [[nodiscard]] NixFloat value() const { return Value; }
33
34 [[nodiscard]] ChildVector children() const override { return {}; }
35};
36
37/// \brief `${expr}` construct
38class Interpolation : public Node {
39 const std::shared_ptr<Expr> E;
40
41public:
42 Interpolation(LexerCursorRange Range, std::shared_ptr<Expr> E)
43 : Node(NK_Interpolation, Range), E(std::move(E)) {}
44
45 [[nodiscard]] Expr *expr() const { return E.get(); }
46
47 [[nodiscard]] ChildVector children() const override { return {E.get()}; }
48};
49
51public:
56
57private:
58 const InterpolablePartKind Kind;
59 const std::string Escaped;
60 const std::shared_ptr<Interpolation> Interp;
61
62public:
63 explicit InterpolablePart(std::string Escaped)
64 : Kind(SPK_Escaped), Escaped(std::move(Escaped)), Interp(nullptr) {}
65
66 explicit InterpolablePart(std::shared_ptr<Interpolation> Interp)
67 : Kind(SPK_Interpolation), Interp(std::move(Interp)) {
68 assert(this->Interp && "interpolation must not be null");
69 }
70
71 [[nodiscard]] InterpolablePartKind kind() const { return Kind; }
72
73 [[nodiscard]] const std::string &escaped() const {
74 assert(Kind == SPK_Escaped);
75 return Escaped;
76 }
77
78 [[nodiscard]] Interpolation &interpolation() const {
79 assert(Kind == SPK_Interpolation);
80 assert(Interp && "interpolation must not be null");
81 return *Interp;
82 }
83};
84
85class InterpolatedParts : public Node {
86 const std::vector<InterpolablePart> Fragments;
87
88public:
90 std::vector<InterpolablePart> Fragments);
91
92 [[nodiscard]] const std::vector<InterpolablePart> &fragments() const {
93 return Fragments;
94 };
95
96 [[nodiscard]] bool isLiteral() const {
97 return Fragments.size() == 1 &&
98 Fragments[0].kind() == InterpolablePart::SPK_Escaped;
99 }
100
101 [[nodiscard]] const std::string &literal() const {
102 assert(isLiteral() && "must be a literal");
103 return Fragments[0].escaped();
104 }
105
106 [[nodiscard]] ChildVector children() const override {
107 ChildVector Children;
108 for (const auto &Frag : Fragments) {
109 if (Frag.kind() == InterpolablePart::SPK_Interpolation)
110 Children.emplace_back(&Frag.interpolation());
111 }
112 return Children;
113 }
114};
115
116class ExprString : public Expr {
117 const std::shared_ptr<InterpolatedParts> Parts;
118
119public:
120 ExprString(LexerCursorRange Range, std::shared_ptr<InterpolatedParts> Parts)
121 : Expr(NK_ExprString, Range), Parts(std::move(Parts)) {
122 assert(this->Parts && "parts must not be null");
123 }
124
125 [[nodiscard]] const InterpolatedParts &parts() const {
126 assert(Parts && "parts must not be null");
127 return *Parts;
128 }
129
130 [[nodiscard]] bool isLiteral() const {
131 assert(Parts && "parts must not be null");
132 return Parts->isLiteral();
133 }
134
135 [[nodiscard]] const std::string &literal() const {
136 assert(Parts && "parts must not be null");
137 return Parts->literal();
138 }
139
140 [[nodiscard]] ChildVector children() const override { return {Parts.get()}; }
141};
142
143class ExprPath : public Expr {
144 std::shared_ptr<InterpolatedParts> Parts;
145
146public:
147 ExprPath(LexerCursorRange Range, std::shared_ptr<InterpolatedParts> Parts)
148 : Expr(NK_ExprPath, Range), Parts(std::move(Parts)) {
149 assert(this->Parts && "parts must not be null");
150 }
151
152 [[nodiscard]] const InterpolatedParts &parts() const {
153 assert(Parts && "parts must not be null");
154 return *Parts;
155 }
156
157 [[nodiscard]] ChildVector children() const override { return {Parts.get()}; }
158};
159
160class ExprSPath : public Expr {
161 std::string Text;
162
163public:
164 ExprSPath(LexerCursorRange Range, std::string Text)
165 : Expr(NK_ExprSPath, Range), Text(std::move(Text)) {}
166
167 [[nodiscard]] ChildVector children() const override { return {}; }
168
169 [[nodiscard]] const std::string &text() const { return Text; }
170};
171
172class ExprParen : public Expr {
173 const std::shared_ptr<Expr> E;
174 const std::shared_ptr<Misc> LParen;
175 const std::shared_ptr<Misc> RParen;
176
177public:
178 ExprParen(LexerCursorRange Range, std::shared_ptr<Expr> E,
179 std::shared_ptr<Misc> LParen, std::shared_ptr<Misc> RParen)
180 : Expr(NK_ExprParen, Range), E(std::move(E)), LParen(std::move(LParen)),
181 RParen(std::move(RParen)) {}
182
183 [[nodiscard]] const Expr *expr() const { return E.get(); }
184 [[nodiscard]] const Misc *lparen() const { return LParen.get(); }
185 [[nodiscard]] const Misc *rparen() const { return RParen.get(); }
186
187 [[nodiscard]] ChildVector children() const override {
188 return {E.get(), LParen.get(), RParen.get()};
189 }
190};
191
192class ExprVar : public Expr {
193 const std::shared_ptr<Identifier> ID;
194
195public:
196 ExprVar(LexerCursorRange Range, std::shared_ptr<Identifier> ID)
197 : Expr(NK_ExprVar, Range), ID(std::move(ID)) {
198 assert(this->ID && "ID must not be null");
199 }
200 [[nodiscard]] const Identifier &id() const {
201 assert(ID && "ID must not be null");
202 return *ID;
203 }
204
205 [[nodiscard]] ChildVector children() const override { return {ID.get()}; }
206};
207
208} // namespace nixf
ExprFloat(LexerCursorRange Range, NixFloat Value)
Definition Simple.h:30
NixFloat value() const
Definition Simple.h:32
ChildVector children() const override
Definition Simple.h:34
ChildVector children() const override
Definition Simple.h:23
NixInt value() const
Definition Simple.h:21
ExprInt(LexerCursorRange Range, NixInt Value)
Definition Simple.h:19
const Expr * expr() const
Definition Simple.h:183
const Misc * rparen() const
Definition Simple.h:185
ChildVector children() const override
Definition Simple.h:187
ExprParen(LexerCursorRange Range, std::shared_ptr< Expr > E, std::shared_ptr< Misc > LParen, std::shared_ptr< Misc > RParen)
Definition Simple.h:178
const Misc * lparen() const
Definition Simple.h:184
ChildVector children() const override
Definition Simple.h:157
ExprPath(LexerCursorRange Range, std::shared_ptr< InterpolatedParts > Parts)
Definition Simple.h:147
const InterpolatedParts & parts() const
Definition Simple.h:152
ChildVector children() const override
Definition Simple.h:167
const std::string & text() const
Definition Simple.h:169
ExprSPath(LexerCursorRange Range, std::string Text)
Definition Simple.h:164
bool isLiteral() const
Definition Simple.h:130
ChildVector children() const override
Definition Simple.h:140
const std::string & literal() const
Definition Simple.h:135
const InterpolatedParts & parts() const
Definition Simple.h:125
ExprString(LexerCursorRange Range, std::shared_ptr< InterpolatedParts > Parts)
Definition Simple.h:120
ChildVector children() const override
Definition Simple.h:205
const Identifier & id() const
Definition Simple.h:200
ExprVar(LexerCursorRange Range, std::shared_ptr< Identifier > ID)
Definition Simple.h:196
Identifier. Variable names, attribute names, etc.
Definition Basic.h:114
InterpolablePart(std::string Escaped)
Definition Simple.h:63
InterpolablePartKind kind() const
Definition Simple.h:71
const std::string & escaped() const
Definition Simple.h:73
InterpolablePart(std::shared_ptr< Interpolation > Interp)
Definition Simple.h:66
Interpolation & interpolation() const
Definition Simple.h:78
InterpolatedParts(LexerCursorRange Range, std::vector< InterpolablePart > Fragments)
Definition Nodes.cpp:53
ChildVector children() const override
Definition Simple.h:106
const std::string & literal() const
Definition Simple.h:101
bool isLiteral() const
Definition Simple.h:96
const std::vector< InterpolablePart > & fragments() const
Definition Simple.h:92
${expr} construct
Definition Simple.h:38
ChildVector children() const override
Definition Simple.h:47
Interpolation(LexerCursorRange Range, std::shared_ptr< Expr > E)
Definition Simple.h:42
Expr * expr() const
Definition Simple.h:45
Misc node, used for parentheses, keywords, etc.
Definition Basic.h:106
boost::container::small_vector< Node *, 8 > ChildVector
Definition Basic.h:42
int64_t NixInt
Definition Simple.h:12
double NixFloat
Definition Simple.h:13