Skip to content

Commit a1147df

Browse files
committed
use parser contest in test code lens
1 parent 0d846b4 commit a1147df

File tree

4 files changed

+95
-113
lines changed

4 files changed

+95
-113
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens do
1313
def spec_code_lens(server_instance_id, uri, text),
1414
do: CodeLens.TypeSpec.code_lens(server_instance_id, uri, text)
1515

16-
def test_code_lens(uri, text, project_dir), do: CodeLens.Test.code_lens(uri, text, project_dir)
16+
def test_code_lens(parser_context, project_dir),
17+
do: CodeLens.Test.code_lens(parser_context, project_dir)
1718

1819
def build_code_lens(line, title, command, argument) do
1920
%{

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

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,39 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.Test do
1212
alias ElixirLS.LanguageServer.Providers.CodeLens.Test.DescribeBlock
1313
alias ElixirLS.LanguageServer.Providers.CodeLens.Test.TestBlock
1414
alias ElixirLS.LanguageServer.SourceFile
15-
alias ElixirSense.Core.Parser
15+
alias ElixirLS.LanguageServer.Parser
1616

1717
@run_test_command "elixir.lens.test.run"
1818

19-
def code_lens(uri = "file:" <> _, text, project_dir) do
20-
with {:ok, buffer_file_metadata} <- parse_source(text) do
21-
source_lines = SourceFile.lines(text)
19+
def code_lens(
20+
%Parser.Context{source_file: source_file, metadata: metadata, path: path},
21+
project_dir
22+
) do
23+
source_lines = SourceFile.lines(source_file)
2224

23-
file_path = SourceFile.Path.from_uri(uri)
25+
calls_list =
26+
metadata.calls
27+
|> Enum.map(fn {_k, v} -> v end)
28+
|> List.flatten()
2429

25-
calls_list =
26-
buffer_file_metadata.calls
27-
|> Enum.map(fn {_k, v} -> v end)
28-
|> List.flatten()
30+
lines_to_env_list =
31+
metadata.lines_to_env
32+
|> Enum.sort_by(&elem(&1, 0))
2933

30-
lines_to_env_list =
31-
buffer_file_metadata.lines_to_env
32-
|> Enum.sort_by(&elem(&1, 0))
34+
describe_blocks = find_describe_blocks(lines_to_env_list, calls_list, source_lines)
35+
describe_lenses = get_describe_lenses(describe_blocks, path, project_dir)
3336

34-
describe_blocks = find_describe_blocks(lines_to_env_list, calls_list, source_lines)
35-
describe_lenses = get_describe_lenses(describe_blocks, file_path, project_dir)
37+
test_lenses =
38+
lines_to_env_list
39+
|> find_test_blocks(calls_list, describe_blocks, source_lines)
40+
|> get_test_lenses(path, project_dir)
3641

37-
test_lenses =
38-
lines_to_env_list
39-
|> find_test_blocks(calls_list, describe_blocks, source_lines)
40-
|> get_test_lenses(file_path, project_dir)
42+
module_lenses =
43+
lines_to_env_list
44+
|> get_test_modules()
45+
|> get_module_lenses(path, project_dir)
4146

42-
module_lenses =
43-
lines_to_env_list
44-
|> get_test_modules()
45-
|> get_module_lenses(file_path, project_dir)
46-
47-
{:ok, test_lenses ++ describe_lenses ++ module_lenses}
48-
end
47+
{:ok, test_lenses ++ describe_lenses ++ module_lenses}
4948
end
5049

5150
defp get_test_lenses(test_blocks, file_path, project_dir) do
@@ -154,16 +153,4 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.Test do
154153
call_info.position
155154
end
156155
end
157-
158-
defp parse_source(text) do
159-
buffer_file_metadata =
160-
text
161-
|> Parser.parse_string(true, true, {1, 1})
162-
163-
if buffer_file_metadata.error != nil do
164-
{:error, buffer_file_metadata}
165-
else
166-
{:ok, buffer_file_metadata}
167-
end
168-
end
169156
end

apps/language_server/lib/language_server/server.ex

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,17 +1127,10 @@ defmodule ElixirLS.LanguageServer.Server do
11271127
source_file = get_source_file(state, uri)
11281128

11291129
fun = fn ->
1130+
parser_context = Parser.parse_immediate(uri, source_file)
11301131
{:ok, spec_code_lenses} = get_spec_code_lenses(state, uri, source_file)
11311132

1132-
test_code_lenses =
1133-
case get_test_code_lenses(state, uri, source_file) do
1134-
{:ok, test_code_lenses} ->
1135-
test_code_lenses
1136-
1137-
{:error, %ElixirSense.Core.Metadata{error: reason}} ->
1138-
Logger.info("Error while building test code lenses: #{inspect(reason)}")
1139-
[]
1140-
end
1133+
{:ok, test_code_lenses} = get_test_code_lenses(state, uri, parser_context)
11411134

11421135
{:ok, spec_code_lenses ++ test_code_lenses}
11431136
end
@@ -1252,7 +1245,7 @@ defmodule ElixirLS.LanguageServer.Server do
12521245
defp get_test_code_lenses(
12531246
state = %__MODULE__{project_dir: project_dir},
12541247
"file:" <> _ = uri,
1255-
source_file,
1248+
parser_context,
12561249
true = _umbrella
12571250
)
12581251
when is_binary(project_dir) do
@@ -1266,7 +1259,7 @@ defmodule ElixirLS.LanguageServer.Server do
12661259

12671260
{app, app_path} ->
12681261
if is_test_file?(file_path, state, app, app_path) do
1269-
CodeLens.test_code_lens(uri, source_file.text, Path.join(project_dir, app_path))
1262+
CodeLens.test_code_lens(parser_context, Path.join(project_dir, app_path))
12701263
else
12711264
{:ok, []}
12721265
end
@@ -1276,15 +1269,15 @@ defmodule ElixirLS.LanguageServer.Server do
12761269
defp get_test_code_lenses(
12771270
%__MODULE__{project_dir: project_dir},
12781271
"file:" <> _ = uri,
1279-
source_file,
1272+
parser_context,
12801273
false = _umbrella
12811274
)
12821275
when is_binary(project_dir) do
12831276
try do
12841277
file_path = SourceFile.Path.from_uri(uri)
12851278

12861279
if is_test_file?(file_path, project_dir) do
1287-
CodeLens.test_code_lens(uri, source_file.text, project_dir)
1280+
CodeLens.test_code_lens(parser_context, project_dir)
12881281
else
12891282
{:ok, []}
12901283
end
@@ -1293,7 +1286,7 @@ defmodule ElixirLS.LanguageServer.Server do
12931286
end
12941287
end
12951288

1296-
defp get_test_code_lenses(%__MODULE__{}, _uri, _source_file, _), do: {:ok, []}
1289+
defp get_test_code_lenses(%__MODULE__{}, _uri, _parser_context, _), do: {:ok, []}
12971290

12981291
defp is_test_file?(file_path, state = %__MODULE__{project_dir: project_dir}, app, app_path)
12991292
when is_binary(project_dir) do

0 commit comments

Comments
 (0)