8 const std::shared_ptr<Expr> E;
9 const std::shared_ptr<Dot> Do;
10 const std::shared_ptr<AttrPath> Path;
11 const std::shared_ptr<Expr> Default;
12 const Expr *DesugaredFrom;
16 std::shared_ptr<Dot> Do, std::shared_ptr<AttrPath> Path,
17 std::shared_ptr<Expr> Default,
const Expr *DesugaredFrom)
18 :
Expr(NK_ExprSelect, Range), E(std::move(E)), Do(std::move(Do)),
19 Path(std::move(Path)), Default(std::move(Default)),
20 DesugaredFrom(DesugaredFrom) {
21 assert(this->E &&
"E must not be null");
25 assert(E &&
"E must not be null");
31 [[nodiscard]]
Dot *
dot()
const {
return Do.get(); }
38 return {E.get(), Path.get(), Default.get()};
44 const std::shared_ptr<Expr> Fn;
45 const std::vector<std::shared_ptr<Expr>> Args;
49 std::vector<std::shared_ptr<Expr>> Args)
50 :
Expr(NK_ExprCall, Range), Fn(std::move(Fn)), Args(std::move(Args)) {
51 assert(this->Fn &&
"Fn must not be null");
55 assert(Fn &&
"Fn must not be null");
59 [[nodiscard]]
const std::vector<std::shared_ptr<Expr>> &
args()
const {
65 Children.reserve(Args.size() + 1);
66 Children.emplace_back(Fn.get());
67 for (
const auto &Member : Args) {
68 Children.emplace_back(Member.get());
75 const std::vector<std::shared_ptr<Expr>> Elements;
79 :
Expr(NK_ExprList, Range), Elements(std::move(Elements)) {}
81 [[nodiscard]]
const std::vector<std::shared_ptr<Expr>> &
elements()
const {
87 Children.reserve(Elements.size());
88 for (
const auto &Element : Elements) {
89 Children.emplace_back(Element.get());
96 const std::shared_ptr<Expr> Cond;
97 const std::shared_ptr<Expr> Then;
98 const std::shared_ptr<Expr> Else;
102 std::shared_ptr<Expr> Then, std::shared_ptr<Expr> Else)
103 :
Expr(NK_ExprIf, Range), Cond(std::move(Cond)), Then(std::move(Then)),
104 Else(std::move(Else)) {}
106 [[nodiscard]]
Expr *
cond()
const {
return Cond.get(); }
107 [[nodiscard]]
Expr *
then()
const {
return Then.get(); }
111 return {Cond.get(), Then.get(), Else.get()};
116 const std::shared_ptr<Expr> Cond;
117 const std::shared_ptr<Expr>
122 std::shared_ptr<Expr> Value)
123 :
Expr(NK_ExprAssert, Range), Cond(std::move(Cond)),
124 Value(std::move(Value)) {}
126 [[nodiscard]]
Expr *
cond()
const {
return Cond.get(); }
127 [[nodiscard]]
Expr *
value()
const {
return Value.get(); }
130 return {Cond.get(), Value.get()};
137 const std::shared_ptr<Misc> KwLet;
138 const std::shared_ptr<Misc> KwIn;
139 const std::shared_ptr<Expr> E;
141 const std::shared_ptr<ExprAttrs> Attrs;
145 std::shared_ptr<Misc> KwIn, std::shared_ptr<Expr> E,
146 std::shared_ptr<ExprAttrs> Attrs)
147 :
Expr(NK_ExprLet, Range), KwLet(std::move(KwLet)), KwIn(std::move(KwIn)),
148 E(std::move(E)), Attrs(std::move(Attrs)) {
149 assert(this->KwLet &&
"KwLet should not be empty!");
153 return Attrs ? Attrs->binds() :
nullptr;
156 [[nodiscard]]
const Expr *
expr()
const {
return E.get(); }
157 [[nodiscard]]
const Misc &
let()
const {
return *KwLet; }
158 [[nodiscard]]
const Misc *
in()
const {
return KwIn.get(); }
161 return {KwLet.get(), Attrs.get(), KwIn.get(), E.get()};
166 const std::shared_ptr<Misc> KwWith;
167 const std::shared_ptr<Misc> TokSemi;
168 const std::shared_ptr<Expr> With;
169 const std::shared_ptr<Expr> E;
173 std::shared_ptr<Misc> TokSemi, std::shared_ptr<Expr> With,
174 std::shared_ptr<Expr> E)
175 :
Expr(NK_ExprWith, Range), KwWith(std::move(KwWith)),
176 TokSemi(std::move(TokSemi)), With(std::move(With)), E(std::move(E)) {}
179 [[nodiscard]]
const Misc *
tokSemi()
const {
return TokSemi.get(); }
180 [[nodiscard]]
Expr *
with()
const {
return With.get(); }
181 [[nodiscard]]
Expr *
expr()
const {
return E.get(); }
184 return {KwWith.get(), TokSemi.get(), With.get(), E.get()};
Holds a "." in the language.
ExprAssert(LexerCursorRange Range, std::shared_ptr< Expr > Cond, std::shared_ptr< Expr > Value)
ChildVector children() const override
ExprCall(LexerCursorRange Range, std::shared_ptr< Expr > Fn, std::vector< std::shared_ptr< Expr > > Args)
ChildVector children() const override
const std::vector< std::shared_ptr< Expr > > & args() const
ExprIf(LexerCursorRange Range, std::shared_ptr< Expr > Cond, std::shared_ptr< Expr > Then, std::shared_ptr< Expr > Else)
ChildVector children() const override
ExprLet(LexerCursorRange Range, std::shared_ptr< Misc > KwLet, std::shared_ptr< Misc > KwIn, std::shared_ptr< Expr > E, std::shared_ptr< ExprAttrs > Attrs)
const Binds * binds() const
const ExprAttrs * attrs() const
const Expr * expr() const
ChildVector children() const override
const std::vector< std::shared_ptr< Expr > > & elements() const
ChildVector children() const override
ExprList(LexerCursorRange Range, std::vector< std::shared_ptr< Expr > > Elements)
ExprSelect(LexerCursorRange Range, std::shared_ptr< Expr > E, std::shared_ptr< Dot > Do, std::shared_ptr< AttrPath > Path, std::shared_ptr< Expr > Default, const Expr *DesugaredFrom)
ChildVector children() const override
const Expr * desugaredFrom() const
Expr * defaultExpr() const
const Misc & kwWith() const
const Misc * tokSemi() const
ExprWith(LexerCursorRange Range, std::shared_ptr< Misc > KwWith, std::shared_ptr< Misc > TokSemi, std::shared_ptr< Expr > With, std::shared_ptr< Expr > E)
ChildVector children() const override
Expr(NodeKind Kind, LexerCursorRange Range)
Misc node, used for parentheses, keywords, etc.
boost::container::small_vector< Node *, 8 > ChildVector