Skip to content

Commit 3223c02

Browse files
committed
be more safe with line splitting
1 parent 4fa9d7a commit 3223c02

File tree

9 files changed

+17
-17
lines changed

9 files changed

+17
-17
lines changed

apps/debug_adapter/lib/debug_adapter/server.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1471,7 +1471,7 @@ defmodule ElixirLS.DebugAdapter.Server do
14711471
line =
14721472
text
14731473
|> String.split(["\r\n", "\n", "\r"])
1474-
|> Enum.at(line)
1474+
|> Enum.at(line, "")
14751475

14761476
# It is measured in UTF-16 code units and the client capability
14771477
# `columnsStartAt1` determines whether it is 0- or 1-based.

apps/language_server/lib/language_server/providers/code_lens/test.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.Test do
9292

9393
test_name =
9494
source_lines
95-
|> Enum.at(line - 1)
95+
|> Enum.at(line - 1, "")
9696
|> String.trim()
9797
|> case do
9898
"test " <> rest ->

apps/language_server/lib/language_server/providers/code_lens/test/describe_block.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.Test.DescribeBlock do
3030
defp get_name(source_lines, declaration_line) do
3131
case Regex.named_captures(
3232
~r/^\s*describe "(?<name>.*)" do/u,
33-
Enum.at(source_lines, declaration_line - 1)
33+
Enum.at(source_lines, declaration_line - 1, "")
3434
) do
3535
%{"name" => name} ->
3636
name

apps/language_server/lib/language_server/providers/completion.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
126126
options
127127
) do
128128
lines = SourceFile.lines(text)
129-
line_text = Enum.at(lines, line - 1)
129+
line_text = Enum.at(lines, line - 1, "")
130130

131131
text_before_cursor = String.slice(line_text, 0, character - 1)
132132
text_after_cursor = String.slice(line_text, (character - 1)..-1//1)
@@ -187,7 +187,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
187187
{_, meta, _} when is_list(meta) ->
188188
if Keyword.has_key?(meta, :do) do
189189
line = Keyword.fetch!(meta, :line)
190-
line_text = Enum.at(lines, line - 1)
190+
line_text = Enum.at(lines, line - 1, "")
191191
String.length(line_text) - String.length(String.trim_leading(line_text))
192192
end
193193

apps/language_server/lib/language_server/providers/document_symbols.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ defmodule ElixirLS.LanguageServer.Providers.DocumentSymbols do
508508
if parent_end_line > parent_do_line do
509509
# take end location from parent and assume end_of_expression is last char in previous line
510510
end_of_expression =
511-
(Enum.at(lines, max(parent_end_line - 2, 0)) || "")
511+
Enum.at(lines, max(parent_end_line - 2, 0), "")
512512
|> String.length()
513513

514514
SourceFile.elixir_position_to_lsp(
@@ -517,7 +517,7 @@ defmodule ElixirLS.LanguageServer.Providers.DocumentSymbols do
517517
)
518518
else
519519
# take end location from parent and assume end_of_expression is last char before final ; trimmed
520-
line = Enum.at(lines, parent_end_line - 1)
520+
line = Enum.at(lines, parent_end_line - 1, "")
521521
parent_end_column = location[:parent_location][:end][:column]
522522

523523
end_of_expression =

apps/language_server/lib/language_server/providers/execute_command/apply_spec.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.ApplySpec do
4848
end
4949

5050
if line do
51-
cur_line = Enum.at(SourceFile.lines(cur_text), line - 1)
51+
cur_line = Enum.at(SourceFile.lines(cur_text), line - 1, "")
5252
[indentation] = Regex.run(~r/^\s*/u, cur_line)
5353

5454
# Attempt to format to fit within the preferred line length, fallback to having it all on one

apps/language_server/lib/language_server/providers/hover.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ defmodule ElixirLS.LanguageServer.Providers.Hover do
3232
def build_range(lines, %{begin: {begin_line, begin_char}, end: {end_line, end_char}}) do
3333
range(
3434
begin_line - 1,
35-
SourceFile.elixir_character_to_lsp(lines |> Enum.at(begin_line - 1), begin_char),
35+
SourceFile.elixir_character_to_lsp(lines |> Enum.at(begin_line - 1, ""), begin_char),
3636
end_line - 1,
37-
SourceFile.elixir_character_to_lsp(lines |> Enum.at(end_line - 1), end_char)
37+
SourceFile.elixir_character_to_lsp(lines |> Enum.at(end_line - 1, ""), end_char)
3838
)
3939
end
4040

apps/language_server/lib/language_server/providers/on_type_formatting.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ defmodule ElixirLS.LanguageServer.Providers.OnTypeFormatting do
3636
end
3737

3838
# Apply the proposed change to the current text so we can see if it fixes terminators
39-
insert_on_next_line? = blank?(Enum.at(lines, line)) and line != Enum.count(lines) - 1
39+
insert_on_next_line? = blank?(Enum.at(lines, line, "")) and line != Enum.count(lines) - 1
4040
{range, new_text} = insert_end_edit(prev_indentation, line, character, insert_on_next_line?)
4141
edited_text = SourceFile.apply_edit(source_file.text, range, new_text)
4242

apps/language_server/lib/language_server/providers/selection_ranges.ex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ defmodule ElixirLS.LanguageServer.Providers.SelectionRanges do
157157
# ^
158158
[outer_range | acc]
159159
else
160-
line_length = lines |> Enum.at(end_line - 1) |> String.length()
160+
line_length = lines |> Enum.at(end_line - 1, "") |> String.length()
161161
inner_range = range(start_line + 1, 0, end_line - 1, line_length)
162162

163163
find_stop_token_range(stop_tokens_in_pair, pair, inner_range, line, character) ++
@@ -262,8 +262,8 @@ defmodule ElixirLS.LanguageServer.Providers.SelectionRanges do
262262
cell_pairs,
263263
(start_line < line or (start_line == line and start_character <= character)) and
264264
end_line > line do
265-
line_length = lines |> Enum.at(end_line - 1) |> String.length()
266-
second_line = lines |> Enum.at(start_line + 1)
265+
line_length = lines |> Enum.at(end_line - 1, "") |> String.length()
266+
second_line = lines |> Enum.at(start_line + 1, "")
267267

268268
second_line_indent =
269269
String.length(second_line) - String.length(String.trim_leading(second_line))
@@ -308,19 +308,19 @@ defmodule ElixirLS.LanguageServer.Providers.SelectionRanges do
308308
(end_line > line or (end_line == line and end_line_start_character <= character)) do
309309
case group do
310310
[_] ->
311-
line_length = lines |> Enum.at(start_line) |> String.length()
311+
line_length = lines |> Enum.at(start_line, "") |> String.length()
312312
full_line_range = range(start_line, 0, start_line, line_length)
313313
[full_line_range, range(start_line, start_character, start_line, line_length)]
314314

315315
_ ->
316-
end_line_length = lines |> Enum.at(end_line) |> String.length()
316+
end_line_length = lines |> Enum.at(end_line, "") |> String.length()
317317
full_block_full_line_range = range(start_line, 0, end_line, end_line_length)
318318
full_block_range = range(start_line, start_character, end_line, end_line_length)
319319

320320
[full_block_full_line_range, full_block_range] ++
321321
Enum.find_value(group, fn {{cursor_line, cursor_line_character}, _} ->
322322
if cursor_line == line do
323-
cursor_line_length = lines |> Enum.at(cursor_line) |> String.length()
323+
cursor_line_length = lines |> Enum.at(cursor_line, "") |> String.length()
324324

325325
line_range =
326326
range(

0 commit comments

Comments
 (0)