AST.h 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "Forward.h"
  8. #include "Job.h"
  9. #include "NodeVisitor.h"
  10. #include <AK/Format.h>
  11. #include <AK/NonnullRefPtr.h>
  12. #include <AK/RefCounted.h>
  13. #include <AK/RefPtr.h>
  14. #include <AK/String.h>
  15. #include <AK/Types.h>
  16. #include <AK/Vector.h>
  17. #include <LibLine/Editor.h>
  18. namespace Shell::AST {
  19. using AK::make_ref_counted;
  20. template<typename T>
  21. static inline NonnullRefPtr<T> make_ref_counted(std::initializer_list<NonnullRefPtr<Value>> arg)
  22. {
  23. return adopt_ref(*new T(arg));
  24. }
  25. struct HighlightMetadata {
  26. bool is_first_in_list { true };
  27. };
  28. struct Position {
  29. size_t start_offset { 0 };
  30. size_t end_offset { 0 };
  31. struct Line {
  32. size_t line_number { 0 };
  33. size_t line_column { 0 };
  34. bool operator==(const Line& other) const
  35. {
  36. return line_number == other.line_number && line_column == other.line_column;
  37. }
  38. } start_line, end_line;
  39. bool contains(size_t offset) const { return start_offset <= offset && offset <= end_offset; }
  40. };
  41. struct NameWithPosition {
  42. String name;
  43. Position position;
  44. };
  45. struct FdRedirection;
  46. struct Rewiring : public RefCounted<Rewiring> {
  47. int old_fd { -1 };
  48. int new_fd { -1 };
  49. FdRedirection* other_pipe_end { nullptr };
  50. enum class Close {
  51. None,
  52. Old,
  53. New,
  54. RefreshNew,
  55. RefreshOld,
  56. ImmediatelyCloseNew,
  57. } fd_action { Close::None };
  58. Rewiring(int source, int dest, Close close = Close::None)
  59. : old_fd(source)
  60. , new_fd(dest)
  61. , fd_action(close)
  62. {
  63. }
  64. Rewiring(int source, int dest, FdRedirection* other_end, Close close)
  65. : old_fd(source)
  66. , new_fd(dest)
  67. , other_pipe_end(other_end)
  68. , fd_action(close)
  69. {
  70. }
  71. };
  72. struct Redirection : public RefCounted<Redirection> {
  73. virtual ErrorOr<NonnullRefPtr<Rewiring>> apply() const = 0;
  74. virtual ~Redirection();
  75. virtual bool is_path_redirection() const { return false; }
  76. virtual bool is_fd_redirection() const { return false; }
  77. virtual bool is_close_redirection() const { return false; }
  78. };
  79. struct CloseRedirection : public Redirection {
  80. int fd { -1 };
  81. virtual ErrorOr<NonnullRefPtr<Rewiring>> apply() const override;
  82. virtual ~CloseRedirection();
  83. CloseRedirection(int fd)
  84. : fd(fd)
  85. {
  86. }
  87. private:
  88. virtual bool is_close_redirection() const override { return true; }
  89. };
  90. struct PathRedirection : public Redirection {
  91. String path;
  92. int fd { -1 };
  93. enum {
  94. Read,
  95. Write,
  96. WriteAppend,
  97. ReadWrite,
  98. } direction { Read };
  99. static NonnullRefPtr<PathRedirection> create(String path, int fd, decltype(direction) direction)
  100. {
  101. return adopt_ref(*new PathRedirection(move(path), fd, direction));
  102. }
  103. virtual ErrorOr<NonnullRefPtr<Rewiring>> apply() const override;
  104. virtual ~PathRedirection();
  105. private:
  106. PathRedirection(String path, int fd, decltype(direction) direction)
  107. : path(move(path))
  108. , fd(fd)
  109. , direction(direction)
  110. {
  111. }
  112. virtual bool is_path_redirection() const override { return true; }
  113. };
  114. struct FdRedirection : public Redirection {
  115. public:
  116. static NonnullRefPtr<FdRedirection> create(int old_fd, int new_fd, Rewiring::Close close)
  117. {
  118. return adopt_ref(*new FdRedirection(old_fd, new_fd, close));
  119. }
  120. static NonnullRefPtr<FdRedirection> create(int old_fd, int new_fd, FdRedirection* pipe_end, Rewiring::Close close)
  121. {
  122. return adopt_ref(*new FdRedirection(old_fd, new_fd, pipe_end, close));
  123. }
  124. virtual ~FdRedirection();
  125. virtual ErrorOr<NonnullRefPtr<Rewiring>> apply() const override
  126. {
  127. return adopt_ref(*new Rewiring(old_fd, new_fd, other_pipe_end, action));
  128. }
  129. int old_fd { -1 };
  130. int new_fd { -1 };
  131. FdRedirection* other_pipe_end { nullptr };
  132. Rewiring::Close action { Rewiring::Close::None };
  133. private:
  134. FdRedirection(int source, int dest, Rewiring::Close close)
  135. : FdRedirection(source, dest, nullptr, close)
  136. {
  137. }
  138. FdRedirection(int old_fd, int new_fd, FdRedirection* pipe_end, Rewiring::Close close)
  139. : old_fd(old_fd)
  140. , new_fd(new_fd)
  141. , other_pipe_end(pipe_end)
  142. , action(close)
  143. {
  144. }
  145. virtual bool is_fd_redirection() const override { return true; }
  146. };
  147. class Pipeline : public RefCounted<Pipeline> {
  148. public:
  149. pid_t pgid { -1 };
  150. };
  151. struct NodeWithAction {
  152. mutable NonnullRefPtr<Node> node;
  153. enum Action {
  154. And,
  155. Or,
  156. Sequence,
  157. } action;
  158. NodeWithAction(Node& node, Action action)
  159. : node(node)
  160. , action(action)
  161. {
  162. }
  163. };
  164. struct Command {
  165. Vector<String> argv;
  166. NonnullRefPtrVector<Redirection> redirections;
  167. bool should_wait { true };
  168. bool is_pipe_source { false };
  169. bool should_notify_if_in_background { true };
  170. bool should_immediately_execute_next { false };
  171. mutable RefPtr<Pipeline> pipeline;
  172. Vector<NodeWithAction> next_chain;
  173. Optional<Position> position;
  174. };
  175. struct HitTestResult {
  176. RefPtr<Node> matching_node;
  177. RefPtr<Node> closest_node_with_semantic_meaning; // This is used if matching_node is a bareword
  178. RefPtr<Node> closest_command_node; // This is used if matching_node is a bareword, and it is not the first in a list
  179. };
  180. class Value : public RefCounted<Value> {
  181. public:
  182. virtual Vector<String> resolve_as_list(RefPtr<Shell>) = 0;
  183. virtual Vector<Command> resolve_as_commands(RefPtr<Shell>);
  184. virtual NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) { return *this; }
  185. virtual NonnullRefPtr<Value> clone() const = 0;
  186. virtual NonnullRefPtr<Value> with_slices(NonnullRefPtr<Slice> slice) const&;
  187. virtual NonnullRefPtr<Value> with_slices(NonnullRefPtrVector<Slice> slices) const&;
  188. virtual ~Value();
  189. virtual bool is_command() const { return false; }
  190. virtual bool is_glob() const { return false; }
  191. virtual bool is_job() const { return false; }
  192. virtual bool is_list() const { return false; }
  193. virtual bool is_string() const { return false; }
  194. virtual bool is_list_without_resolution() const { return false; }
  195. protected:
  196. Value& set_slices(NonnullRefPtrVector<Slice> slices)
  197. {
  198. m_slices = move(slices);
  199. return *this;
  200. }
  201. NonnullRefPtrVector<Slice> m_slices;
  202. };
  203. class CommandValue final : public Value {
  204. public:
  205. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  206. virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override;
  207. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<CommandValue>(m_command)->set_slices(m_slices); }
  208. virtual ~CommandValue();
  209. virtual bool is_command() const override { return true; }
  210. CommandValue(Command command)
  211. : m_command(move(command))
  212. {
  213. }
  214. CommandValue(Vector<String> argv, Position position)
  215. : m_command({ move(argv), {}, true, false, true, false, nullptr, {}, move(position) })
  216. {
  217. }
  218. private:
  219. Command m_command;
  220. };
  221. class CommandSequenceValue final : public Value {
  222. public:
  223. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  224. virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override;
  225. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<CommandSequenceValue>(m_contained_values)->set_slices(m_slices); }
  226. virtual ~CommandSequenceValue();
  227. virtual bool is_command() const override { return true; }
  228. CommandSequenceValue(Vector<Command> commands)
  229. : m_contained_values(move(commands))
  230. {
  231. }
  232. private:
  233. Vector<Command> m_contained_values;
  234. };
  235. class JobValue final : public Value {
  236. public:
  237. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override { VERIFY_NOT_REACHED(); }
  238. virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override { VERIFY_NOT_REACHED(); }
  239. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<JobValue>(m_job)->set_slices(m_slices); }
  240. virtual ~JobValue();
  241. virtual bool is_job() const override { return true; }
  242. JobValue(RefPtr<Job> job)
  243. : m_job(move(job))
  244. {
  245. }
  246. const RefPtr<Job> job() const { return m_job; }
  247. private:
  248. RefPtr<Job> m_job;
  249. };
  250. class ListValue final : public Value {
  251. public:
  252. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  253. virtual NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) override;
  254. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<ListValue>(m_contained_values)->set_slices(m_slices); }
  255. virtual ~ListValue();
  256. virtual bool is_list() const override { return true; }
  257. virtual bool is_list_without_resolution() const override { return true; }
  258. ListValue(Vector<String> values);
  259. ListValue(Vector<NonnullRefPtr<Value>> values)
  260. : m_contained_values(move(static_cast<NonnullRefPtrVector<Value>&>(values)))
  261. {
  262. }
  263. ListValue(NonnullRefPtrVector<Value> values)
  264. : m_contained_values(move(values))
  265. {
  266. }
  267. const NonnullRefPtrVector<Value>& values() const { return m_contained_values; }
  268. NonnullRefPtrVector<Value>& values() { return m_contained_values; }
  269. private:
  270. NonnullRefPtrVector<Value> m_contained_values;
  271. };
  272. class StringValue final : public Value {
  273. public:
  274. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  275. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<StringValue>(m_string, m_split, m_keep_empty)->set_slices(m_slices); }
  276. virtual ~StringValue();
  277. virtual bool is_string() const override { return m_split.is_null(); }
  278. virtual bool is_list() const override { return !m_split.is_null(); }
  279. NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) override;
  280. StringValue(String string, String split_by = {}, bool keep_empty = false)
  281. : m_string(move(string))
  282. , m_split(move(split_by))
  283. , m_keep_empty(keep_empty)
  284. {
  285. }
  286. private:
  287. String m_string;
  288. String m_split;
  289. bool m_keep_empty { false };
  290. };
  291. class GlobValue final : public Value {
  292. public:
  293. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  294. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<GlobValue>(m_glob, m_generation_position)->set_slices(m_slices); }
  295. virtual ~GlobValue();
  296. virtual bool is_glob() const override { return true; }
  297. GlobValue(String glob, Position position)
  298. : m_glob(move(glob))
  299. , m_generation_position(move(position))
  300. {
  301. }
  302. private:
  303. String m_glob;
  304. Position m_generation_position;
  305. };
  306. class SimpleVariableValue final : public Value {
  307. public:
  308. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  309. virtual NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) override;
  310. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<SimpleVariableValue>(m_name)->set_slices(m_slices); }
  311. virtual ~SimpleVariableValue();
  312. SimpleVariableValue(String name)
  313. : m_name(move(name))
  314. {
  315. }
  316. private:
  317. String m_name;
  318. };
  319. class SpecialVariableValue final : public Value {
  320. public:
  321. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  322. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<SpecialVariableValue>(m_name)->set_slices(m_slices); }
  323. virtual ~SpecialVariableValue();
  324. SpecialVariableValue(char name)
  325. : m_name(name)
  326. {
  327. }
  328. private:
  329. char m_name { 0 };
  330. };
  331. class TildeValue final : public Value {
  332. public:
  333. virtual Vector<String> resolve_as_list(RefPtr<Shell>) override;
  334. virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<TildeValue>(m_username)->set_slices(m_slices); }
  335. virtual ~TildeValue();
  336. virtual bool is_string() const override { return true; }
  337. TildeValue(String name)
  338. : m_username(move(name))
  339. {
  340. }
  341. private:
  342. String m_username;
  343. };
  344. class Node : public RefCounted<Node> {
  345. AK_MAKE_NONCOPYABLE(Node);
  346. AK_MAKE_NONMOVABLE(Node);
  347. public:
  348. virtual void dump(int level) const = 0;
  349. virtual void for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(NonnullRefPtr<Value>)> callback);
  350. virtual RefPtr<Value> run(RefPtr<Shell>) = 0;
  351. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) = 0;
  352. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&);
  353. Vector<Line::CompletionSuggestion> complete_for_editor(Shell& shell, size_t offset);
  354. virtual HitTestResult hit_test_position(size_t offset) const
  355. {
  356. if (m_position.contains(offset))
  357. return { this, nullptr, nullptr };
  358. return { nullptr, nullptr, nullptr };
  359. }
  360. virtual String class_name() const { return "Node"; }
  361. Node(Position);
  362. virtual ~Node();
  363. virtual bool is_bareword() const { return false; }
  364. virtual bool is_command() const { return false; }
  365. virtual bool is_execute() const { return false; }
  366. virtual bool is_glob() const { return false; }
  367. virtual bool is_tilde() const { return false; }
  368. virtual bool is_variable_decls() const { return false; }
  369. virtual bool is_simple_variable() const { return false; }
  370. virtual bool is_syntax_error() const;
  371. virtual bool is_list() const { return false; }
  372. virtual bool would_execute() const { return false; }
  373. virtual bool should_override_execution_in_current_process() const { return false; }
  374. const Position& position() const { return m_position; }
  375. virtual void clear_syntax_error();
  376. virtual void set_is_syntax_error(const SyntaxError& error_node);
  377. virtual const SyntaxError& syntax_error_node() const
  378. {
  379. VERIFY(is_syntax_error());
  380. return *m_syntax_error_node;
  381. }
  382. virtual RefPtr<Node> leftmost_trivial_literal() const { return nullptr; }
  383. Vector<Command> to_lazy_evaluated_commands(RefPtr<Shell> shell);
  384. virtual void visit(NodeVisitor&) { VERIFY_NOT_REACHED(); }
  385. virtual void visit(NodeVisitor& visitor) const { const_cast<Node*>(this)->visit(visitor); }
  386. enum class Kind : u32 {
  387. And,
  388. Background,
  389. BarewordLiteral,
  390. BraceExpansion,
  391. CastToCommand,
  392. CastToList,
  393. CloseFdRedirection,
  394. CommandLiteral,
  395. Comment,
  396. ContinuationControl,
  397. DoubleQuotedString,
  398. DynamicEvaluate,
  399. Execute,
  400. Fd2FdRedirection,
  401. ForLoop,
  402. FunctionDeclaration,
  403. Glob,
  404. Heredoc,
  405. HistoryEvent,
  406. IfCond,
  407. ImmediateExpression,
  408. Join,
  409. Juxtaposition,
  410. ListConcatenate,
  411. MatchExpr,
  412. Or,
  413. Pipe,
  414. Range,
  415. ReadRedirection,
  416. ReadWriteRedirection,
  417. Sequence,
  418. Slice,
  419. SimpleVariable,
  420. SpecialVariable,
  421. StringLiteral,
  422. StringPartCompose,
  423. Subshell,
  424. SyntaxError,
  425. SyntheticValue,
  426. Tilde,
  427. VariableDeclarations,
  428. WriteAppendRedirection,
  429. WriteRedirection,
  430. __Count,
  431. };
  432. virtual Kind kind() const = 0;
  433. protected:
  434. Position m_position;
  435. RefPtr<SyntaxError> m_syntax_error_node;
  436. };
  437. #define NODE(name) \
  438. virtual String class_name() const override { return #name; } \
  439. virtual Kind kind() const override { return Kind::name; }
  440. class PathRedirectionNode : public Node {
  441. public:
  442. PathRedirectionNode(Position, int, NonnullRefPtr<Node>);
  443. virtual ~PathRedirectionNode();
  444. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  445. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  446. virtual HitTestResult hit_test_position(size_t offset) const override;
  447. virtual bool is_command() const override { return true; }
  448. virtual bool is_list() const override { return true; }
  449. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  450. const NonnullRefPtr<Node>& path() const { return m_path; }
  451. int fd() const { return m_fd; }
  452. protected:
  453. int m_fd { -1 };
  454. NonnullRefPtr<Node> m_path;
  455. };
  456. class And final : public Node {
  457. public:
  458. And(Position, NonnullRefPtr<Node>, NonnullRefPtr<Node>, Position and_position);
  459. virtual ~And();
  460. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  461. const NonnullRefPtr<Node>& left() const { return m_left; }
  462. const NonnullRefPtr<Node>& right() const { return m_right; }
  463. const Position& and_position() const { return m_and_position; }
  464. private:
  465. NODE(And);
  466. virtual void dump(int level) const override;
  467. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  468. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  469. virtual HitTestResult hit_test_position(size_t) const override;
  470. NonnullRefPtr<Node> m_left;
  471. NonnullRefPtr<Node> m_right;
  472. Position m_and_position;
  473. };
  474. class ListConcatenate final : public Node {
  475. public:
  476. ListConcatenate(Position, Vector<NonnullRefPtr<Node>>);
  477. virtual ~ListConcatenate();
  478. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  479. const Vector<NonnullRefPtr<Node>> list() const { return m_list; }
  480. private:
  481. NODE(ListConcatenate);
  482. virtual void dump(int level) const override;
  483. virtual void for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(NonnullRefPtr<Value>)> callback) override;
  484. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  485. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  486. virtual HitTestResult hit_test_position(size_t) const override;
  487. virtual bool is_list() const override { return true; }
  488. virtual RefPtr<Node> leftmost_trivial_literal() const override;
  489. Vector<NonnullRefPtr<Node>> m_list;
  490. };
  491. class Background final : public Node {
  492. public:
  493. Background(Position, NonnullRefPtr<Node>);
  494. virtual ~Background();
  495. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  496. const NonnullRefPtr<Node>& command() const { return m_command; }
  497. private:
  498. NODE(Background);
  499. virtual void dump(int level) const override;
  500. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  501. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  502. virtual HitTestResult hit_test_position(size_t) const override;
  503. NonnullRefPtr<Node> m_command;
  504. };
  505. class BarewordLiteral final : public Node {
  506. public:
  507. BarewordLiteral(Position, String);
  508. virtual ~BarewordLiteral();
  509. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  510. const String& text() const { return m_text; }
  511. private:
  512. NODE(BarewordLiteral);
  513. virtual void dump(int level) const override;
  514. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  515. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  516. virtual bool is_bareword() const override { return true; }
  517. virtual RefPtr<Node> leftmost_trivial_literal() const override { return this; }
  518. String m_text;
  519. };
  520. class BraceExpansion final : public Node {
  521. public:
  522. BraceExpansion(Position, NonnullRefPtrVector<Node>);
  523. virtual ~BraceExpansion();
  524. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  525. const NonnullRefPtrVector<Node>& entries() const { return m_entries; }
  526. private:
  527. NODE(BraceExpansion);
  528. virtual void dump(int level) const override;
  529. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  530. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  531. virtual HitTestResult hit_test_position(size_t) const override;
  532. NonnullRefPtrVector<Node> m_entries;
  533. };
  534. class CastToCommand final : public Node {
  535. public:
  536. CastToCommand(Position, NonnullRefPtr<Node>);
  537. virtual ~CastToCommand();
  538. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  539. const NonnullRefPtr<Node>& inner() const { return m_inner; }
  540. private:
  541. NODE(CastToCommand);
  542. virtual void dump(int level) const override;
  543. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  544. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  545. virtual HitTestResult hit_test_position(size_t) const override;
  546. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  547. virtual bool is_command() const override { return true; }
  548. virtual bool is_list() const override { return true; }
  549. virtual RefPtr<Node> leftmost_trivial_literal() const override;
  550. NonnullRefPtr<Node> m_inner;
  551. };
  552. class CastToList final : public Node {
  553. public:
  554. CastToList(Position, RefPtr<Node>);
  555. virtual ~CastToList();
  556. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  557. const RefPtr<Node>& inner() const { return m_inner; }
  558. private:
  559. NODE(CastToList);
  560. virtual void dump(int level) const override;
  561. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  562. virtual void for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(NonnullRefPtr<Value>)> callback) override;
  563. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  564. virtual HitTestResult hit_test_position(size_t) const override;
  565. virtual bool is_list() const override { return true; }
  566. virtual RefPtr<Node> leftmost_trivial_literal() const override;
  567. RefPtr<Node> m_inner;
  568. };
  569. class CloseFdRedirection final : public Node {
  570. public:
  571. CloseFdRedirection(Position, int);
  572. virtual ~CloseFdRedirection();
  573. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  574. int fd() const { return m_fd; }
  575. private:
  576. NODE(CloseFdRedirection);
  577. virtual void dump(int level) const override;
  578. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  579. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  580. virtual bool is_command() const override { return true; }
  581. int m_fd { -1 };
  582. };
  583. class CommandLiteral final : public Node {
  584. public:
  585. CommandLiteral(Position, Command);
  586. virtual ~CommandLiteral();
  587. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  588. const Command& command() const { return m_command; }
  589. private:
  590. NODE(CommandLiteral);
  591. virtual void dump(int level) const override;
  592. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  593. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override { VERIFY_NOT_REACHED(); }
  594. virtual bool is_command() const override { return true; }
  595. virtual bool is_list() const override { return true; }
  596. Command m_command;
  597. };
  598. class Comment : public Node {
  599. public:
  600. Comment(Position, String);
  601. virtual ~Comment();
  602. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  603. const String& text() const { return m_text; }
  604. private:
  605. NODE(Comment);
  606. virtual void dump(int level) const override;
  607. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  608. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  609. String m_text;
  610. };
  611. class ContinuationControl final : public Node {
  612. public:
  613. enum ContinuationKind {
  614. Break,
  615. Continue,
  616. };
  617. ContinuationControl(Position position, ContinuationKind kind)
  618. : Node(move(position))
  619. , m_kind(kind)
  620. {
  621. }
  622. virtual ~ContinuationControl() { }
  623. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  624. ContinuationKind continuation_kind() const { return m_kind; }
  625. private:
  626. NODE(ContinuationControl);
  627. virtual void dump(int level) const override;
  628. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  629. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  630. ContinuationKind m_kind { ContinuationKind::Break };
  631. };
  632. class DynamicEvaluate final : public Node {
  633. public:
  634. DynamicEvaluate(Position, NonnullRefPtr<Node>);
  635. virtual ~DynamicEvaluate();
  636. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  637. const NonnullRefPtr<Node>& inner() const { return m_inner; }
  638. private:
  639. NODE(DynamicEvaluate);
  640. virtual void dump(int level) const override;
  641. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  642. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  643. virtual HitTestResult hit_test_position(size_t) const override;
  644. virtual bool is_bareword() const override { return m_inner->is_bareword(); }
  645. virtual bool is_command() const override { return is_list(); }
  646. virtual bool is_execute() const override { return true; }
  647. virtual bool is_glob() const override { return m_inner->is_glob(); }
  648. virtual bool is_list() const override
  649. {
  650. return m_inner->is_list() || m_inner->is_command() || m_inner->is_glob(); // Anything that generates a list.
  651. }
  652. NonnullRefPtr<Node> m_inner;
  653. };
  654. class DoubleQuotedString final : public Node {
  655. public:
  656. DoubleQuotedString(Position, RefPtr<Node>);
  657. virtual ~DoubleQuotedString();
  658. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  659. const RefPtr<Node>& inner() const { return m_inner; }
  660. private:
  661. NODE(DoubleQuotedString);
  662. virtual void dump(int level) const override;
  663. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  664. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  665. virtual HitTestResult hit_test_position(size_t) const override;
  666. RefPtr<Node> m_inner;
  667. };
  668. class Fd2FdRedirection final : public Node {
  669. public:
  670. Fd2FdRedirection(Position, int, int);
  671. virtual ~Fd2FdRedirection();
  672. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  673. int source_fd() const { return m_old_fd; }
  674. int dest_fd() const { return m_new_fd; }
  675. private:
  676. NODE(Fd2FdRedirection);
  677. virtual void dump(int level) const override;
  678. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  679. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  680. virtual bool is_command() const override { return true; }
  681. int m_old_fd { -1 };
  682. int m_new_fd { -1 };
  683. };
  684. class FunctionDeclaration final : public Node {
  685. public:
  686. FunctionDeclaration(Position, NameWithPosition name, Vector<NameWithPosition> argument_names, RefPtr<AST::Node> body);
  687. virtual ~FunctionDeclaration();
  688. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  689. const NameWithPosition& name() const { return m_name; }
  690. const Vector<NameWithPosition> arguments() const { return m_arguments; }
  691. const RefPtr<Node>& block() const { return m_block; }
  692. private:
  693. NODE(FunctionDeclaration);
  694. virtual void dump(int level) const override;
  695. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  696. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  697. virtual HitTestResult hit_test_position(size_t) const override;
  698. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  699. virtual bool would_execute() const override { return true; }
  700. virtual bool should_override_execution_in_current_process() const override { return true; }
  701. NameWithPosition m_name;
  702. Vector<NameWithPosition> m_arguments;
  703. RefPtr<AST::Node> m_block;
  704. };
  705. class ForLoop final : public Node {
  706. public:
  707. ForLoop(Position, Optional<NameWithPosition> variable, Optional<NameWithPosition> index_variable, RefPtr<AST::Node> iterated_expr, RefPtr<AST::Node> block, Optional<Position> in_kw_position = {}, Optional<Position> index_kw_position = {});
  708. virtual ~ForLoop();
  709. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  710. const Optional<NameWithPosition>& variable() const { return m_variable; }
  711. const Optional<NameWithPosition>& index_variable() const { return m_index_variable; }
  712. const RefPtr<Node>& iterated_expression() const { return m_iterated_expression; }
  713. const RefPtr<Node>& block() const { return m_block; }
  714. const Optional<Position> index_keyword_position() const { return m_index_kw_position; }
  715. const Optional<Position> in_keyword_position() const { return m_in_kw_position; }
  716. private:
  717. NODE(ForLoop);
  718. virtual void dump(int level) const override;
  719. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  720. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  721. virtual HitTestResult hit_test_position(size_t) const override;
  722. virtual bool would_execute() const override { return true; }
  723. virtual bool should_override_execution_in_current_process() const override { return true; }
  724. Optional<NameWithPosition> m_variable;
  725. Optional<NameWithPosition> m_index_variable;
  726. RefPtr<AST::Node> m_iterated_expression;
  727. RefPtr<AST::Node> m_block;
  728. Optional<Position> m_in_kw_position;
  729. Optional<Position> m_index_kw_position;
  730. };
  731. class Glob final : public Node {
  732. public:
  733. Glob(Position, String);
  734. virtual ~Glob();
  735. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  736. const String& text() const { return m_text; }
  737. private:
  738. NODE(Glob);
  739. virtual void dump(int level) const override;
  740. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  741. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  742. virtual bool is_glob() const override { return true; }
  743. virtual bool is_list() const override { return true; }
  744. String m_text;
  745. };
  746. struct HistorySelector {
  747. enum EventKind {
  748. IndexFromStart,
  749. IndexFromEnd,
  750. StartingStringLookup,
  751. ContainingStringLookup,
  752. };
  753. enum WordSelectorKind {
  754. Index,
  755. Last,
  756. };
  757. struct {
  758. EventKind kind { IndexFromStart };
  759. size_t index { 0 };
  760. Position text_position;
  761. String text;
  762. } event;
  763. struct WordSelector {
  764. WordSelectorKind kind { Index };
  765. size_t selector { 0 };
  766. Position position;
  767. RefPtr<AST::SyntaxError> syntax_error_node;
  768. size_t resolve(size_t size) const
  769. {
  770. if (kind == Index)
  771. return selector;
  772. if (kind == Last)
  773. return size - selector - 1;
  774. VERIFY_NOT_REACHED();
  775. }
  776. };
  777. struct {
  778. WordSelector start;
  779. Optional<WordSelector> end;
  780. } word_selector_range;
  781. };
  782. class HistoryEvent final : public Node {
  783. public:
  784. HistoryEvent(Position, HistorySelector);
  785. virtual ~HistoryEvent();
  786. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  787. const HistorySelector& selector() const { return m_selector; }
  788. private:
  789. NODE(HistoryEvent);
  790. virtual void dump(int level) const override;
  791. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  792. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  793. HistorySelector m_selector;
  794. };
  795. class Execute final : public Node {
  796. public:
  797. Execute(Position, NonnullRefPtr<Node>, bool capture_stdout = false);
  798. virtual ~Execute();
  799. void capture_stdout() { m_capture_stdout = true; }
  800. NonnullRefPtr<Node>& command() { return m_command; }
  801. virtual void for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(NonnullRefPtr<Value>)> callback) override;
  802. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  803. const NonnullRefPtr<Node>& command() const { return m_command; }
  804. bool does_capture_stdout() const { return m_capture_stdout; }
  805. private:
  806. NODE(Execute);
  807. virtual void dump(int level) const override;
  808. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  809. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  810. virtual HitTestResult hit_test_position(size_t) const override;
  811. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  812. virtual bool is_execute() const override { return true; }
  813. virtual bool would_execute() const override { return true; }
  814. NonnullRefPtr<Node> m_command;
  815. bool m_capture_stdout { false };
  816. };
  817. class IfCond final : public Node {
  818. public:
  819. IfCond(Position, Optional<Position> else_position, NonnullRefPtr<AST::Node> cond_expr, RefPtr<AST::Node> true_branch, RefPtr<AST::Node> false_branch);
  820. virtual ~IfCond();
  821. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  822. const NonnullRefPtr<Node>& condition() const { return m_condition; }
  823. const RefPtr<Node>& true_branch() const { return m_true_branch; }
  824. const RefPtr<Node>& false_branch() const { return m_false_branch; }
  825. const Optional<Position> else_position() const { return m_else_position; }
  826. private:
  827. NODE(IfCond);
  828. virtual void dump(int level) const override;
  829. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  830. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  831. virtual HitTestResult hit_test_position(size_t) const override;
  832. virtual bool should_override_execution_in_current_process() const override { return true; }
  833. NonnullRefPtr<AST::Node> m_condition;
  834. RefPtr<AST::Node> m_true_branch;
  835. RefPtr<AST::Node> m_false_branch;
  836. Optional<Position> m_else_position;
  837. };
  838. class ImmediateExpression final : public Node {
  839. public:
  840. ImmediateExpression(Position, NameWithPosition function, NonnullRefPtrVector<AST::Node> arguments, Optional<Position> closing_brace_position);
  841. virtual ~ImmediateExpression();
  842. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  843. const NonnullRefPtrVector<Node>& arguments() const { return m_arguments; }
  844. const auto& function() const { return m_function; }
  845. const String& function_name() const { return m_function.name; }
  846. const Position& function_position() const { return m_function.position; }
  847. bool has_closing_brace() const { return m_closing_brace_position.has_value(); }
  848. private:
  849. NODE(ImmediateExpression);
  850. virtual void dump(int level) const override;
  851. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  852. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  853. Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  854. virtual HitTestResult hit_test_position(size_t) const override;
  855. NonnullRefPtrVector<AST::Node> m_arguments;
  856. NameWithPosition m_function;
  857. Optional<Position> m_closing_brace_position;
  858. };
  859. class Join final : public Node {
  860. public:
  861. Join(Position, NonnullRefPtr<Node>, NonnullRefPtr<Node>);
  862. virtual ~Join();
  863. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  864. const NonnullRefPtr<Node>& left() const { return m_left; }
  865. const NonnullRefPtr<Node>& right() const { return m_right; }
  866. private:
  867. NODE(Join);
  868. virtual void dump(int level) const override;
  869. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  870. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  871. virtual HitTestResult hit_test_position(size_t) const override;
  872. virtual bool is_command() const override { return true; }
  873. virtual bool is_list() const override { return true; }
  874. virtual RefPtr<Node> leftmost_trivial_literal() const override;
  875. NonnullRefPtr<Node> m_left;
  876. NonnullRefPtr<Node> m_right;
  877. };
  878. struct MatchEntry {
  879. NonnullRefPtrVector<Node> options;
  880. Optional<Vector<String>> match_names;
  881. Optional<Position> match_as_position;
  882. Vector<Position> pipe_positions;
  883. RefPtr<Node> body;
  884. };
  885. class MatchExpr final : public Node {
  886. public:
  887. MatchExpr(Position, NonnullRefPtr<Node> expr, String name, Optional<Position> as_position, Vector<MatchEntry> entries);
  888. virtual ~MatchExpr();
  889. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  890. const NonnullRefPtr<Node>& matched_expr() const { return m_matched_expr; }
  891. const String& expr_name() const { return m_expr_name; }
  892. const Vector<MatchEntry>& entries() const { return m_entries; }
  893. const Optional<Position>& as_position() const { return m_as_position; }
  894. private:
  895. NODE(MatchExpr);
  896. virtual void dump(int level) const override;
  897. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  898. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  899. virtual HitTestResult hit_test_position(size_t) const override;
  900. virtual bool would_execute() const override { return true; }
  901. virtual bool should_override_execution_in_current_process() const override { return true; }
  902. NonnullRefPtr<Node> m_matched_expr;
  903. String m_expr_name;
  904. Optional<Position> m_as_position;
  905. Vector<MatchEntry> m_entries;
  906. };
  907. class Or final : public Node {
  908. public:
  909. Or(Position, NonnullRefPtr<Node>, NonnullRefPtr<Node>, Position or_position);
  910. virtual ~Or();
  911. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  912. const NonnullRefPtr<Node>& left() const { return m_left; }
  913. const NonnullRefPtr<Node>& right() const { return m_right; }
  914. const Position& or_position() const { return m_or_position; }
  915. private:
  916. NODE(Or);
  917. virtual void dump(int level) const override;
  918. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  919. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  920. virtual HitTestResult hit_test_position(size_t) const override;
  921. NonnullRefPtr<Node> m_left;
  922. NonnullRefPtr<Node> m_right;
  923. Position m_or_position;
  924. };
  925. class Pipe final : public Node {
  926. public:
  927. Pipe(Position, NonnullRefPtr<Node>, NonnullRefPtr<Node>);
  928. virtual ~Pipe();
  929. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  930. const NonnullRefPtr<Node>& left() const { return m_left; }
  931. const NonnullRefPtr<Node>& right() const { return m_right; }
  932. private:
  933. NODE(Pipe);
  934. virtual void dump(int level) const override;
  935. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  936. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  937. virtual HitTestResult hit_test_position(size_t) const override;
  938. virtual bool is_command() const override { return true; }
  939. NonnullRefPtr<Node> m_left;
  940. NonnullRefPtr<Node> m_right;
  941. };
  942. class Range final : public Node {
  943. public:
  944. Range(Position, NonnullRefPtr<Node>, NonnullRefPtr<Node>);
  945. virtual ~Range();
  946. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  947. const NonnullRefPtr<Node>& start() const { return m_start; }
  948. const NonnullRefPtr<Node>& end() const { return m_end; }
  949. private:
  950. NODE(Range);
  951. virtual void dump(int level) const override;
  952. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  953. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  954. virtual HitTestResult hit_test_position(size_t) const override;
  955. NonnullRefPtr<Node> m_start;
  956. NonnullRefPtr<Node> m_end;
  957. };
  958. class ReadRedirection final : public PathRedirectionNode {
  959. public:
  960. ReadRedirection(Position, int, NonnullRefPtr<Node>);
  961. virtual ~ReadRedirection();
  962. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  963. private:
  964. NODE(ReadRedirection);
  965. virtual void dump(int level) const override;
  966. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  967. };
  968. class ReadWriteRedirection final : public PathRedirectionNode {
  969. public:
  970. ReadWriteRedirection(Position, int, NonnullRefPtr<Node>);
  971. virtual ~ReadWriteRedirection();
  972. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  973. private:
  974. NODE(ReadWriteRedirection);
  975. virtual void dump(int level) const override;
  976. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  977. };
  978. class Sequence final : public Node {
  979. public:
  980. Sequence(Position, NonnullRefPtrVector<Node>, Vector<Position> separator_positions);
  981. virtual ~Sequence();
  982. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  983. const NonnullRefPtrVector<Node>& entries() const { return m_entries; }
  984. const Vector<Position>& separator_positions() const { return m_separator_positions; }
  985. private:
  986. NODE(Sequence);
  987. virtual void dump(int level) const override;
  988. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  989. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  990. virtual HitTestResult hit_test_position(size_t) const override;
  991. virtual bool is_list() const override { return true; }
  992. virtual bool should_override_execution_in_current_process() const override { return true; }
  993. NonnullRefPtrVector<Node> m_entries;
  994. Vector<Position> m_separator_positions;
  995. };
  996. class Subshell final : public Node {
  997. public:
  998. Subshell(Position, RefPtr<Node> block);
  999. virtual ~Subshell();
  1000. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1001. const RefPtr<Node>& block() const { return m_block; }
  1002. private:
  1003. NODE(Subshell);
  1004. virtual void dump(int level) const override;
  1005. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1006. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1007. virtual HitTestResult hit_test_position(size_t) const override;
  1008. virtual bool would_execute() const override { return false; }
  1009. virtual bool should_override_execution_in_current_process() const override { return true; }
  1010. RefPtr<AST::Node> m_block;
  1011. };
  1012. class Slice final : public Node {
  1013. public:
  1014. Slice(Position, NonnullRefPtr<AST::Node>);
  1015. virtual ~Slice() override;
  1016. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1017. NonnullRefPtr<AST::Node> selector() const { return m_selector; }
  1018. virtual void dump(int level) const override;
  1019. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1020. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1021. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  1022. virtual HitTestResult hit_test_position(size_t) const override;
  1023. protected:
  1024. NODE(Slice);
  1025. NonnullRefPtr<AST::Node> m_selector;
  1026. };
  1027. class VariableNode : public Node {
  1028. public:
  1029. VariableNode(Position position)
  1030. : Node(move(position))
  1031. {
  1032. }
  1033. void set_slice(NonnullRefPtr<Slice>&& slice)
  1034. {
  1035. VERIFY(!m_slice);
  1036. m_slice = move(slice);
  1037. if (m_slice->is_syntax_error())
  1038. set_is_syntax_error(m_slice->syntax_error_node());
  1039. }
  1040. const Slice* slice() const { return m_slice.ptr(); }
  1041. protected:
  1042. RefPtr<Slice> m_slice;
  1043. };
  1044. class SimpleVariable final : public VariableNode {
  1045. public:
  1046. SimpleVariable(Position, String);
  1047. virtual ~SimpleVariable();
  1048. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1049. const String& name() const { return m_name; }
  1050. private:
  1051. NODE(SimpleVariable);
  1052. virtual void dump(int level) const override;
  1053. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1054. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1055. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  1056. virtual HitTestResult hit_test_position(size_t) const override;
  1057. virtual bool is_simple_variable() const override { return true; }
  1058. String m_name;
  1059. };
  1060. class SpecialVariable final : public VariableNode {
  1061. public:
  1062. SpecialVariable(Position, char);
  1063. virtual ~SpecialVariable();
  1064. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1065. char name() const { return m_name; }
  1066. private:
  1067. NODE(SpecialVariable);
  1068. virtual void dump(int level) const override;
  1069. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1070. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1071. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  1072. virtual HitTestResult hit_test_position(size_t) const override;
  1073. char m_name { 0 };
  1074. };
  1075. class Juxtaposition final : public Node {
  1076. public:
  1077. Juxtaposition(Position, NonnullRefPtr<Node>, NonnullRefPtr<Node>);
  1078. virtual ~Juxtaposition();
  1079. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1080. const NonnullRefPtr<Node>& left() const { return m_left; }
  1081. const NonnullRefPtr<Node>& right() const { return m_right; }
  1082. private:
  1083. NODE(Juxtaposition);
  1084. virtual void dump(int level) const override;
  1085. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1086. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1087. virtual HitTestResult hit_test_position(size_t) const override;
  1088. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  1089. NonnullRefPtr<Node> m_left;
  1090. NonnullRefPtr<Node> m_right;
  1091. };
  1092. class Heredoc final : public Node {
  1093. public:
  1094. Heredoc(Position, String end, bool allow_interpolation, bool deindent);
  1095. virtual ~Heredoc();
  1096. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1097. const String& end() const { return m_end; }
  1098. bool allow_interpolation() const { return m_allows_interpolation; }
  1099. bool deindent() const { return m_deindent; }
  1100. const RefPtr<AST::Node>& contents() const { return m_contents; }
  1101. void set_contents(RefPtr<AST::Node> contents)
  1102. {
  1103. m_contents = move(contents);
  1104. if (m_contents->is_syntax_error())
  1105. set_is_syntax_error(m_contents->syntax_error_node());
  1106. else
  1107. clear_syntax_error();
  1108. }
  1109. private:
  1110. NODE(Heredoc);
  1111. virtual void dump(int level) const override;
  1112. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1113. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1114. virtual HitTestResult hit_test_position(size_t) const override;
  1115. virtual RefPtr<Node> leftmost_trivial_literal() const override { return this; };
  1116. String m_end;
  1117. bool m_allows_interpolation { false };
  1118. bool m_deindent { false };
  1119. RefPtr<AST::Node> m_contents;
  1120. };
  1121. class StringLiteral final : public Node {
  1122. public:
  1123. StringLiteral(Position, String);
  1124. virtual ~StringLiteral();
  1125. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1126. const String& text() const { return m_text; }
  1127. private:
  1128. NODE(StringLiteral);
  1129. virtual void dump(int level) const override;
  1130. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1131. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1132. virtual RefPtr<Node> leftmost_trivial_literal() const override { return this; };
  1133. String m_text;
  1134. };
  1135. class StringPartCompose final : public Node {
  1136. public:
  1137. StringPartCompose(Position, NonnullRefPtr<Node>, NonnullRefPtr<Node>);
  1138. virtual ~StringPartCompose();
  1139. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1140. const NonnullRefPtr<Node>& left() const { return m_left; }
  1141. const NonnullRefPtr<Node>& right() const { return m_right; }
  1142. private:
  1143. NODE(StringPartCompose);
  1144. virtual void dump(int level) const override;
  1145. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1146. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1147. virtual HitTestResult hit_test_position(size_t) const override;
  1148. NonnullRefPtr<Node> m_left;
  1149. NonnullRefPtr<Node> m_right;
  1150. };
  1151. class SyntaxError final : public Node {
  1152. public:
  1153. SyntaxError(Position, String, bool is_continuable = false);
  1154. virtual ~SyntaxError();
  1155. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1156. const String& error_text() const { return m_syntax_error_text; }
  1157. bool is_continuable() const { return m_is_continuable; }
  1158. virtual void clear_syntax_error() override
  1159. {
  1160. m_is_cleared = true;
  1161. }
  1162. virtual void set_is_syntax_error(const SyntaxError& error) override
  1163. {
  1164. m_position = error.position();
  1165. m_is_cleared = error.m_is_cleared;
  1166. m_is_continuable = error.m_is_continuable;
  1167. m_syntax_error_text = error.error_text();
  1168. }
  1169. virtual bool is_syntax_error() const override { return !m_is_cleared; }
  1170. private:
  1171. NODE(SyntaxError);
  1172. virtual void dump(int level) const override;
  1173. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1174. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1175. virtual HitTestResult hit_test_position(size_t) const override { return { nullptr, nullptr, nullptr }; }
  1176. virtual const SyntaxError& syntax_error_node() const override;
  1177. String m_syntax_error_text;
  1178. bool m_is_continuable { false };
  1179. bool m_is_cleared { false };
  1180. };
  1181. class SyntheticNode final : public Node {
  1182. public:
  1183. SyntheticNode(Position, NonnullRefPtr<Value>);
  1184. virtual ~SyntheticNode() = default;
  1185. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1186. const Value& value() const { return m_value; }
  1187. private:
  1188. NODE(SyntheticValue);
  1189. virtual void dump(int level) const override;
  1190. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1191. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1192. NonnullRefPtr<Value> m_value;
  1193. };
  1194. class Tilde final : public Node {
  1195. public:
  1196. Tilde(Position, String);
  1197. virtual ~Tilde();
  1198. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1199. String text() const;
  1200. private:
  1201. NODE(Tilde);
  1202. virtual void dump(int level) const override;
  1203. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1204. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1205. virtual Vector<Line::CompletionSuggestion> complete_for_editor(Shell&, size_t, const HitTestResult&) override;
  1206. virtual HitTestResult hit_test_position(size_t) const override;
  1207. virtual bool is_tilde() const override { return true; }
  1208. String m_username;
  1209. };
  1210. class VariableDeclarations final : public Node {
  1211. public:
  1212. struct Variable {
  1213. NonnullRefPtr<Node> name;
  1214. NonnullRefPtr<Node> value;
  1215. };
  1216. VariableDeclarations(Position, Vector<Variable> variables);
  1217. virtual ~VariableDeclarations();
  1218. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1219. const Vector<Variable>& variables() const { return m_variables; }
  1220. private:
  1221. NODE(VariableDeclarations);
  1222. virtual void dump(int level) const override;
  1223. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1224. virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
  1225. virtual HitTestResult hit_test_position(size_t) const override;
  1226. virtual bool is_variable_decls() const override { return true; }
  1227. Vector<Variable> m_variables;
  1228. };
  1229. class WriteAppendRedirection final : public PathRedirectionNode {
  1230. public:
  1231. WriteAppendRedirection(Position, int, NonnullRefPtr<Node>);
  1232. virtual ~WriteAppendRedirection();
  1233. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1234. private:
  1235. NODE(WriteAppendRedirection);
  1236. virtual void dump(int level) const override;
  1237. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1238. };
  1239. class WriteRedirection final : public PathRedirectionNode {
  1240. public:
  1241. WriteRedirection(Position, int, NonnullRefPtr<Node>);
  1242. virtual ~WriteRedirection();
  1243. virtual void visit(NodeVisitor& visitor) override { visitor.visit(this); }
  1244. private:
  1245. NODE(WriteRedirection);
  1246. virtual void dump(int level) const override;
  1247. virtual RefPtr<Value> run(RefPtr<Shell>) override;
  1248. };
  1249. }
  1250. namespace AK {
  1251. template<>
  1252. struct Formatter<Shell::AST::Command> : StandardFormatter {
  1253. Formatter() = default;
  1254. explicit Formatter(StandardFormatter formatter)
  1255. : StandardFormatter(formatter)
  1256. {
  1257. }
  1258. ErrorOr<void> format(FormatBuilder&, Shell::AST::Command const& value);
  1259. };
  1260. }