mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:22:43 +00:00 
			
		
		
		
	AK: Rename create<T> => make_ref_counted<T>
And also try_create<T> => try_make_ref_counted<T>. A global "create" was a bit much. The new name matches make<T> better, which we've used for making single-owner objects since forever.
This commit is contained in:
		
							parent
							
								
									43a800a838
								
							
						
					
					
						commit
						eaf88cc78a
					
				
					 17 changed files with 137 additions and 137 deletions
				
			
		|  | @ -333,14 +333,14 @@ inline void swap(NonnullRefPtr<T>& a, NonnullRefPtr<U>& b) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template<typename T, class... Args> | template<typename T, class... Args> | ||||||
| requires(IsConstructible<T, Args...>) inline NonnullRefPtr<T> create(Args&&... args) | requires(IsConstructible<T, Args...>) inline NonnullRefPtr<T> make_ref_counted(Args&&... args) | ||||||
| { | { | ||||||
|     return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, *new T(forward<Args>(args)...)); |     return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, *new T(forward<Args>(args)...)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // FIXME: Remove once P0960R3 is available in Clang.
 | // FIXME: Remove once P0960R3 is available in Clang.
 | ||||||
| template<typename T, class... Args> | template<typename T, class... Args> | ||||||
| inline NonnullRefPtr<T> create(Args&&... args) | inline NonnullRefPtr<T> make_ref_counted(Args&&... args) | ||||||
| { | { | ||||||
|     return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, *new T { forward<Args>(args)... }); |     return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, *new T { forward<Args>(args)... }); | ||||||
| } | } | ||||||
|  | @ -355,5 +355,5 @@ struct Traits<NonnullRefPtr<T>> : public GenericTraits<NonnullRefPtr<T>> { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| using AK::adopt_ref; | using AK::adopt_ref; | ||||||
| using AK::create; | using AK::make_ref_counted; | ||||||
| using AK::NonnullRefPtr; | using AK::NonnullRefPtr; | ||||||
|  |  | ||||||
|  | @ -484,14 +484,14 @@ inline RefPtr<T> adopt_ref_if_nonnull(T* object) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template<typename T, class... Args> | template<typename T, class... Args> | ||||||
| requires(IsConstructible<T, Args...>) inline RefPtr<T> try_create(Args&&... args) | requires(IsConstructible<T, Args...>) inline RefPtr<T> try_make_ref_counted(Args&&... args) | ||||||
| { | { | ||||||
|     return adopt_ref_if_nonnull(new (nothrow) T(forward<Args>(args)...)); |     return adopt_ref_if_nonnull(new (nothrow) T(forward<Args>(args)...)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // FIXME: Remove once P0960R3 is available in Clang.
 | // FIXME: Remove once P0960R3 is available in Clang.
 | ||||||
| template<typename T, class... Args> | template<typename T, class... Args> | ||||||
| inline RefPtr<T> try_create(Args&&... args) | inline RefPtr<T> try_make_ref_counted(Args&&... args) | ||||||
| { | { | ||||||
|     return adopt_ref_if_nonnull(new (nothrow) T { forward<Args>(args)... }); |     return adopt_ref_if_nonnull(new (nothrow) T { forward<Args>(args)... }); | ||||||
| } | } | ||||||
|  | @ -512,7 +512,7 @@ inline Kernel::KResultOr<NonnullRefPtr<T>> adopt_nonnull_ref_or_enomem(T* object | ||||||
| using AK::adopt_ref_if_nonnull; | using AK::adopt_ref_if_nonnull; | ||||||
| using AK::RefPtr; | using AK::RefPtr; | ||||||
| using AK::static_ptr_cast; | using AK::static_ptr_cast; | ||||||
| using AK::try_create; | using AK::try_make_ref_counted; | ||||||
| 
 | 
 | ||||||
| #ifdef KERNEL | #ifdef KERNEL | ||||||
| using AK::adopt_nonnull_ref_or_enomem; | using AK::adopt_nonnull_ref_or_enomem; | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ KResultOr<NonnullRefPtr<Device>> Device::try_create(USBController const& control | ||||||
|     if (pipe_or_error.is_error()) |     if (pipe_or_error.is_error()) | ||||||
|         return pipe_or_error.error(); |         return pipe_or_error.error(); | ||||||
| 
 | 
 | ||||||
|     auto device = AK::try_create<Device>(controller, port, speed, pipe_or_error.release_value()); |     auto device = try_make_ref_counted<Device>(controller, port, speed, pipe_or_error.release_value()); | ||||||
|     if (!device) |     if (!device) | ||||||
|         return ENOMEM; |         return ENOMEM; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ KResultOr<NonnullRefPtr<Hub>> Hub::try_create_root_hub(NonnullRefPtr<USBControll | ||||||
|     if (pipe_or_error.is_error()) |     if (pipe_or_error.is_error()) | ||||||
|         return pipe_or_error.error(); |         return pipe_or_error.error(); | ||||||
| 
 | 
 | ||||||
|     auto hub = AK::try_create<Hub>(controller, device_speed, pipe_or_error.release_value()); |     auto hub = try_make_ref_counted<Hub>(controller, device_speed, pipe_or_error.release_value()); | ||||||
|     if (!hub) |     if (!hub) | ||||||
|         return ENOMEM; |         return ENOMEM; | ||||||
| 
 | 
 | ||||||
|  | @ -34,7 +34,7 @@ KResultOr<NonnullRefPtr<Hub>> Hub::try_create_from_device(Device const& device) | ||||||
|     if (pipe_or_error.is_error()) |     if (pipe_or_error.is_error()) | ||||||
|         return pipe_or_error.error(); |         return pipe_or_error.error(); | ||||||
| 
 | 
 | ||||||
|     auto hub = AK::try_create<Hub>(device, pipe_or_error.release_value()); |     auto hub = try_make_ref_counted<Hub>(device, pipe_or_error.release_value()); | ||||||
|     if (!hub) |     if (!hub) | ||||||
|         return ENOMEM; |         return ENOMEM; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ RefPtr<Transfer> Transfer::try_create(Pipe& pipe, u16 len) | ||||||
|     if (!data_buffer) |     if (!data_buffer) | ||||||
|         return {}; |         return {}; | ||||||
| 
 | 
 | ||||||
|     return AK::try_create<Transfer>(pipe, len, data_buffer.release_nonnull()); |     return try_make_ref_counted<Transfer>(pipe, len, data_buffer.release_nonnull()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Transfer::Transfer(Pipe& pipe, u16 len, NonnullOwnPtr<Memory::Region> data_buffer) | Transfer::Transfer(Pipe& pipe, u16 len, NonnullOwnPtr<Memory::Region> data_buffer) | ||||||
|  |  | ||||||
|  | @ -48,7 +48,7 @@ KResultOr<NonnullRefPtr<VMObject>> AnonymousVMObject::try_clone() | ||||||
|     // one would keep the one it still has. This ensures that the original
 |     // one would keep the one it still has. This ensures that the original
 | ||||||
|     // one and this one, as well as the clone have sufficient resources
 |     // one and this one, as well as the clone have sufficient resources
 | ||||||
|     // to cow all pages as needed
 |     // to cow all pages as needed
 | ||||||
|     auto new_shared_committed_cow_pages = try_create<SharedCommittedCowPages>(committed_pages.release_value()); |     auto new_shared_committed_cow_pages = try_make_ref_counted<SharedCommittedCowPages>(committed_pages.release_value()); | ||||||
| 
 | 
 | ||||||
|     if (!new_shared_committed_cow_pages) |     if (!new_shared_committed_cow_pages) | ||||||
|         return ENOMEM; |         return ENOMEM; | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ KResultOr<NonnullRefPtr<Thread>> Thread::try_create(NonnullRefPtr<Process> proce | ||||||
|         return ENOMEM; |         return ENOMEM; | ||||||
|     kernel_stack_region->set_stack(true); |     kernel_stack_region->set_stack(true); | ||||||
| 
 | 
 | ||||||
|     auto block_timer = AK::try_create<Timer>(); |     auto block_timer = try_make_ref_counted<Timer>(); | ||||||
|     if (!block_timer) |     if (!block_timer) | ||||||
|         return ENOMEM; |         return ENOMEM; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,8 +15,8 @@ | ||||||
| 
 | 
 | ||||||
| Track::Track(const u32& time) | Track::Track(const u32& time) | ||||||
|     : m_time(time) |     : m_time(time) | ||||||
|     , m_temporary_transport(create<LibDSP::Transport>(120, 4)) |     , m_temporary_transport(make_ref_counted<LibDSP::Transport>(120, 4)) | ||||||
|     , m_delay(create<LibDSP::Effects::Delay>(m_temporary_transport)) |     , m_delay(make_ref_counted<LibDSP::Effects::Delay>(m_temporary_transport)) | ||||||
| { | { | ||||||
|     set_volume(volume_max); |     set_volume(volume_max); | ||||||
|     set_sustain_impl(1000); |     set_sustain_impl(1000); | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     static NonnullRefPtr<Guide> construct(Orientation orientation, float offset) |     static NonnullRefPtr<Guide> construct(Orientation orientation, float offset) | ||||||
|     { |     { | ||||||
|         return create<Guide>(orientation, offset); |         return make_ref_counted<Guide>(orientation, offset); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     Orientation orientation() const { return m_orientation; } |     Orientation orientation() const { return m_orientation; } | ||||||
|  |  | ||||||
|  | @ -64,9 +64,9 @@ void GuideTool::on_mousedown(Layer*, MouseEvent& event) | ||||||
| 
 | 
 | ||||||
|     RefPtr<Guide> new_guide; |     RefPtr<Guide> new_guide; | ||||||
|     if (image_event.position().x() < 0 || image_event.position().x() > editor()->image().size().width()) { |     if (image_event.position().x() < 0 || image_event.position().x() > editor()->image().size().width()) { | ||||||
|         new_guide = Guide::construct(Guide::Orientation::Vertical, image_event.position().x()); |         new_guide = make_ref_counted<Guide>(Guide::Orientation::Vertical, image_event.position().x()); | ||||||
|     } else if (image_event.position().y() < 0 || image_event.position().y() > editor()->image().size().height()) { |     } else if (image_event.position().y() < 0 || image_event.position().y() > editor()->image().size().height()) { | ||||||
|         new_guide = Guide::construct(Guide::Orientation::Horizontal, image_event.position().y()); |         new_guide = make_ref_counted<Guide>(Guide::Orientation::Horizontal, image_event.position().y()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (new_guide) { |     if (new_guide) { | ||||||
|  |  | ||||||
|  | @ -107,7 +107,7 @@ NonnullRefPtr<::Shell::AST::Node> ShellComprehensionEngine::DocumentData::parse( | ||||||
|     if (auto node = parser.parse()) |     if (auto node = parser.parse()) | ||||||
|         return node.release_nonnull(); |         return node.release_nonnull(); | ||||||
| 
 | 
 | ||||||
|     return ::Shell::AST::create<::Shell::AST::SyntaxError>(::Shell::AST::Position {}, "Unable to parse file"); |     return ::Shell::AST::make_ref_counted<::Shell::AST::SyntaxError>(::Shell::AST::Position {}, "Unable to parse file"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| size_t ShellComprehensionEngine::resolve(const ShellComprehensionEngine::DocumentData& document, const GUI::TextPosition& position) | size_t ShellComprehensionEngine::resolve(const ShellComprehensionEngine::DocumentData& document, const GUI::TextPosition& position) | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ public: | ||||||
|         if (m_mask & Let) |         if (m_mask & Let) | ||||||
|             m_parser.m_state.let_scopes.append(NonnullRefPtrVector<VariableDeclaration>()); |             m_parser.m_state.let_scopes.append(NonnullRefPtrVector<VariableDeclaration>()); | ||||||
| 
 | 
 | ||||||
|         m_parser.m_state.current_scope = create<Parser::Scope>(scope_type, m_parser.m_state.current_scope); |         m_parser.m_state.current_scope = make_ref_counted<Parser::Scope>(scope_type, m_parser.m_state.current_scope); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     ~ScopePusher() |     ~ScopePusher() | ||||||
|  |  | ||||||
|  | @ -707,7 +707,7 @@ NonnullRefPtr<StyleRule> Parser::consume_an_at_rule(TokenStream<T>& tokens) | ||||||
|     auto& name_ident = tokens.next_token(); |     auto& name_ident = tokens.next_token(); | ||||||
|     VERIFY(name_ident.is(Token::Type::AtKeyword)); |     VERIFY(name_ident.is(Token::Type::AtKeyword)); | ||||||
| 
 | 
 | ||||||
|     NonnullRefPtr<StyleRule> rule = create<StyleRule>(StyleRule::Type::At); |     auto rule = make_ref_counted<StyleRule>(StyleRule::Type::At); | ||||||
|     rule->m_name = ((Token)name_ident).at_keyword(); |     rule->m_name = ((Token)name_ident).at_keyword(); | ||||||
| 
 | 
 | ||||||
|     for (;;) { |     for (;;) { | ||||||
|  | @ -744,7 +744,7 @@ RefPtr<StyleRule> Parser::consume_a_qualified_rule(TokenStream<T>& tokens) | ||||||
| { | { | ||||||
|     dbgln_if(CSS_PARSER_DEBUG, "Parser::consume_a_qualified_rule"); |     dbgln_if(CSS_PARSER_DEBUG, "Parser::consume_a_qualified_rule"); | ||||||
| 
 | 
 | ||||||
|     NonnullRefPtr<StyleRule> rule = create<StyleRule>(StyleRule::Type::Qualified); |     auto rule = make_ref_counted<StyleRule>(StyleRule::Type::Qualified); | ||||||
| 
 | 
 | ||||||
|     for (;;) { |     for (;;) { | ||||||
|         auto& token = tokens.next_token(); |         auto& token = tokens.next_token(); | ||||||
|  | @ -810,7 +810,7 @@ NonnullRefPtr<StyleBlockRule> Parser::consume_a_simple_block(TokenStream<T>& tok | ||||||
| 
 | 
 | ||||||
|     auto ending_token = ((Token)tokens.current_token()).mirror_variant(); |     auto ending_token = ((Token)tokens.current_token()).mirror_variant(); | ||||||
| 
 | 
 | ||||||
|     NonnullRefPtr<StyleBlockRule> block = create<StyleBlockRule>(); |     auto block = make_ref_counted<StyleBlockRule>(); | ||||||
|     block->m_token = tokens.current_token(); |     block->m_token = tokens.current_token(); | ||||||
| 
 | 
 | ||||||
|     for (;;) { |     for (;;) { | ||||||
|  | @ -843,7 +843,7 @@ NonnullRefPtr<StyleFunctionRule> Parser::consume_a_function(TokenStream<T>& toke | ||||||
| 
 | 
 | ||||||
|     auto name_ident = tokens.current_token(); |     auto name_ident = tokens.current_token(); | ||||||
|     VERIFY(name_ident.is(Token::Type::Function)); |     VERIFY(name_ident.is(Token::Type::Function)); | ||||||
|     NonnullRefPtr<StyleFunctionRule> function = create<StyleFunctionRule>(((Token)name_ident).m_value.to_string()); |     auto function = make_ref_counted<StyleFunctionRule>(((Token)name_ident).m_value.to_string()); | ||||||
| 
 | 
 | ||||||
|     for (;;) { |     for (;;) { | ||||||
|         auto& token = tokens.next_token(); |         auto& token = tokens.next_token(); | ||||||
|  |  | ||||||
|  | @ -286,7 +286,7 @@ void Node::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(Nonnul | ||||||
| 
 | 
 | ||||||
|     auto list = value->resolve_as_list(shell); |     auto list = value->resolve_as_list(shell); | ||||||
|     for (auto& element : list) { |     for (auto& element : list) { | ||||||
|         if (callback(create<StringValue>(move(element))) == IterationDecision::Break) |         if (callback(make_ref_counted<StringValue>(move(element))) == IterationDecision::Break) | ||||||
|             break; |             break; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -390,7 +390,7 @@ RefPtr<Value> And::run(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     auto commands = m_left->to_lazy_evaluated_commands(shell); |     auto commands = m_left->to_lazy_evaluated_commands(shell); | ||||||
|     commands.last().next_chain.append(NodeWithAction { *m_right, NodeWithAction::And }); |     commands.last().next_chain.append(NodeWithAction { *m_right, NodeWithAction::And }); | ||||||
|     return create<CommandSequenceValue>(move(commands)); |     return make_ref_counted<CommandSequenceValue>(move(commands)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void And::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void And::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -444,7 +444,7 @@ RefPtr<Value> ListConcatenate::run(RefPtr<Shell> shell) | ||||||
| 
 | 
 | ||||||
|     for (auto& element : m_list) { |     for (auto& element : m_list) { | ||||||
|         if (!result) { |         if (!result) { | ||||||
|             result = create<ListValue>({ element->run(shell)->resolve_without_cast(shell) }); |             result = make_ref_counted<ListValue>({ element->run(shell)->resolve_without_cast(shell) }); | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|         auto element_value = element->run(shell)->resolve_without_cast(shell); |         auto element_value = element->run(shell)->resolve_without_cast(shell); | ||||||
|  | @ -455,9 +455,9 @@ RefPtr<Value> ListConcatenate::run(RefPtr<Shell> shell) | ||||||
|             if (joined_commands.size() == 1) { |             if (joined_commands.size() == 1) { | ||||||
|                 auto& command = joined_commands[0]; |                 auto& command = joined_commands[0]; | ||||||
|                 command.position = position(); |                 command.position = position(); | ||||||
|                 result = create<CommandValue>(command); |                 result = make_ref_counted<CommandValue>(command); | ||||||
|             } else { |             } else { | ||||||
|                 result = create<CommandSequenceValue>(move(joined_commands)); |                 result = make_ref_counted<CommandSequenceValue>(move(joined_commands)); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             NonnullRefPtrVector<Value> values; |             NonnullRefPtrVector<Value> values; | ||||||
|  | @ -466,16 +466,16 @@ RefPtr<Value> ListConcatenate::run(RefPtr<Shell> shell) | ||||||
|                 values.extend(static_cast<ListValue*>(result.ptr())->values()); |                 values.extend(static_cast<ListValue*>(result.ptr())->values()); | ||||||
|             } else { |             } else { | ||||||
|                 for (auto& result : result->resolve_as_list(shell)) |                 for (auto& result : result->resolve_as_list(shell)) | ||||||
|                     values.append(create<StringValue>(result)); |                     values.append(make_ref_counted<StringValue>(result)); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             values.append(element_value); |             values.append(element_value); | ||||||
| 
 | 
 | ||||||
|             result = create<ListValue>(move(values)); |             result = make_ref_counted<ListValue>(move(values)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     if (!result) |     if (!result) | ||||||
|         return create<ListValue>({}); |         return make_ref_counted<ListValue>({}); | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  | @ -554,7 +554,7 @@ RefPtr<Value> Background::run(RefPtr<Shell> shell) | ||||||
|     for (auto& command : commands) |     for (auto& command : commands) | ||||||
|         command.should_wait = false; |         command.should_wait = false; | ||||||
| 
 | 
 | ||||||
|     return create<CommandSequenceValue>(move(commands)); |     return make_ref_counted<CommandSequenceValue>(move(commands)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Background::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Background::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -587,7 +587,7 @@ void BarewordLiteral::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> BarewordLiteral::run(RefPtr<Shell>) | RefPtr<Value> BarewordLiteral::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     return create<StringValue>(m_text); |     return make_ref_counted<StringValue>(m_text); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void BarewordLiteral::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void BarewordLiteral::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -651,7 +651,7 @@ RefPtr<Value> BraceExpansion::run(RefPtr<Shell> shell) | ||||||
|             values.append(value.release_nonnull()); |             values.append(value.release_nonnull()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>(move(values)); |     return make_ref_counted<ListValue>(move(values)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| HitTestResult BraceExpansion::hit_test_position(size_t offset) const | HitTestResult BraceExpansion::hit_test_position(size_t offset) const | ||||||
|  | @ -708,7 +708,7 @@ RefPtr<Value> CastToCommand::run(RefPtr<Shell> shell) | ||||||
|         return value; |         return value; | ||||||
| 
 | 
 | ||||||
|     auto argv = value->resolve_as_list(shell); |     auto argv = value->resolve_as_list(shell); | ||||||
|     return create<CommandValue>(move(argv), position()); |     return make_ref_counted<CommandValue>(move(argv), position()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CastToCommand::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void CastToCommand::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -768,7 +768,7 @@ void CastToList::dump(int level) const | ||||||
| RefPtr<Value> CastToList::run(RefPtr<Shell> shell) | RefPtr<Value> CastToList::run(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     if (!m_inner) |     if (!m_inner) | ||||||
|         return create<ListValue>({}); |         return make_ref_counted<ListValue>({}); | ||||||
| 
 | 
 | ||||||
|     auto inner_value = m_inner->run(shell)->resolve_without_cast(shell); |     auto inner_value = m_inner->run(shell)->resolve_without_cast(shell); | ||||||
| 
 | 
 | ||||||
|  | @ -778,9 +778,9 @@ RefPtr<Value> CastToList::run(RefPtr<Shell> shell) | ||||||
|     auto values = inner_value->resolve_as_list(shell); |     auto values = inner_value->resolve_as_list(shell); | ||||||
|     NonnullRefPtrVector<Value> cast_values; |     NonnullRefPtrVector<Value> cast_values; | ||||||
|     for (auto& value : values) |     for (auto& value : values) | ||||||
|         cast_values.append(create<StringValue>(value)); |         cast_values.append(make_ref_counted<StringValue>(value)); | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>(cast_values); |     return make_ref_counted<ListValue>(cast_values); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CastToList::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(NonnullRefPtr<Value>)> callback) | void CastToList::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(NonnullRefPtr<Value>)> callback) | ||||||
|  | @ -831,7 +831,7 @@ RefPtr<Value> CloseFdRedirection::run(RefPtr<Shell>) | ||||||
|     Command command; |     Command command; | ||||||
|     command.position = position(); |     command.position = position(); | ||||||
|     command.redirections.append(adopt_ref(*new CloseRedirection(m_fd))); |     command.redirections.append(adopt_ref(*new CloseRedirection(m_fd))); | ||||||
|     return create<CommandValue>(move(command)); |     return make_ref_counted<CommandValue>(move(command)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CloseFdRedirection::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | void CloseFdRedirection::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | ||||||
|  | @ -858,7 +858,7 @@ void CommandLiteral::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> CommandLiteral::run(RefPtr<Shell>) | RefPtr<Value> CommandLiteral::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     return create<CommandValue>(m_command); |     return make_ref_counted<CommandValue>(m_command); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CommandLiteral::CommandLiteral(Position position, Command command) | CommandLiteral::CommandLiteral(Position position, Command command) | ||||||
|  | @ -879,7 +879,7 @@ void Comment::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> Comment::run(RefPtr<Shell>) | RefPtr<Value> Comment::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     return create<ListValue>({}); |     return make_ref_counted<ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Comment::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | void Comment::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | ||||||
|  | @ -911,7 +911,7 @@ RefPtr<Value> ContinuationControl::run(RefPtr<Shell> shell) | ||||||
|         shell->raise_error(Shell::ShellError::InternalControlFlowContinue, {}, position()); |         shell->raise_error(Shell::ShellError::InternalControlFlowContinue, {}, position()); | ||||||
|     else |     else | ||||||
|         VERIFY_NOT_REACHED(); |         VERIFY_NOT_REACHED(); | ||||||
|     return create<ListValue>({}); |     return make_ref_counted<ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ContinuationControl::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | void ContinuationControl::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | ||||||
|  | @ -932,7 +932,7 @@ RefPtr<Value> DoubleQuotedString::run(RefPtr<Shell> shell) | ||||||
| 
 | 
 | ||||||
|     builder.join("", values); |     builder.join("", values); | ||||||
| 
 | 
 | ||||||
|     return create<StringValue>(builder.to_string()); |     return make_ref_counted<StringValue>(builder.to_string()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void DoubleQuotedString::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void DoubleQuotedString::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -977,12 +977,12 @@ RefPtr<Value> DynamicEvaluate::run(RefPtr<Shell> shell) | ||||||
|     if (result->is_string()) { |     if (result->is_string()) { | ||||||
|         auto name_part = result->resolve_as_list(shell); |         auto name_part = result->resolve_as_list(shell); | ||||||
|         VERIFY(name_part.size() == 1); |         VERIFY(name_part.size() == 1); | ||||||
|         return create<SimpleVariableValue>(name_part[0]); |         return make_ref_counted<SimpleVariableValue>(name_part[0]); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // If it's anything else, we're just gonna cast it to a list.
 |     // If it's anything else, we're just gonna cast it to a list.
 | ||||||
|     auto list = result->resolve_as_list(shell); |     auto list = result->resolve_as_list(shell); | ||||||
|     return create<CommandValue>(move(list), position()); |     return make_ref_counted<CommandValue>(move(list), position()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void DynamicEvaluate::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void DynamicEvaluate::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -1019,7 +1019,7 @@ RefPtr<Value> Fd2FdRedirection::run(RefPtr<Shell>) | ||||||
|     Command command; |     Command command; | ||||||
|     command.position = position(); |     command.position = position(); | ||||||
|     command.redirections.append(FdRedirection::create(m_new_fd, m_old_fd, Rewiring::Close::None)); |     command.redirections.append(FdRedirection::create(m_new_fd, m_old_fd, Rewiring::Close::None)); | ||||||
|     return create<CommandValue>(move(command)); |     return make_ref_counted<CommandValue>(move(command)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Fd2FdRedirection::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | void Fd2FdRedirection::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | ||||||
|  | @ -1061,7 +1061,7 @@ RefPtr<Value> FunctionDeclaration::run(RefPtr<Shell> shell) | ||||||
| 
 | 
 | ||||||
|     shell->define_function(m_name.name, move(args), m_block); |     shell->define_function(m_name.name, move(args), m_block); | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>({}); |     return make_ref_counted<ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void FunctionDeclaration::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void FunctionDeclaration::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -1147,7 +1147,7 @@ void ForLoop::dump(int level) const | ||||||
| RefPtr<Value> ForLoop::run(RefPtr<Shell> shell) | RefPtr<Value> ForLoop::run(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     if (!m_block) |     if (!m_block) | ||||||
|         return create<ListValue>({}); |         return make_ref_counted<ListValue>({}); | ||||||
| 
 | 
 | ||||||
|     size_t consecutive_interruptions = 0; |     size_t consecutive_interruptions = 0; | ||||||
|     auto run = [&](auto& block_value) { |     auto run = [&](auto& block_value) { | ||||||
|  | @ -1197,7 +1197,7 @@ RefPtr<Value> ForLoop::run(RefPtr<Shell> shell) | ||||||
|                 shell->set_local_variable(variable_name, value, true); |                 shell->set_local_variable(variable_name, value, true); | ||||||
| 
 | 
 | ||||||
|                 if (index_name.has_value()) |                 if (index_name.has_value()) | ||||||
|                     shell->set_local_variable(index_name.value(), create<AST::StringValue>(String::number(i)), true); |                     shell->set_local_variable(index_name.value(), make_ref_counted<AST::StringValue>(String::number(i)), true); | ||||||
| 
 | 
 | ||||||
|                 ++i; |                 ++i; | ||||||
| 
 | 
 | ||||||
|  | @ -1217,7 +1217,7 @@ RefPtr<Value> ForLoop::run(RefPtr<Shell> shell) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>({}); |     return make_ref_counted<ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ForLoop::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void ForLoop::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -1286,7 +1286,7 @@ void Glob::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> Glob::run(RefPtr<Shell>) | RefPtr<Value> Glob::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     return create<GlobValue>(m_text, position()); |     return make_ref_counted<GlobValue>(m_text, position()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Glob::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata metadata) | void Glob::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata metadata) | ||||||
|  | @ -1342,7 +1342,7 @@ RefPtr<Value> Heredoc::run(RefPtr<Shell> shell) | ||||||
|         builder.append('\n'); |         builder.append('\n'); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return create<StringValue>(builder.to_string()); |     return make_ref_counted<StringValue>(builder.to_string()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Heredoc::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Heredoc::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -1425,12 +1425,12 @@ void HistoryEvent::dump(int level) const | ||||||
| RefPtr<Value> HistoryEvent::run(RefPtr<Shell> shell) | RefPtr<Value> HistoryEvent::run(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     if (!shell) |     if (!shell) | ||||||
|         return create<AST::ListValue>({}); |         return make_ref_counted<AST::ListValue>({}); | ||||||
| 
 | 
 | ||||||
|     auto editor = shell->editor(); |     auto editor = shell->editor(); | ||||||
|     if (!editor) { |     if (!editor) { | ||||||
|         shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "No history available!", position()); |         shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "No history available!", position()); | ||||||
|         return create<AST::ListValue>({}); |         return make_ref_counted<AST::ListValue>({}); | ||||||
|     } |     } | ||||||
|     auto& history = editor->history(); |     auto& history = editor->history(); | ||||||
| 
 | 
 | ||||||
|  | @ -1450,14 +1450,14 @@ RefPtr<Value> HistoryEvent::run(RefPtr<Shell> shell) | ||||||
|     case HistorySelector::EventKind::IndexFromStart: |     case HistorySelector::EventKind::IndexFromStart: | ||||||
|         if (m_selector.event.index >= history.size()) { |         if (m_selector.event.index >= history.size()) { | ||||||
|             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event index out of bounds", m_selector.event.text_position); |             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event index out of bounds", m_selector.event.text_position); | ||||||
|             return create<AST::ListValue>({}); |             return make_ref_counted<AST::ListValue>({}); | ||||||
|         } |         } | ||||||
|         resolved_history = history[m_selector.event.index].entry; |         resolved_history = history[m_selector.event.index].entry; | ||||||
|         break; |         break; | ||||||
|     case HistorySelector::EventKind::IndexFromEnd: |     case HistorySelector::EventKind::IndexFromEnd: | ||||||
|         if (m_selector.event.index >= history.size()) { |         if (m_selector.event.index >= history.size()) { | ||||||
|             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event index out of bounds", m_selector.event.text_position); |             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event index out of bounds", m_selector.event.text_position); | ||||||
|             return create<AST::ListValue>({}); |             return make_ref_counted<AST::ListValue>({}); | ||||||
|         } |         } | ||||||
|         resolved_history = history[history.size() - m_selector.event.index - 1].entry; |         resolved_history = history[history.size() - m_selector.event.index - 1].entry; | ||||||
|         break; |         break; | ||||||
|  | @ -1465,7 +1465,7 @@ RefPtr<Value> HistoryEvent::run(RefPtr<Shell> shell) | ||||||
|         auto it = find_reverse(history.begin(), history.end(), [&](auto& entry) { return entry.entry.contains(m_selector.event.text); }); |         auto it = find_reverse(history.begin(), history.end(), [&](auto& entry) { return entry.entry.contains(m_selector.event.text); }); | ||||||
|         if (it.is_end()) { |         if (it.is_end()) { | ||||||
|             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event did not match any entry", m_selector.event.text_position); |             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event did not match any entry", m_selector.event.text_position); | ||||||
|             return create<AST::ListValue>({}); |             return make_ref_counted<AST::ListValue>({}); | ||||||
|         } |         } | ||||||
|         resolved_history = it->entry; |         resolved_history = it->entry; | ||||||
|         break; |         break; | ||||||
|  | @ -1474,7 +1474,7 @@ RefPtr<Value> HistoryEvent::run(RefPtr<Shell> shell) | ||||||
|         auto it = find_reverse(history.begin(), history.end(), [&](auto& entry) { return entry.entry.starts_with(m_selector.event.text); }); |         auto it = find_reverse(history.begin(), history.end(), [&](auto& entry) { return entry.entry.starts_with(m_selector.event.text); }); | ||||||
|         if (it.is_end()) { |         if (it.is_end()) { | ||||||
|             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event did not match any entry", m_selector.event.text_position); |             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History event did not match any entry", m_selector.event.text_position); | ||||||
|             return create<AST::ListValue>({}); |             return make_ref_counted<AST::ListValue>({}); | ||||||
|         } |         } | ||||||
|         resolved_history = it->entry; |         resolved_history = it->entry; | ||||||
|         break; |         break; | ||||||
|  | @ -1491,23 +1491,23 @@ RefPtr<Value> HistoryEvent::run(RefPtr<Shell> shell) | ||||||
|         auto end_index = m_selector.word_selector_range.end->resolve(nodes.size()); |         auto end_index = m_selector.word_selector_range.end->resolve(nodes.size()); | ||||||
|         if (start_index >= nodes.size()) { |         if (start_index >= nodes.size()) { | ||||||
|             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History word index out of bounds", m_selector.word_selector_range.start.position); |             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History word index out of bounds", m_selector.word_selector_range.start.position); | ||||||
|             return create<AST::ListValue>({}); |             return make_ref_counted<AST::ListValue>({}); | ||||||
|         } |         } | ||||||
|         if (end_index >= nodes.size()) { |         if (end_index >= nodes.size()) { | ||||||
|             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History word index out of bounds", m_selector.word_selector_range.end->position); |             shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History word index out of bounds", m_selector.word_selector_range.end->position); | ||||||
|             return create<AST::ListValue>({}); |             return make_ref_counted<AST::ListValue>({}); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         decltype(nodes) resolved_nodes; |         decltype(nodes) resolved_nodes; | ||||||
|         resolved_nodes.append(nodes.data() + start_index, end_index - start_index + 1); |         resolved_nodes.append(nodes.data() + start_index, end_index - start_index + 1); | ||||||
|         NonnullRefPtr<AST::Node> list = create<AST::ListConcatenate>(position(), move(resolved_nodes)); |         NonnullRefPtr<AST::Node> list = make_ref_counted<AST::ListConcatenate>(position(), move(resolved_nodes)); | ||||||
|         return list->run(shell); |         return list->run(shell); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     auto index = m_selector.word_selector_range.start.resolve(nodes.size()); |     auto index = m_selector.word_selector_range.start.resolve(nodes.size()); | ||||||
|     if (index >= nodes.size()) { |     if (index >= nodes.size()) { | ||||||
|         shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History word index out of bounds", m_selector.word_selector_range.start.position); |         shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "History word index out of bounds", m_selector.word_selector_range.start.position); | ||||||
|         return create<AST::ListValue>({}); |         return make_ref_counted<AST::ListValue>({}); | ||||||
|     } |     } | ||||||
|     return nodes[index].run(shell); |     return nodes[index].run(shell); | ||||||
| } | } | ||||||
|  | @ -1583,7 +1583,7 @@ void Execute::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(Non | ||||||
|                     VERIFY(rc); |                     VERIFY(rc); | ||||||
| 
 | 
 | ||||||
|                     if (shell->options.inline_exec_keep_empty_segments) |                     if (shell->options.inline_exec_keep_empty_segments) | ||||||
|                         if (callback(create<StringValue>("")) == IterationDecision::Break) { |                         if (callback(make_ref_counted<StringValue>("")) == IterationDecision::Break) { | ||||||
|                             loop.quit(Break); |                             loop.quit(Break); | ||||||
|                             notifier->set_enabled(false); |                             notifier->set_enabled(false); | ||||||
|                             return Break; |                             return Break; | ||||||
|  | @ -1594,7 +1594,7 @@ void Execute::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(Non | ||||||
|                     VERIFY(rc); |                     VERIFY(rc); | ||||||
| 
 | 
 | ||||||
|                     auto str = StringView(entry.data(), entry.size() - ifs.length()); |                     auto str = StringView(entry.data(), entry.size() - ifs.length()); | ||||||
|                     if (callback(create<StringValue>(str)) == IterationDecision::Break) { |                     if (callback(make_ref_counted<StringValue>(str)) == IterationDecision::Break) { | ||||||
|                         loop.quit(Break); |                         loop.quit(Break); | ||||||
|                         notifier->set_enabled(false); |                         notifier->set_enabled(false); | ||||||
|                         return Break; |                         return Break; | ||||||
|  | @ -1678,7 +1678,7 @@ void Execute::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(Non | ||||||
|                 auto entry = ByteBuffer::create_uninitialized(stream.size()); |                 auto entry = ByteBuffer::create_uninitialized(stream.size()); | ||||||
|                 auto rc = stream.read_or_error(entry); |                 auto rc = stream.read_or_error(entry); | ||||||
|                 VERIFY(rc); |                 VERIFY(rc); | ||||||
|                 callback(create<StringValue>(String::copy(entry))); |                 callback(make_ref_counted<StringValue>(String::copy(entry))); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -1688,7 +1688,7 @@ void Execute::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(Non | ||||||
|     auto jobs = shell->run_commands(commands); |     auto jobs = shell->run_commands(commands); | ||||||
| 
 | 
 | ||||||
|     if (!jobs.is_empty()) |     if (!jobs.is_empty()) | ||||||
|         callback(create<JobValue>(&jobs.last())); |         callback(make_ref_counted<JobValue>(&jobs.last())); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> Execute::run(RefPtr<Shell> shell) | RefPtr<Value> Execute::run(RefPtr<Shell> shell) | ||||||
|  | @ -1705,7 +1705,7 @@ RefPtr<Value> Execute::run(RefPtr<Shell> shell) | ||||||
|     if (values.size() == 1 && values.first().is_job()) |     if (values.size() == 1 && values.first().is_job()) | ||||||
|         return values.first(); |         return values.first(); | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>(move(values)); |     return make_ref_counted<ListValue>(move(values)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Execute::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Execute::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -1789,7 +1789,7 @@ RefPtr<Value> IfCond::run(RefPtr<Shell> shell) | ||||||
|             return m_false_branch->run(shell); |             return m_false_branch->run(shell); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>({}); |     return make_ref_counted<ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void IfCond::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void IfCond::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -1839,7 +1839,7 @@ IfCond::IfCond(Position position, Optional<Position> else_position, NonnullRefPt | ||||||
|     else if (m_false_branch && m_false_branch->is_syntax_error()) |     else if (m_false_branch && m_false_branch->is_syntax_error()) | ||||||
|         set_is_syntax_error(m_false_branch->syntax_error_node()); |         set_is_syntax_error(m_false_branch->syntax_error_node()); | ||||||
| 
 | 
 | ||||||
|     m_condition = create<AST::Execute>(m_condition->position(), m_condition); |     m_condition = make_ref_counted<AST::Execute>(m_condition->position(), m_condition); | ||||||
| 
 | 
 | ||||||
|     if (m_true_branch) { |     if (m_true_branch) { | ||||||
|         auto true_branch = m_true_branch.release_nonnull(); |         auto true_branch = m_true_branch.release_nonnull(); | ||||||
|  | @ -1878,7 +1878,7 @@ RefPtr<Value> ImmediateExpression::run(RefPtr<Shell> shell) | ||||||
|     if (node) |     if (node) | ||||||
|         return node->run(shell); |         return node->run(shell); | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>({}); |     return make_ref_counted<ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ImmediateExpression::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void ImmediateExpression::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -1963,7 +1963,7 @@ RefPtr<Value> Join::run(RefPtr<Shell> shell) | ||||||
|     auto left = m_left->to_lazy_evaluated_commands(shell); |     auto left = m_left->to_lazy_evaluated_commands(shell); | ||||||
|     auto right = m_right->to_lazy_evaluated_commands(shell); |     auto right = m_right->to_lazy_evaluated_commands(shell); | ||||||
| 
 | 
 | ||||||
|     return create<CommandSequenceValue>(join_commands(move(left), move(right))); |     return make_ref_counted<CommandSequenceValue>(join_commands(move(left), move(right))); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Join::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Join::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2091,20 +2091,20 @@ RefPtr<Value> MatchExpr::run(RefPtr<Shell> shell) | ||||||
|                         size_t i = 0; |                         size_t i = 0; | ||||||
|                         for (auto& name : entry.match_names.value()) { |                         for (auto& name : entry.match_names.value()) { | ||||||
|                             if (spans.size() > i) |                             if (spans.size() > i) | ||||||
|                                 shell->set_local_variable(name, create<AST::StringValue>(spans[i]), true); |                                 shell->set_local_variable(name, make_ref_counted<AST::StringValue>(spans[i]), true); | ||||||
|                             ++i; |                             ++i; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     return entry.body->run(shell); |                     return entry.body->run(shell); | ||||||
|                 } else { |                 } else { | ||||||
|                     return create<AST::ListValue>({}); |                     return make_ref_counted<AST::ListValue>({}); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "Non-exhaustive match rules!", position()); |     shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "Non-exhaustive match rules!", position()); | ||||||
|     return create<AST::ListValue>({}); |     return make_ref_counted<AST::ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void MatchExpr::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void MatchExpr::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2186,7 +2186,7 @@ RefPtr<Value> Or::run(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     auto commands = m_left->to_lazy_evaluated_commands(shell); |     auto commands = m_left->to_lazy_evaluated_commands(shell); | ||||||
|     commands.last().next_chain.empend(*m_right, NodeWithAction::Or); |     commands.last().next_chain.empend(*m_right, NodeWithAction::Or); | ||||||
|     return create<CommandSequenceValue>(move(commands)); |     return make_ref_counted<CommandSequenceValue>(move(commands)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Or::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Or::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2270,7 +2270,7 @@ RefPtr<Value> Pipe::run(RefPtr<Shell> shell) | ||||||
|     if (first_in_right.pipeline) { |     if (first_in_right.pipeline) { | ||||||
|         last_in_left.pipeline = first_in_right.pipeline; |         last_in_left.pipeline = first_in_right.pipeline; | ||||||
|     } else { |     } else { | ||||||
|         auto pipeline = create<Pipeline>(); |         auto pipeline = make_ref_counted<Pipeline>(); | ||||||
|         last_in_left.pipeline = pipeline; |         last_in_left.pipeline = pipeline; | ||||||
|         first_in_right.pipeline = pipeline; |         first_in_right.pipeline = pipeline; | ||||||
|     } |     } | ||||||
|  | @ -2281,7 +2281,7 @@ RefPtr<Value> Pipe::run(RefPtr<Shell> shell) | ||||||
|     commands.append(first_in_right); |     commands.append(first_in_right); | ||||||
|     commands.extend(right); |     commands.extend(right); | ||||||
| 
 | 
 | ||||||
|     return create<CommandSequenceValue>(move(commands)); |     return make_ref_counted<CommandSequenceValue>(move(commands)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Pipe::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Pipe::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2402,12 +2402,12 @@ RefPtr<Value> Range::run(RefPtr<Shell> shell) | ||||||
|                     for (u32 code_point = start_code_point; code_point != end_code_point; code_point += step) { |                     for (u32 code_point = start_code_point; code_point != end_code_point; code_point += step) { | ||||||
|                         builder.clear(); |                         builder.clear(); | ||||||
|                         builder.append_code_point(code_point); |                         builder.append_code_point(code_point); | ||||||
|                         values.append(create<StringValue>(builder.to_string())); |                         values.append(make_ref_counted<StringValue>(builder.to_string())); | ||||||
|                     } |                     } | ||||||
|                     // Append the ending code point too, most shells treat this as inclusive.
 |                     // Append the ending code point too, most shells treat this as inclusive.
 | ||||||
|                     builder.clear(); |                     builder.clear(); | ||||||
|                     builder.append_code_point(end_code_point); |                     builder.append_code_point(end_code_point); | ||||||
|                     values.append(create<StringValue>(builder.to_string())); |                     values.append(make_ref_counted<StringValue>(builder.to_string())); | ||||||
|                 } else { |                 } else { | ||||||
|                     // Could be two numbers?
 |                     // Could be two numbers?
 | ||||||
|                     auto start_int = start_str.to_int(); |                     auto start_int = start_str.to_int(); | ||||||
|  | @ -2417,9 +2417,9 @@ RefPtr<Value> Range::run(RefPtr<Shell> shell) | ||||||
|                         auto end = end_int.value(); |                         auto end = end_int.value(); | ||||||
|                         auto step = start > end ? -1 : 1; |                         auto step = start > end ? -1 : 1; | ||||||
|                         for (int value = start; value != end; value += step) |                         for (int value = start; value != end; value += step) | ||||||
|                             values.append(create<StringValue>(String::number(value))); |                             values.append(make_ref_counted<StringValue>(String::number(value))); | ||||||
|                         // Append the range end too, most shells treat this as inclusive.
 |                         // Append the range end too, most shells treat this as inclusive.
 | ||||||
|                         values.append(create<StringValue>(String::number(end))); |                         values.append(make_ref_counted<StringValue>(String::number(end))); | ||||||
|                     } else { |                     } else { | ||||||
|                         goto yield_start_end; |                         goto yield_start_end; | ||||||
|                     } |                     } | ||||||
|  | @ -2428,8 +2428,8 @@ RefPtr<Value> Range::run(RefPtr<Shell> shell) | ||||||
|             yield_start_end:; |             yield_start_end:; | ||||||
|                 shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, String::formatted("Cannot interpolate between '{}' and '{}'!", start_str, end_str), position); |                 shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, String::formatted("Cannot interpolate between '{}' and '{}'!", start_str, end_str), position); | ||||||
|                 // We can't really interpolate between the two, so just yield both.
 |                 // We can't really interpolate between the two, so just yield both.
 | ||||||
|                 values.append(create<StringValue>(move(start_str))); |                 values.append(make_ref_counted<StringValue>(move(start_str))); | ||||||
|                 values.append(create<StringValue>(move(end_str))); |                 values.append(make_ref_counted<StringValue>(move(end_str))); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return values; |             return values; | ||||||
|  | @ -2442,9 +2442,9 @@ RefPtr<Value> Range::run(RefPtr<Shell> shell) | ||||||
|     auto start_value = m_start->run(shell); |     auto start_value = m_start->run(shell); | ||||||
|     auto end_value = m_end->run(shell); |     auto end_value = m_end->run(shell); | ||||||
|     if (!start_value || !end_value) |     if (!start_value || !end_value) | ||||||
|         return create<ListValue>({}); |         return make_ref_counted<ListValue>({}); | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>(interpolate(*start_value, *end_value, shell)); |     return make_ref_counted<ListValue>(interpolate(*start_value, *end_value, shell)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Range::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Range::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2503,7 +2503,7 @@ RefPtr<Value> ReadRedirection::run(RefPtr<Shell> shell) | ||||||
|     builder.join(" ", path_segments); |     builder.join(" ", path_segments); | ||||||
| 
 | 
 | ||||||
|     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::Read)); |     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::Read)); | ||||||
|     return create<CommandValue>(move(command)); |     return make_ref_counted<CommandValue>(move(command)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ReadRedirection::ReadRedirection(Position position, int fd, NonnullRefPtr<Node> path) | ReadRedirection::ReadRedirection(Position position, int fd, NonnullRefPtr<Node> path) | ||||||
|  | @ -2530,7 +2530,7 @@ RefPtr<Value> ReadWriteRedirection::run(RefPtr<Shell> shell) | ||||||
|     builder.join(" ", path_segments); |     builder.join(" ", path_segments); | ||||||
| 
 | 
 | ||||||
|     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::ReadWrite)); |     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::ReadWrite)); | ||||||
|     return create<CommandValue>(move(command)); |     return make_ref_counted<CommandValue>(move(command)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ReadWriteRedirection::ReadWriteRedirection(Position position, int fd, NonnullRefPtr<Node> path) | ReadWriteRedirection::ReadWriteRedirection(Position position, int fd, NonnullRefPtr<Node> path) | ||||||
|  | @ -2569,7 +2569,7 @@ RefPtr<Value> Sequence::run(RefPtr<Shell> shell) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return create<CommandSequenceValue>(move(all_commands)); |     return make_ref_counted<CommandSequenceValue>(move(all_commands)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Sequence::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Sequence::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2619,9 +2619,9 @@ void Subshell::dump(int level) const | ||||||
| RefPtr<Value> Subshell::run(RefPtr<Shell> shell) | RefPtr<Value> Subshell::run(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     if (!m_block) |     if (!m_block) | ||||||
|         return create<ListValue>({}); |         return make_ref_counted<ListValue>({}); | ||||||
| 
 | 
 | ||||||
|     return create<AST::CommandSequenceValue>(m_block->to_lazy_evaluated_commands(shell)); |     return make_ref_counted<AST::CommandSequenceValue>(m_block->to_lazy_evaluated_commands(shell)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Subshell::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Subshell::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2704,7 +2704,7 @@ void SimpleVariable::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> SimpleVariable::run(RefPtr<Shell>) | RefPtr<Value> SimpleVariable::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     NonnullRefPtr<Value> value = create<SimpleVariableValue>(m_name); |     NonnullRefPtr<Value> value = make_ref_counted<SimpleVariableValue>(m_name); | ||||||
|     if (m_slice) |     if (m_slice) | ||||||
|         value = value->with_slices(*m_slice); |         value = value->with_slices(*m_slice); | ||||||
|     return value; |     return value; | ||||||
|  | @ -2769,7 +2769,7 @@ void SpecialVariable::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> SpecialVariable::run(RefPtr<Shell>) | RefPtr<Value> SpecialVariable::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     NonnullRefPtr<Value> value = create<SpecialVariableValue>(m_name); |     NonnullRefPtr<Value> value = make_ref_counted<SpecialVariableValue>(m_name); | ||||||
|     if (m_slice) |     if (m_slice) | ||||||
|         value = value->with_slices(*m_slice); |         value = value->with_slices(*m_slice); | ||||||
|     return value; |     return value; | ||||||
|  | @ -2829,12 +2829,12 @@ RefPtr<Value> Juxtaposition::run(RefPtr<Shell> shell) | ||||||
|         builder.append(left[0]); |         builder.append(left[0]); | ||||||
|         builder.append(right[0]); |         builder.append(right[0]); | ||||||
| 
 | 
 | ||||||
|         return create<StringValue>(builder.to_string()); |         return make_ref_counted<StringValue>(builder.to_string()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Otherwise, treat them as lists and create a list product.
 |     // Otherwise, treat them as lists and create a list product.
 | ||||||
|     if (left.is_empty() || right.is_empty()) |     if (left.is_empty() || right.is_empty()) | ||||||
|         return create<ListValue>({}); |         return make_ref_counted<ListValue>({}); | ||||||
| 
 | 
 | ||||||
|     Vector<String> result; |     Vector<String> result; | ||||||
|     result.ensure_capacity(left.size() * right.size()); |     result.ensure_capacity(left.size() * right.size()); | ||||||
|  | @ -2849,7 +2849,7 @@ RefPtr<Value> Juxtaposition::run(RefPtr<Shell> shell) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>(move(result)); |     return make_ref_counted<ListValue>(move(result)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Juxtaposition::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void Juxtaposition::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -2940,7 +2940,7 @@ void StringLiteral::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> StringLiteral::run(RefPtr<Shell>) | RefPtr<Value> StringLiteral::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     return create<StringValue>(m_text); |     return make_ref_counted<StringValue>(m_text); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StringLiteral::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata metadata) | void StringLiteral::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata metadata) | ||||||
|  | @ -2980,7 +2980,7 @@ RefPtr<Value> StringPartCompose::run(RefPtr<Shell> shell) | ||||||
|     builder.join(" ", left); |     builder.join(" ", left); | ||||||
|     builder.join(" ", right); |     builder.join(" ", right); | ||||||
| 
 | 
 | ||||||
|     return create<StringValue>(builder.to_string()); |     return make_ref_counted<StringValue>(builder.to_string()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StringPartCompose::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void StringPartCompose::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -3024,7 +3024,7 @@ void SyntaxError::dump(int level) const | ||||||
| RefPtr<Value> SyntaxError::run(RefPtr<Shell> shell) | RefPtr<Value> SyntaxError::run(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, m_syntax_error_text, position()); |     shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, m_syntax_error_text, position()); | ||||||
|     return create<StringValue>(""); |     return make_ref_counted<StringValue>(""); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SyntaxError::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | void SyntaxError::highlight_in_editor(Line::Editor& editor, Shell&, HighlightMetadata) | ||||||
|  | @ -3076,7 +3076,7 @@ void Tilde::dump(int level) const | ||||||
| 
 | 
 | ||||||
| RefPtr<Value> Tilde::run(RefPtr<Shell>) | RefPtr<Value> Tilde::run(RefPtr<Shell>) | ||||||
| { | { | ||||||
|     return create<TildeValue>(m_username); |     return make_ref_counted<TildeValue>(m_username); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Tilde::highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata) | void Tilde::highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata) | ||||||
|  | @ -3141,7 +3141,7 @@ RefPtr<Value> WriteAppendRedirection::run(RefPtr<Shell> shell) | ||||||
|     builder.join(" ", path_segments); |     builder.join(" ", path_segments); | ||||||
| 
 | 
 | ||||||
|     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::WriteAppend)); |     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::WriteAppend)); | ||||||
|     return create<CommandValue>(move(command)); |     return make_ref_counted<CommandValue>(move(command)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| WriteAppendRedirection::WriteAppendRedirection(Position position, int fd, NonnullRefPtr<Node> path) | WriteAppendRedirection::WriteAppendRedirection(Position position, int fd, NonnullRefPtr<Node> path) | ||||||
|  | @ -3168,7 +3168,7 @@ RefPtr<Value> WriteRedirection::run(RefPtr<Shell> shell) | ||||||
|     builder.join(" ", path_segments); |     builder.join(" ", path_segments); | ||||||
| 
 | 
 | ||||||
|     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::Write)); |     command.redirections.append(PathRedirection::create(builder.to_string(), m_fd, PathRedirection::Write)); | ||||||
|     return create<CommandValue>(move(command)); |     return make_ref_counted<CommandValue>(move(command)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| WriteRedirection::WriteRedirection(Position position, int fd, NonnullRefPtr<Node> path) | WriteRedirection::WriteRedirection(Position position, int fd, NonnullRefPtr<Node> path) | ||||||
|  | @ -3200,7 +3200,7 @@ RefPtr<Value> VariableDeclarations::run(RefPtr<Shell> shell) | ||||||
|         shell->set_local_variable(name, value.release_nonnull()); |         shell->set_local_variable(name, value.release_nonnull()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return create<ListValue>({}); |     return make_ref_counted<ListValue>({}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void VariableDeclarations::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | void VariableDeclarations::highlight_in_editor(Line::Editor& editor, Shell& shell, HighlightMetadata metadata) | ||||||
|  | @ -3297,7 +3297,7 @@ NonnullRefPtr<Value> ListValue::resolve_without_cast(RefPtr<Shell> shell) | ||||||
|     for (auto& value : m_contained_values) |     for (auto& value : m_contained_values) | ||||||
|         values.append(value.resolve_without_cast(shell)); |         values.append(value.resolve_without_cast(shell)); | ||||||
| 
 | 
 | ||||||
|     NonnullRefPtr<Value> value = create<ListValue>(move(values)); |     NonnullRefPtr<Value> value = make_ref_counted<ListValue>(move(values)); | ||||||
|     if (!m_slices.is_empty()) |     if (!m_slices.is_empty()) | ||||||
|         value = value->with_slices(m_slices); |         value = value->with_slices(m_slices); | ||||||
|     return value; |     return value; | ||||||
|  | @ -3357,7 +3357,7 @@ Vector<String> StringValue::resolve_as_list(RefPtr<Shell> shell) | ||||||
| NonnullRefPtr<Value> StringValue::resolve_without_cast(RefPtr<Shell> shell) | NonnullRefPtr<Value> StringValue::resolve_without_cast(RefPtr<Shell> shell) | ||||||
| { | { | ||||||
|     if (is_list()) |     if (is_list()) | ||||||
|         return create<AST::ListValue>(resolve_as_list(shell)); // No need to reapply the slices.
 |         return make_ref_counted<AST::ListValue>(resolve_as_list(shell)); // No need to reapply the slices.
 | ||||||
| 
 | 
 | ||||||
|     return *this; |     return *this; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -20,10 +20,10 @@ | ||||||
| 
 | 
 | ||||||
| namespace Shell::AST { | namespace Shell::AST { | ||||||
| 
 | 
 | ||||||
| using AK::create; | using AK::make_ref_counted; | ||||||
| 
 | 
 | ||||||
| template<typename T> | template<typename T> | ||||||
| static inline NonnullRefPtr<T> create(std::initializer_list<NonnullRefPtr<Value>> arg) | static inline NonnullRefPtr<T> make_ref_counted(std::initializer_list<NonnullRefPtr<Value>> arg) | ||||||
| { | { | ||||||
|     return adopt_ref(*new T(arg)); |     return adopt_ref(*new T(arg)); | ||||||
| } | } | ||||||
|  | @ -243,7 +243,7 @@ class CommandValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override; |     virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<CommandValue>(m_command)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<CommandValue>(m_command)->set_slices(m_slices); } | ||||||
|     virtual ~CommandValue(); |     virtual ~CommandValue(); | ||||||
|     virtual bool is_command() const override { return true; } |     virtual bool is_command() const override { return true; } | ||||||
|     CommandValue(Command command) |     CommandValue(Command command) | ||||||
|  | @ -264,7 +264,7 @@ class CommandSequenceValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override; |     virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<CommandSequenceValue>(m_contained_values)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<CommandSequenceValue>(m_contained_values)->set_slices(m_slices); } | ||||||
|     virtual ~CommandSequenceValue(); |     virtual ~CommandSequenceValue(); | ||||||
|     virtual bool is_command() const override { return true; } |     virtual bool is_command() const override { return true; } | ||||||
|     CommandSequenceValue(Vector<Command> commands) |     CommandSequenceValue(Vector<Command> commands) | ||||||
|  | @ -280,7 +280,7 @@ class JobValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override { VERIFY_NOT_REACHED(); } |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override { VERIFY_NOT_REACHED(); } | ||||||
|     virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override { VERIFY_NOT_REACHED(); } |     virtual Vector<Command> resolve_as_commands(RefPtr<Shell>) override { VERIFY_NOT_REACHED(); } | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<JobValue>(m_job)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<JobValue>(m_job)->set_slices(m_slices); } | ||||||
|     virtual ~JobValue(); |     virtual ~JobValue(); | ||||||
|     virtual bool is_job() const override { return true; } |     virtual bool is_job() const override { return true; } | ||||||
|     JobValue(RefPtr<Job> job) |     JobValue(RefPtr<Job> job) | ||||||
|  | @ -298,7 +298,7 @@ class ListValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) override; |     virtual NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<ListValue>(m_contained_values)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<ListValue>(m_contained_values)->set_slices(m_slices); } | ||||||
|     virtual ~ListValue(); |     virtual ~ListValue(); | ||||||
|     virtual bool is_list() const override { return true; } |     virtual bool is_list() const override { return true; } | ||||||
|     virtual bool is_list_without_resolution() const override { return true; } |     virtual bool is_list_without_resolution() const override { return true; } | ||||||
|  | @ -322,7 +322,7 @@ private: | ||||||
| class StringValue final : public Value { | class StringValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<StringValue>(m_string, m_split, m_keep_empty)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<StringValue>(m_string, m_split, m_keep_empty)->set_slices(m_slices); } | ||||||
|     virtual ~StringValue(); |     virtual ~StringValue(); | ||||||
|     virtual bool is_string() const override { return m_split.is_null(); } |     virtual bool is_string() const override { return m_split.is_null(); } | ||||||
|     virtual bool is_list() const override { return !m_split.is_null(); } |     virtual bool is_list() const override { return !m_split.is_null(); } | ||||||
|  | @ -343,7 +343,7 @@ private: | ||||||
| class GlobValue final : public Value { | class GlobValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<GlobValue>(m_glob, m_generation_position)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<GlobValue>(m_glob, m_generation_position)->set_slices(m_slices); } | ||||||
|     virtual ~GlobValue(); |     virtual ~GlobValue(); | ||||||
|     virtual bool is_glob() const override { return true; } |     virtual bool is_glob() const override { return true; } | ||||||
|     GlobValue(String glob, Position position) |     GlobValue(String glob, Position position) | ||||||
|  | @ -361,7 +361,7 @@ class SimpleVariableValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) override; |     virtual NonnullRefPtr<Value> resolve_without_cast(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<SimpleVariableValue>(m_name)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<SimpleVariableValue>(m_name)->set_slices(m_slices); } | ||||||
|     virtual ~SimpleVariableValue(); |     virtual ~SimpleVariableValue(); | ||||||
|     SimpleVariableValue(String name) |     SimpleVariableValue(String name) | ||||||
|         : m_name(move(name)) |         : m_name(move(name)) | ||||||
|  | @ -375,7 +375,7 @@ private: | ||||||
| class SpecialVariableValue final : public Value { | class SpecialVariableValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<SpecialVariableValue>(m_name)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<SpecialVariableValue>(m_name)->set_slices(m_slices); } | ||||||
|     virtual ~SpecialVariableValue(); |     virtual ~SpecialVariableValue(); | ||||||
|     SpecialVariableValue(char name) |     SpecialVariableValue(char name) | ||||||
|         : m_name(name) |         : m_name(name) | ||||||
|  | @ -389,7 +389,7 @@ private: | ||||||
| class TildeValue final : public Value { | class TildeValue final : public Value { | ||||||
| public: | public: | ||||||
|     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; |     virtual Vector<String> resolve_as_list(RefPtr<Shell>) override; | ||||||
|     virtual NonnullRefPtr<Value> clone() const override { return create<TildeValue>(m_username)->set_slices(m_slices); } |     virtual NonnullRefPtr<Value> clone() const override { return make_ref_counted<TildeValue>(m_username)->set_slices(m_slices); } | ||||||
|     virtual ~TildeValue(); |     virtual ~TildeValue(); | ||||||
|     virtual bool is_string() const override { return true; } |     virtual bool is_string() const override { return true; } | ||||||
|     TildeValue(String name) |     TildeValue(String name) | ||||||
|  |  | ||||||
|  | @ -868,7 +868,7 @@ int Shell::builtin_source(int argc, const char** argv) | ||||||
|     } }; |     } }; | ||||||
| 
 | 
 | ||||||
|     if (!args.is_empty()) |     if (!args.is_empty()) | ||||||
|         set_local_variable("ARGV", AST::create<AST::ListValue>(move(string_argv))); |         set_local_variable("ARGV", AST::make_ref_counted<AST::ListValue>(move(string_argv))); | ||||||
| 
 | 
 | ||||||
|     if (!run_file(file_to_source, true)) |     if (!run_file(file_to_source, true)) | ||||||
|         return 126; |         return 126; | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ RefPtr<AST::Node> Shell::immediate_length_impl(AST::ImmediateExpression& invokin | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     auto value_with_number = [&](auto number) -> NonnullRefPtr<AST::Node> { |     auto value_with_number = [&](auto number) -> NonnullRefPtr<AST::Node> { | ||||||
|         return AST::create<AST::BarewordLiteral>(invoking_node.position(), String::number(number)); |         return AST::make_ref_counted<AST::BarewordLiteral>(invoking_node.position(), String::number(number)); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     auto do_across = [&](StringView mode_name, auto& values) { |     auto do_across = [&](StringView mode_name, auto& values) { | ||||||
|  | @ -78,17 +78,17 @@ RefPtr<AST::Node> Shell::immediate_length_impl(AST::ImmediateExpression& invokin | ||||||
|         resulting_nodes.ensure_capacity(values.size()); |         resulting_nodes.ensure_capacity(values.size()); | ||||||
|         for (auto& entry : values) { |         for (auto& entry : values) { | ||||||
|             // ImmediateExpression(length <mode_name> <entry>)
 |             // ImmediateExpression(length <mode_name> <entry>)
 | ||||||
|             resulting_nodes.unchecked_append(AST::create<AST::ImmediateExpression>( |             resulting_nodes.unchecked_append(AST::make_ref_counted<AST::ImmediateExpression>( | ||||||
|                 expr_node->position(), |                 expr_node->position(), | ||||||
|                 AST::NameWithPosition { "length", invoking_node.function_position() }, |                 AST::NameWithPosition { "length", invoking_node.function_position() }, | ||||||
|                 NonnullRefPtrVector<AST::Node> { Vector<NonnullRefPtr<AST::Node>> { |                 NonnullRefPtrVector<AST::Node> { Vector<NonnullRefPtr<AST::Node>> { | ||||||
|                     static_cast<NonnullRefPtr<AST::Node>>(AST::create<AST::BarewordLiteral>(expr_node->position(), mode_name)), |                     static_cast<NonnullRefPtr<AST::Node>>(AST::make_ref_counted<AST::BarewordLiteral>(expr_node->position(), mode_name)), | ||||||
|                     AST::create<AST::SyntheticNode>(expr_node->position(), NonnullRefPtr<AST::Value>(entry)), |                     AST::make_ref_counted<AST::SyntheticNode>(expr_node->position(), NonnullRefPtr<AST::Value>(entry)), | ||||||
|                 } }, |                 } }, | ||||||
|                 expr_node->position())); |                 expr_node->position())); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return AST::create<AST::ListConcatenate>(invoking_node.position(), move(resulting_nodes)); |         return AST::make_ref_counted<AST::ListConcatenate>(invoking_node.position(), move(resulting_nodes)); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     switch (mode) { |     switch (mode) { | ||||||
|  | @ -114,7 +114,7 @@ RefPtr<AST::Node> Shell::immediate_length_impl(AST::ImmediateExpression& invokin | ||||||
|             return value_with_number(list.size()); |             return value_with_number(list.size()); | ||||||
| 
 | 
 | ||||||
|         dbgln("List has {} entries", list.size()); |         dbgln("List has {} entries", list.size()); | ||||||
|         auto values = AST::create<AST::ListValue>(move(list)); |         auto values = AST::make_ref_counted<AST::ListValue>(move(list)); | ||||||
|         return do_across("list", values->values()); |         return do_across("list", values->values()); | ||||||
|     } |     } | ||||||
|     case String: { |     case String: { | ||||||
|  | @ -183,7 +183,7 @@ RefPtr<AST::Node> Shell::immediate_length_impl(AST::ImmediateExpression& invokin | ||||||
|             return nullptr; |             return nullptr; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         auto values = AST::create<AST::ListValue>(move(list)); |         auto values = AST::make_ref_counted<AST::ListValue>(move(list)); | ||||||
|         return do_across("string", values->values()); |         return do_across("string", values->values()); | ||||||
|     } |     } | ||||||
|     } |     } | ||||||
|  | @ -228,7 +228,7 @@ RefPtr<AST::Node> Shell::immediate_regex_replace(AST::ImmediateExpression& invok | ||||||
|     Regex<PosixExtendedParser> re { pattern->resolve_as_list(this).first() }; |     Regex<PosixExtendedParser> re { pattern->resolve_as_list(this).first() }; | ||||||
|     auto result = re.replace(value->resolve_as_list(this)[0], replacement->resolve_as_list(this)[0], PosixFlags::Global | PosixFlags::Multiline | PosixFlags::Unicode); |     auto result = re.replace(value->resolve_as_list(this)[0], replacement->resolve_as_list(this)[0], PosixFlags::Global | PosixFlags::Multiline | PosixFlags::Unicode); | ||||||
| 
 | 
 | ||||||
|     return AST::create<AST::StringLiteral>(invoking_node.position(), move(result)); |     return AST::make_ref_counted<AST::StringLiteral>(invoking_node.position(), move(result)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RefPtr<AST::Node> Shell::immediate_remove_suffix(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | RefPtr<AST::Node> Shell::immediate_remove_suffix(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | ||||||
|  | @ -256,10 +256,10 @@ RefPtr<AST::Node> Shell::immediate_remove_suffix(AST::ImmediateExpression& invok | ||||||
| 
 | 
 | ||||||
|         if (value_str.ends_with(suffix_str)) |         if (value_str.ends_with(suffix_str)) | ||||||
|             removed = removed.substring_view(0, value_str.length() - suffix_str.length()); |             removed = removed.substring_view(0, value_str.length() - suffix_str.length()); | ||||||
|         nodes.append(AST::create<AST::StringLiteral>(invoking_node.position(), removed)); |         nodes.append(AST::make_ref_counted<AST::StringLiteral>(invoking_node.position(), removed)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return AST::create<AST::ListConcatenate>(invoking_node.position(), move(nodes)); |     return AST::make_ref_counted<AST::ListConcatenate>(invoking_node.position(), move(nodes)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RefPtr<AST::Node> Shell::immediate_remove_prefix(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | RefPtr<AST::Node> Shell::immediate_remove_prefix(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | ||||||
|  | @ -287,10 +287,10 @@ RefPtr<AST::Node> Shell::immediate_remove_prefix(AST::ImmediateExpression& invok | ||||||
| 
 | 
 | ||||||
|         if (value_str.starts_with(prefix_str)) |         if (value_str.starts_with(prefix_str)) | ||||||
|             removed = removed.substring_view(prefix_str.length()); |             removed = removed.substring_view(prefix_str.length()); | ||||||
|         nodes.append(AST::create<AST::StringLiteral>(invoking_node.position(), removed)); |         nodes.append(AST::make_ref_counted<AST::StringLiteral>(invoking_node.position(), removed)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return AST::create<AST::ListConcatenate>(invoking_node.position(), move(nodes)); |     return AST::make_ref_counted<AST::ListConcatenate>(invoking_node.position(), move(nodes)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RefPtr<AST::Node> Shell::immediate_split(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | RefPtr<AST::Node> Shell::immediate_split(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | ||||||
|  | @ -316,17 +316,17 @@ RefPtr<AST::Node> Shell::immediate_split(AST::ImmediateExpression& invoking_node | ||||||
|         resulting_nodes.ensure_capacity(values.size()); |         resulting_nodes.ensure_capacity(values.size()); | ||||||
|         for (auto& entry : values) { |         for (auto& entry : values) { | ||||||
|             // ImmediateExpression(split <delimiter> <entry>)
 |             // ImmediateExpression(split <delimiter> <entry>)
 | ||||||
|             resulting_nodes.unchecked_append(AST::create<AST::ImmediateExpression>( |             resulting_nodes.unchecked_append(AST::make_ref_counted<AST::ImmediateExpression>( | ||||||
|                 arguments[1].position(), |                 arguments[1].position(), | ||||||
|                 invoking_node.function(), |                 invoking_node.function(), | ||||||
|                 NonnullRefPtrVector<AST::Node> { Vector<NonnullRefPtr<AST::Node>> { |                 NonnullRefPtrVector<AST::Node> { Vector<NonnullRefPtr<AST::Node>> { | ||||||
|                     arguments[0], |                     arguments[0], | ||||||
|                     AST::create<AST::SyntheticNode>(arguments[1].position(), NonnullRefPtr<AST::Value>(entry)), |                     AST::make_ref_counted<AST::SyntheticNode>(arguments[1].position(), NonnullRefPtr<AST::Value>(entry)), | ||||||
|                 } }, |                 } }, | ||||||
|                 arguments[1].position())); |                 arguments[1].position())); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return AST::create<AST::ListConcatenate>(invoking_node.position(), move(resulting_nodes)); |         return AST::make_ref_counted<AST::ListConcatenate>(invoking_node.position(), move(resulting_nodes)); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     if (auto list = dynamic_cast<AST::ListValue*>(value.ptr())) { |     if (auto list = dynamic_cast<AST::ListValue*>(value.ptr())) { | ||||||
|  | @ -337,7 +337,7 @@ RefPtr<AST::Node> Shell::immediate_split(AST::ImmediateExpression& invoking_node | ||||||
|     auto list = value->resolve_as_list(this); |     auto list = value->resolve_as_list(this); | ||||||
|     if (!value->is_list()) { |     if (!value->is_list()) { | ||||||
|         if (list.is_empty()) |         if (list.is_empty()) | ||||||
|             return AST::create<AST::ListConcatenate>(invoking_node.position(), NonnullRefPtrVector<AST::Node> {}); |             return AST::make_ref_counted<AST::ListConcatenate>(invoking_node.position(), NonnullRefPtrVector<AST::Node> {}); | ||||||
| 
 | 
 | ||||||
|         auto& value = list.first(); |         auto& value = list.first(); | ||||||
|         Vector<String> split_strings; |         Vector<String> split_strings; | ||||||
|  | @ -354,10 +354,10 @@ RefPtr<AST::Node> Shell::immediate_split(AST::ImmediateExpression& invoking_node | ||||||
|             for (auto& entry : split) |             for (auto& entry : split) | ||||||
|                 split_strings.append(entry); |                 split_strings.append(entry); | ||||||
|         } |         } | ||||||
|         return AST::create<AST::SyntheticNode>(invoking_node.position(), AST::create<AST::ListValue>(move(split_strings))); |         return AST::make_ref_counted<AST::SyntheticNode>(invoking_node.position(), AST::make_ref_counted<AST::ListValue>(move(split_strings))); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return transform(AST::create<AST::ListValue>(list)->values()); |     return transform(AST::make_ref_counted<AST::ListValue>(list)->values()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RefPtr<AST::Node> Shell::immediate_concat_lists(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | RefPtr<AST::Node> Shell::immediate_concat_lists(AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | ||||||
|  | @ -371,16 +371,16 @@ RefPtr<AST::Node> Shell::immediate_concat_lists(AST::ImmediateExpression& invoki | ||||||
|             auto list_of_values = const_cast<AST::Node&>(argument).run(this)->resolve_without_cast(this); |             auto list_of_values = const_cast<AST::Node&>(argument).run(this)->resolve_without_cast(this); | ||||||
|             if (auto* list = dynamic_cast<AST::ListValue*>(list_of_values.ptr())) { |             if (auto* list = dynamic_cast<AST::ListValue*>(list_of_values.ptr())) { | ||||||
|                 for (auto& entry : static_cast<Vector<NonnullRefPtr<AST::Value>>&>(list->values())) |                 for (auto& entry : static_cast<Vector<NonnullRefPtr<AST::Value>>&>(list->values())) | ||||||
|                     result.append(AST::create<AST::SyntheticNode>(argument.position(), entry)); |                     result.append(AST::make_ref_counted<AST::SyntheticNode>(argument.position(), entry)); | ||||||
|             } else { |             } else { | ||||||
|                 auto values = list_of_values->resolve_as_list(this); |                 auto values = list_of_values->resolve_as_list(this); | ||||||
|                 for (auto& entry : values) |                 for (auto& entry : values) | ||||||
|                     result.append(AST::create<AST::StringLiteral>(argument.position(), entry)); |                     result.append(AST::make_ref_counted<AST::StringLiteral>(argument.position(), entry)); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return AST::create<AST::ListConcatenate>(invoking_node.position(), move(result)); |     return AST::make_ref_counted<AST::ListConcatenate>(invoking_node.position(), move(result)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RefPtr<AST::Node> Shell::run_immediate_function(StringView str, AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | RefPtr<AST::Node> Shell::run_immediate_function(StringView str, AST::ImmediateExpression& invoking_node, const NonnullRefPtrVector<AST::Node>& arguments) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling