Serenity Operating System
1/*
2 * Copyright (c) 2020, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include "NodeVisitor.h"
8#include "AST.h"
9
10namespace Shell::AST {
11
12void NodeVisitor::visit(const AST::PathRedirectionNode* node)
13{
14 node->path()->visit(*this);
15}
16
17void NodeVisitor::visit(const AST::And* node)
18{
19 node->left()->visit(*this);
20 node->right()->visit(*this);
21}
22
23void NodeVisitor::visit(const AST::ListConcatenate* node)
24{
25 for (auto& subnode : node->list())
26 subnode->visit(*this);
27}
28
29void NodeVisitor::visit(const AST::Background* node)
30{
31 node->command()->visit(*this);
32}
33
34void NodeVisitor::visit(const AST::BarewordLiteral*)
35{
36}
37
38void NodeVisitor::visit(const AST::BraceExpansion* node)
39{
40 for (auto& entry : node->entries())
41 entry->visit(*this);
42}
43
44void NodeVisitor::visit(const AST::CastToCommand* node)
45{
46 node->inner()->visit(*this);
47}
48
49void NodeVisitor::visit(const AST::CastToList* node)
50{
51 if (node->inner())
52 node->inner()->visit(*this);
53}
54
55void NodeVisitor::visit(const AST::CloseFdRedirection*)
56{
57}
58
59void NodeVisitor::visit(const AST::CommandLiteral*)
60{
61}
62
63void NodeVisitor::visit(const AST::Comment*)
64{
65}
66
67void NodeVisitor::visit(const AST::ContinuationControl*)
68{
69}
70
71void NodeVisitor::visit(const AST::DynamicEvaluate* node)
72{
73 node->inner()->visit(*this);
74}
75
76void NodeVisitor::visit(const AST::DoubleQuotedString* node)
77{
78 if (node->inner())
79 node->inner()->visit(*this);
80}
81
82void NodeVisitor::visit(const AST::Fd2FdRedirection*)
83{
84}
85
86void NodeVisitor::visit(const AST::FunctionDeclaration* node)
87{
88 if (node->block())
89 node->block()->visit(*this);
90}
91
92void NodeVisitor::visit(const AST::ForLoop* node)
93{
94 if (node->iterated_expression())
95 node->iterated_expression()->visit(*this);
96 if (node->block())
97 node->block()->visit(*this);
98}
99
100void NodeVisitor::visit(const AST::Glob*)
101{
102}
103
104void NodeVisitor::visit(const AST::Heredoc* node)
105{
106 if (node->contents())
107 node->contents()->visit(*this);
108}
109
110void NodeVisitor::visit(const AST::HistoryEvent*)
111{
112}
113
114void NodeVisitor::visit(const AST::Execute* node)
115{
116 node->command()->visit(*this);
117}
118
119void NodeVisitor::visit(const AST::IfCond* node)
120{
121 node->condition()->visit(*this);
122 if (node->true_branch())
123 node->true_branch()->visit(*this);
124 if (node->false_branch())
125 node->false_branch()->visit(*this);
126}
127
128void NodeVisitor::visit(const AST::ImmediateExpression* node)
129{
130 for (auto& node : node->arguments())
131 node->visit(*this);
132}
133
134void NodeVisitor::visit(const AST::Join* node)
135{
136 node->left()->visit(*this);
137 node->right()->visit(*this);
138}
139
140void NodeVisitor::visit(const AST::MatchExpr* node)
141{
142 node->matched_expr()->visit(*this);
143 for (auto& entry : node->entries()) {
144 if (auto* ptr = entry.options.get_pointer<Vector<NonnullRefPtr<Node>>>()) {
145 for (auto& option : *ptr)
146 option->visit(*this);
147 }
148 if (entry.body)
149 entry.body->visit(*this);
150 }
151}
152
153void NodeVisitor::visit(const AST::Or* node)
154{
155 node->left()->visit(*this);
156 node->right()->visit(*this);
157}
158
159void NodeVisitor::visit(const AST::Pipe* node)
160{
161 node->left()->visit(*this);
162 node->right()->visit(*this);
163}
164
165void NodeVisitor::visit(const AST::Range* node)
166{
167 node->start()->visit(*this);
168 node->end()->visit(*this);
169}
170
171void NodeVisitor::visit(const AST::ReadRedirection* node)
172{
173 visit(static_cast<const AST::PathRedirectionNode*>(node));
174}
175
176void NodeVisitor::visit(const AST::ReadWriteRedirection* node)
177{
178 visit(static_cast<const AST::PathRedirectionNode*>(node));
179}
180
181void NodeVisitor::visit(const AST::Sequence* node)
182{
183 for (auto& entry : node->entries())
184 entry->visit(*this);
185}
186
187void NodeVisitor::visit(const AST::Subshell* node)
188{
189 if (node->block())
190 node->block()->visit(*this);
191}
192
193void NodeVisitor::visit(const AST::Slice* node)
194{
195 node->selector()->visit(*this);
196}
197
198void NodeVisitor::visit(const AST::SimpleVariable* node)
199{
200 if (const AST::Node* slice = node->slice())
201 slice->visit(*this);
202}
203
204void NodeVisitor::visit(const AST::SpecialVariable* node)
205{
206 if (const AST::Node* slice = node->slice())
207 slice->visit(*this);
208}
209
210void NodeVisitor::visit(const AST::Juxtaposition* node)
211{
212 node->left()->visit(*this);
213 node->right()->visit(*this);
214}
215
216void NodeVisitor::visit(const AST::StringLiteral*)
217{
218}
219
220void NodeVisitor::visit(const AST::StringPartCompose* node)
221{
222 node->left()->visit(*this);
223 node->right()->visit(*this);
224}
225
226void NodeVisitor::visit(const AST::SyntaxError*)
227{
228}
229
230void NodeVisitor::visit(const AST::SyntheticNode*)
231{
232}
233
234void NodeVisitor::visit(const AST::Tilde*)
235{
236}
237
238void NodeVisitor::visit(const AST::VariableDeclarations* node)
239{
240 for (auto& entry : node->variables()) {
241 entry.name->visit(*this);
242 entry.value->visit(*this);
243 }
244}
245
246void NodeVisitor::visit(const AST::WriteAppendRedirection* node)
247{
248 visit(static_cast<const AST::PathRedirectionNode*>(node));
249}
250
251void NodeVisitor::visit(const AST::WriteRedirection* node)
252{
253 visit(static_cast<const AST::PathRedirectionNode*>(node));
254}
255
256}