Skip to content

Commit f3d2b30

Browse files
committed
Tests for rename prepare and fix rename prepare across multiple files
1 parent 8db226c commit f3d2b30

File tree

2 files changed

+80
-20
lines changed

2 files changed

+80
-20
lines changed

apps/language_server/lib/language_server/providers/rename.ex

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do
6666
with %{
6767
begin: {start_line, start_col},
6868
end: {end_line, end_col},
69-
context: {context, char_ident}
70-
}
71-
when context in [:local_or_var, :local_call] <-
72-
Code.Fragment.surround_context(source_file.text, {line, character}) do
69+
char_ident: char_ident
70+
} = res
71+
when not is_nil(res) <-
72+
get_begin_end_and_char_ident(source_file.text, line, character) do
7373
%{
7474
range: adjust_range(start_line, start_col, end_line, end_col),
7575
placeholder: to_string(char_ident)
@@ -142,4 +142,18 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do
142142
_ -> nil
143143
end
144144
end
145+
146+
defp get_begin_end_and_char_ident(text, line, character) do
147+
case Code.Fragment.surround_context(text, {line, character}) do
148+
%{begin: begin, end: the_end, context: {context, char_ident}}
149+
when context in [:local_or_var, :local_call] ->
150+
%{begin: begin, end: the_end, char_ident: char_ident}
151+
152+
%{begin: begin, end: the_end, context: {:dot, _, char_ident}} ->
153+
%{begin: begin, end: the_end, char_ident: char_ident}
154+
155+
_ ->
156+
nil
157+
end
158+
end
145159
end

apps/language_server/test/providers/rename_test.exs

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,20 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
3636
# _a + b
3737
{line, char} = {3, 5}
3838

39+
source = %SourceFile{text: text, version: 0}
40+
target_range = %{line: 2, start_char: 4, end_char: 5}
41+
42+
Rename.prepare(source, @fake_uri, line, char)
43+
|> assert_prepare_range_and_placeholder_is(target_range, "a")
44+
3945
edits =
40-
Rename.rename(%SourceFile{text: text, version: 0}, @fake_uri, line, char, "test")
46+
Rename.rename(source, @fake_uri, line, char, "test")
4147
|> assert_return_structure_and_get_edits(@fake_uri, nil)
4248

4349
expected_edits =
4450
[
4551
%{line: 1, start_char: 10, end_char: 11},
46-
%{line: 2, start_char: 4, end_char: 5}
52+
target_range
4753
]
4854
|> get_expected_edits("test")
4955

@@ -62,9 +68,15 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
6268
# "Hello " <> ne_ma
6369
{line, char} = {3, 19}
6470

71+
source = %SourceFile{text: text, version: 0}
72+
target_range = %{line: 2, start_char: 16, end_char: 20}
73+
74+
Rename.prepare(source, @fake_uri, line, char)
75+
|> assert_prepare_range_and_placeholder_is(target_range, "nema")
76+
6577
edits =
6678
Rename.rename(
67-
%SourceFile{text: text, version: 0},
79+
source,
6880
@fake_uri,
6981
line,
7082
char,
@@ -75,7 +87,7 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
7587
expected_edits =
7688
[
7789
%{line: 1, start_char: 12, end_char: 16},
78-
%{line: 2, start_char: 16, end_char: 20}
90+
target_range
7991
]
8092
|> get_expected_edits("name")
8193

@@ -94,10 +106,15 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
94106

95107
# new = "#{original} + new stuff!"
96108
{line, char} = {3, 6}
109+
source = %SourceFile{text: text, version: 0}
110+
target_range = %{line: 2, start_char: 4, end_char: 12}
111+
112+
Rename.prepare(source, @fake_uri, line, char)
113+
|> assert_prepare_range_and_placeholder_is(target_range, "original")
97114

98115
edits =
99116
Rename.rename(
100-
%SourceFile{text: text, version: 0},
117+
source,
101118
@fake_uri,
102119
line,
103120
char,
@@ -107,7 +124,7 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
107124

108125
expected_edits =
109126
[
110-
%{line: 2, start_char: 4, end_char: 12},
127+
target_range,
111128
%{line: 3, start_char: 10, end_char: 18}
112129
]
113130
|> get_expected_edits("new_original")
@@ -120,14 +137,19 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
120137
test "subtract -> new_subtract" do
121138
file_path = FixtureHelpers.get_path("rename_example.ex")
122139
text = File.read!(file_path)
123-
uri = SourceFile.path_to_uri(file_path)
140+
uri = SourceFile.Path.to_uri(file_path)
124141

125142
# d = subtract(a, b)
126143
{line, char} = {6, 10}
144+
source = %SourceFile{text: text, version: 0}
145+
target_range = %{line: 5, start_char: 8, end_char: 16}
146+
147+
Rename.prepare(source, @fake_uri, line, char)
148+
|> assert_prepare_range_and_placeholder_is(target_range, "subtract")
127149

128150
edits =
129151
Rename.rename(
130-
%SourceFile{text: text, version: 0},
152+
source,
131153
uri,
132154
line,
133155
char,
@@ -137,7 +159,7 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
137159

138160
expected_edits =
139161
[
140-
%{line: 5, start_char: 8, end_char: 16},
162+
target_range,
141163
%{line: 13, start_char: 7, end_char: 15}
142164
]
143165
|> get_expected_edits("new_subtract")
@@ -148,14 +170,19 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
148170
test "rename function with multiple heads: add -> new_add" do
149171
file_path = FixtureHelpers.get_path("rename_example.ex")
150172
text = File.read!(file_path)
151-
uri = SourceFile.path_to_uri(file_path)
173+
uri = SourceFile.Path.to_uri(file_path)
152174

153175
# c = add(a, b)
154176
{line, char} = {5, 9}
177+
source = %SourceFile{text: text, version: 0}
178+
target_range = %{line: 4, start_char: 8, end_char: 11}
179+
180+
Rename.prepare(source, @fake_uri, line, char)
181+
|> assert_prepare_range_and_placeholder_is(target_range, "add")
155182

156183
edits =
157184
Rename.rename(
158-
%SourceFile{text: text, version: 0},
185+
source,
159186
uri,
160187
line,
161188
char,
@@ -165,7 +192,7 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
165192

166193
expected_edits =
167194
[
168-
%{line: 4, start_char: 8, end_char: 11},
195+
target_range,
169196
%{line: 6, start_char: 4, end_char: 7},
170197
%{line: 9, start_char: 7, end_char: 10},
171198
%{line: 10, start_char: 7, end_char: 10},
@@ -179,13 +206,17 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
179206
test "rename function defined in a different file ten -> new_ten" do
180207
file_path = FixtureHelpers.get_path("rename_example.ex")
181208
text = File.read!(file_path)
182-
uri = SourceFile.path_to_uri(file_path)
209+
uri = SourceFile.Path.to_uri(file_path)
183210

184211
fn_definition_file_uri =
185-
FixtureHelpers.get_path("rename_example_b.ex") |> SourceFile.path_to_uri()
212+
FixtureHelpers.get_path("rename_example_b.ex") |> SourceFile.Path.to_uri()
186213

187214
# b = ElixirLS.Test.RenameExampleB.ten()
188215
{line, char} = {4, 38}
216+
source = %SourceFile{text: text, version: 0}
217+
218+
Rename.prepare(source, uri, line, char)
219+
|> assert_prepare_range_and_placeholder_is(%{line: 3, start_char: 8, end_char: 40}, "ten")
189220

190221
assert {:ok,
191222
%{
@@ -207,7 +238,7 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
207238
]
208239
}} =
209240
Rename.rename(
210-
%SourceFile{text: text, version: 0},
241+
source,
211242
uri,
212243
line,
213244
char,
@@ -231,7 +262,7 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
231262
test "rename started with cursor at function definition" do
232263
file_path = FixtureHelpers.get_path("rename_example.ex")
233264
text = File.read!(file_path)
234-
uri = SourceFile.path_to_uri(file_path)
265+
uri = SourceFile.Path.to_uri(file_path)
235266

236267
# defp _handle_error({:ok, message})
237268
{line, char} = {4, 8}
@@ -301,4 +332,19 @@ defmodule ElixirLS.LanguageServer.Providers.RenameTest do
301332
defp sort_edit_by_start_line(edits) do
302333
Enum.sort(edits, &(&1["range"].start.line < &2["range"].start.line))
303334
end
335+
336+
defp assert_prepare_range_and_placeholder_is(
337+
prepare_result,
338+
%{line: line, start_char: start_char, end_char: end_char} = _expected_range,
339+
expected_placeholder
340+
) do
341+
assert {:ok,
342+
%{
343+
placeholder: expected_placeholder,
344+
range: %{
345+
start: %{line: line, character: start_char},
346+
end: %{line: line, character: end_char}
347+
}
348+
}} == prepare_result
349+
end
304350
end

0 commit comments

Comments
 (0)