diff --git a/Userland/Shell/PosixLexer.cpp b/Userland/Shell/PosixLexer.cpp index 1a0e82f35e..fb63375a8a 100644 --- a/Userland/Shell/PosixLexer.cpp +++ b/Userland/Shell/PosixLexer.cpp @@ -41,7 +41,7 @@ ErrorOr> Lexer::batch_next(Optional starting_reduction) ExpansionRange Lexer::range(ssize_t offset) const { return { - m_state.position.end_offset - m_state.position.start_offset + offset - 1, + m_state.position.end_offset - m_state.position.start_offset + offset, 0, }; } @@ -358,15 +358,15 @@ ErrorOr Lexer::reduce_double_quoted_string() }; case '$': if (m_lexer.next_is("(")) - m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range() }); + m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range(-1) }); else - m_state.expansions.empend(ParameterExpansion { .parameter = StringBuilder {}, .range = range() }); + m_state.expansions.empend(ParameterExpansion { .parameter = StringBuilder {}, .range = range(-1) }); return ReductionResult { .tokens = {}, .next_reduction = Reduction::Expansion, }; case '`': - m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range() }); + m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range(-1) }); return ReductionResult { .tokens = {}, .next_reduction = Reduction::CommandExpansion, @@ -498,9 +498,9 @@ ErrorOr Lexer::reduce_heredoc_contents() if (!m_state.escaping && consume_specific('$')) { m_state.buffer.append('$'); if (m_lexer.next_is("(")) - m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range() }); + m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range(-1) }); else - m_state.expansions.empend(ParameterExpansion { .parameter = StringBuilder {}, .range = range() }); + m_state.expansions.empend(ParameterExpansion { .parameter = StringBuilder {}, .range = range(-1) }); return ReductionResult { .tokens = {}, @@ -510,7 +510,7 @@ ErrorOr Lexer::reduce_heredoc_contents() if (!m_state.escaping && consume_specific('`')) { m_state.buffer.append('`'); - m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range() }); + m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range(-1) }); return ReductionResult { .tokens = {}, .next_reduction = Reduction::CommandExpansion, @@ -682,9 +682,9 @@ ErrorOr Lexer::reduce_start() if (!m_state.escaping && consume_specific('$')) { m_state.buffer.append('$'); if (m_lexer.next_is("(")) - m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range() }); + m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range(-1) }); else - m_state.expansions.empend(ParameterExpansion { .parameter = StringBuilder {}, .range = range() }); + m_state.expansions.empend(ParameterExpansion { .parameter = StringBuilder {}, .range = range(-1) }); return ReductionResult { .tokens = {}, @@ -694,7 +694,7 @@ ErrorOr Lexer::reduce_start() if (!m_state.escaping && consume_specific('`')) { m_state.buffer.append('`'); - m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range() }); + m_state.expansions.empend(CommandExpansion { .command = StringBuilder {}, .range = range(-1) }); return ReductionResult { .tokens = {}, .next_reduction = Reduction::CommandExpansion, @@ -749,7 +749,7 @@ ErrorOr Lexer::reduce_special_parameter_expansion() m_state.buffer.append(ch); m_state.expansions.last() = ParameterExpansion { .parameter = StringBuilder {}, - .range = range(-1), + .range = range(-2), }; auto& expansion = m_state.expansions.last().get(); expansion.parameter.append(ch); diff --git a/Userland/Shell/PosixParser.cpp b/Userland/Shell/PosixParser.cpp index 4659ce76ed..68e4a51f59 100644 --- a/Userland/Shell/PosixParser.cpp +++ b/Userland/Shell/PosixParser.cpp @@ -417,7 +417,7 @@ Vector Parser::perform_expansions(Vector tokens) } return ResolvedParameterExpansion { - .parameter = {}, + .parameter = String::from_code_point(text[0]), .argument = {}, .range = expansion.range, .op = op,