Skip to content

Commit 87e7cb8

Browse files
committed
make more regexes unicode aware
attempt to fix a rare crash in complete when get_prefix would return invalid <<186>> which would later crash an exception was raised: ** (UnicodeConversionError) invalid encoding starting at <<186>> (elixir 1.14.3) <REDACTED: user-file-path>:2536: String.to_charlist_1 (elixir 1.14.3) <REDACTED: user-file-path>:795: Code.Fragment.last_line_1 (elixir 1.14.3) <REDACTED: user-file-path>:159: Code.Fragment.cursor_context_2
1 parent c7c1378 commit 87e7cb8

File tree

11 files changed

+28
-28
lines changed

11 files changed

+28
-28
lines changed

apps/language_server/lib/language_server/diagnostics.ex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ defmodule ElixirLS.LanguageServer.Diagnostics do
9292
end
9393

9494
defp split_type_and_message(message) do
95-
case Regex.run(~r/^\*\* \(([\w\.]+?)?\) (.*)/s, message) do
95+
case Regex.run(~r/^\*\* \(([\w\.]+?)?\) (.*)/su, message) do
9696
[_, type, rest] ->
9797
{type, rest}
9898

@@ -121,7 +121,7 @@ defmodule ElixirLS.LanguageServer.Diagnostics do
121121
end
122122

123123
defp get_message_parts(message) do
124-
case Regex.run(~r/^(.*?):(\d+)(:(\d+))?: (.*)/s, message) do
124+
case Regex.run(~r/^(.*?):(\d+)(:(\d+))?: (.*)/su, message) do
125125
[_, file, line, _, column, description] -> {file, line, column, description}
126126
_ -> nil
127127
end
@@ -151,8 +151,8 @@ defmodule ElixirLS.LanguageServer.Diagnostics do
151151
end
152152

153153
defp is_stack?(" " <> str) do
154-
Regex.match?(~r/.*\.(ex|erl):\d+: /, str) ||
155-
Regex.match?(~r/.*expanding macro: /, str)
154+
Regex.match?(~r/.*\.(ex|erl):\d+: /u, str) ||
155+
Regex.match?(~r/.*expanding macro: /u, str)
156156
end
157157

158158
defp is_stack?(_) do
@@ -161,7 +161,7 @@ defmodule ElixirLS.LanguageServer.Diagnostics do
161161

162162
defp extract_line_from_missing_hint(message) do
163163
case Regex.run(
164-
~r/HINT: it looks like the .+ on line (\d+) does not have a matching /,
164+
~r/HINT: it looks like the .+ on line (\d+) does not have a matching /u,
165165
message
166166
) do
167167
[_, line] -> String.to_integer(line)
@@ -172,7 +172,7 @@ defmodule ElixirLS.LanguageServer.Diagnostics do
172172
defp extract_line_from_stacktrace(file, stacktrace) do
173173
Enum.find_value(stacktrace, fn stack_item ->
174174
with [_, _, file_relative, line] <-
175-
Regex.run(~r/(\(.+?\)\s+)?(.*\.ex):(\d+): /, stack_item),
175+
Regex.run(~r/(\(.+?\)\s+)?(.*\.ex):(\d+): /u, stack_item),
176176
true <- String.ends_with?(file, file_relative) do
177177
String.to_integer(line)
178178
else

apps/language_server/lib/language_server/dialyzer.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ defmodule ElixirLS.LanguageServer.Dialyzer do
585585

586586
defp dialyzer_raw_warning_message(raw_warning) do
587587
message = String.trim(to_string(:dialyzer.format_warning(raw_warning)))
588-
Regex.replace(~r/^.*:\d+: /, message, "")
588+
Regex.replace(~r/^.*:\d+: /u, message, "")
589589
end
590590

591591
# Because mtime-based stale-checking has 1-second granularity, we err on the side of

apps/language_server/lib/language_server/erlang_source_file.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ defmodule ElixirLS.LanguageServer.ErlangSourceFile do
2020
end
2121

2222
def module_line(file) do
23-
find_line_by_regex(file, ~r/^-module/)
23+
find_line_by_regex(file, ~r/^-module/u)
2424
end
2525

2626
def function_line(file, function) do
@@ -30,7 +30,7 @@ defmodule ElixirLS.LanguageServer.ErlangSourceFile do
3030
|> Atom.to_string()
3131
|> Regex.escape()
3232

33-
find_line_by_regex(file, ~r/^#{escaped}\b/)
33+
find_line_by_regex(file, ~r/^#{escaped}\b/u)
3434
end
3535

3636
defp find_line_by_regex(file, regex) do

apps/language_server/lib/language_server/markdown_utils.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule ElixirLS.LanguageServer.MarkdownUtils do
22
# Find the lowest heading level in the fragment
33
defp lowest_heading_level(fragment) do
4-
case Regex.scan(~r/(#+)/, fragment) do
4+
case Regex.scan(~r/(#+)/u, fragment) do
55
[] ->
66
nil
77

@@ -19,7 +19,7 @@ defmodule ElixirLS.LanguageServer.MarkdownUtils do
1919
if min_level do
2020
level_difference = base_level + 1 - min_level
2121

22-
Regex.replace(~r/(#+)/, fragment, fn _, capture ->
22+
Regex.replace(~r/(#+)/u, fragment, fn _, capture ->
2323
adjusted_level = String.length(capture) + level_difference
2424
String.duplicate("#", adjusted_level)
2525
end)

apps/language_server/lib/language_server/mix_tasks/format.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,7 @@ defmodule Mix.Tasks.ElixirLSFormat do
920920

921921
if space? do
922922
str
923-
|> String.split(~r/[\t\s]+/, include_captures: true)
923+
|> String.split(~r/[\t\s]+/u, include_captures: true)
924924
|> Enum.map(fn
925925
<<start::binary-size(1), _::binary>> = str when start in ["\t", "\s"] ->
926926
IO.ANSI.format([color[:space], str])

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
@@ -27,7 +27,7 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.Test.DescribeBlock do
2727

2828
defp get_name(source_lines, declaration_line) do
2929
%{"name" => name} =
30-
~r/^\s*describe "(?<name>.*)" do/
30+
~r/^\s*describe "(?<name>.*)" do/u
3131
|> Regex.named_captures(Enum.at(source_lines, declaration_line - 1))
3232

3333
name

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
120120

121121
def_before =
122122
cond do
123-
Regex.match?(~r/(defdelegate|defp?)\s*#{prefix}$/, text_before_cursor) ->
123+
Regex.match?(~r/(defdelegate|defp?)\s*#{prefix}$/u, text_before_cursor) ->
124124
:def
125125

126126
Regex.match?(
127-
~r/(defguardp?|defmacrop?)\s*#{prefix}$/,
127+
~r/(defguardp?|defmacrop?)\s*#{prefix}$/u,
128128
text_before_cursor
129129
) ->
130130
:defmacro
@@ -138,7 +138,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
138138
|> Enum.slice(0..(line - 1))
139139
|> Enum.reverse()
140140
|> Enum.find_value(0, fn line_text ->
141-
if Regex.match?(~r/(?<=\s|^)do\s*(#.*)?$/, line_text) do
141+
if Regex.match?(~r/(?<=\s|^)do\s*(#.*)?$/u, line_text) do
142142
String.length(line_text) - String.length(String.trim_leading(line_text))
143143
end
144144
end)
@@ -151,8 +151,8 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
151151
prefix: prefix,
152152
remote_calls?: match?({:dot, _, _}, Code.Fragment.cursor_context(prefix)),
153153
def_before: def_before,
154-
pipe_before?: Regex.match?(~r/\|>\s*#{prefix}$/, text_before_cursor),
155-
capture_before?: Regex.match?(~r/&#{prefix}$/, text_before_cursor),
154+
pipe_before?: Regex.match?(~r/\|>\s*#{prefix}$/u, text_before_cursor),
155+
capture_before?: Regex.match?(~r/&#{prefix}$/u, text_before_cursor),
156156
scope: scope,
157157
module: env.module,
158158
line: line,
@@ -221,7 +221,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
221221

222222
defp maybe_add_do(completion_items, context) do
223223
hint =
224-
case Regex.scan(~r/(?<=\s|^)[a-z]+$/, context.text_before_cursor) do
224+
case Regex.scan(~r/(?<=\s|^)[a-z]+$/u, context.text_before_cursor) do
225225
[] -> ""
226226
[[match]] -> match
227227
end
@@ -247,7 +247,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
247247

248248
defp maybe_add_keywords(completion_items, context) do
249249
hint =
250-
case Regex.scan(~r/(?<=\s|^)[a-z]+$/, context.text_before_cursor) do
250+
case Regex.scan(~r/(?<=\s|^)[a-z]+$/u, context.text_before_cursor) do
251251
[] -> ""
252252
[[match]] -> match
253253
end
@@ -1113,7 +1113,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
11131113
end
11141114

11151115
defp get_prefix(text_before_cursor) do
1116-
regex = ~r/[\w0-9\._!\?\:@\->]+$/
1116+
regex = ~r/[\w0-9\._!\?\:@\->]+$/u
11171117

11181118
case Regex.run(regex, text_before_cursor) do
11191119
[prefix] -> prefix
@@ -1343,7 +1343,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
13431343
end
13441344

13451345
defp snippet?(item) do
1346-
item.kind == :snippet || String.match?(item.insert_text, ~r/\${?\d/)
1346+
item.kind == :snippet || String.match?(item.insert_text, ~r/\${?\d/u)
13471347
end
13481348

13491349
# As defined by CompletionItemTag in https://microsoft.github.io/language-server-protocol/specifications/specification-current/

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
@@ -49,7 +49,7 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.ApplySpec do
4949
end
5050

5151
cur_line = Enum.at(SourceFile.lines(cur_text), line - 1)
52-
[indentation] = Regex.run(~r/^\s*/, cur_line)
52+
[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
5555
# line if anything fails

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.ManipulatePipes do
337337
|> String.reverse()
338338
|> String.graphemes()
339339
|> Enum.reduce_while([], fn c, acc ->
340-
if String.match?(c, ~r/[\s\(\[\{]/) do
340+
if String.match?(c, ~r/[\s\(\[\{]/u) do
341341
{:halt, acc}
342342
else
343343
{:cont, [c | acc]}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ defmodule ElixirLS.LanguageServer.Providers.OnTypeFormatting do
5757
end
5858

5959
defp tokens(line) do
60-
Regex.scan(~r/(?:->)|(?:[\w\:]+)/, line) |> List.flatten()
60+
Regex.scan(~r/(?:->)|(?:[\w\:]+)/u, line) |> List.flatten()
6161
end
6262

6363
defp indentation(line) do
64-
[indentation] = Regex.run(~r/^\s*/, line)
64+
[indentation] = Regex.run(~r/^\s*/u, line)
6565
indentation
6666
end
6767

0 commit comments

Comments
 (0)