Serenity Operating System
at master 256 lines 5.2 kB view raw
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}