AST.h 51 KB

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