AST.h 54 KB

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