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