Skip to content

Commit 3a4d3dc

Browse files
committed
parse untitled files basing on language_id from editor
1 parent 76302b2 commit 3a4d3dc

File tree

1 file changed

+18
-19
lines changed
  • apps/language_server/lib/language_server

1 file changed

+18
-19
lines changed

apps/language_server/lib/language_server/parser.ex

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ defmodule ElixirLS.LanguageServer.Parser do
4646
{:ok, %{files: %{}, debounce_refs: %{}}}
4747
end
4848

49+
# TODO terminate
50+
4951
@impl true
5052
def handle_cast({:closed, uri}, state = %{files: files, debounce_refs: debounce_refs}) do
5153
{maybe_ref, updated_debounce_refs} = Map.pop(debounce_refs, uri)
@@ -58,8 +60,7 @@ defmodule ElixirLS.LanguageServer.Parser do
5860
end
5961

6062
def handle_cast({:parse_with_debounce, uri, source_file}, state) do
61-
# TODO check source_file.language_id
62-
state = if String.ends_with?(uri, [".ex", ".exs", ".eex"]) do
63+
state = if should_parse?(uri, source_file) do
6364
state = update_in(state.debounce_refs[uri], fn old_ref ->
6465
if old_ref do
6566
Process.cancel_timer(old_ref, info: false)
@@ -80,7 +81,7 @@ defmodule ElixirLS.LanguageServer.Parser do
8081
}
8182
end)
8283
else
83-
Logger.debug("Not parsing #{uri} with debounce")
84+
Logger.debug("Not parsing #{uri} with debounce: languageId #{source_file.language_id}")
8485
state
8586
end
8687

@@ -89,7 +90,7 @@ defmodule ElixirLS.LanguageServer.Parser do
8990

9091
@impl true
9192
def handle_call({:parse_immediate, uri, source_file}, _from, %{files: files, debounce_refs: debounce_refs} = state) do
92-
{reply, state} = if String.ends_with?(uri, [".ex", ".exs", ".eex"]) do
93+
{reply, state} = if should_parse?(uri, source_file) do
9394
{maybe_ref, updated_debounce_refs} = Map.pop(debounce_refs, uri)
9495
if maybe_ref do
9596
Process.cancel_timer(maybe_ref, info: false)
@@ -103,7 +104,7 @@ defmodule ElixirLS.LanguageServer.Parser do
103104
# current version already parsed
104105
{file, state}
105106
_other ->
106-
Logger.debug("Parsing #{uri} immediately")
107+
Logger.debug("Parsing #{uri} immediately: languageId #{source_file.language_id}")
107108
# overwrite everything
108109
file = %Context{
109110
source_file: source_file,
@@ -119,7 +120,7 @@ defmodule ElixirLS.LanguageServer.Parser do
119120
{file, state}
120121
end
121122
else
122-
Logger.debug("Not parsing #{uri} immediately")
123+
Logger.debug("Not parsing #{uri} immediately: languageId #{source_file.language_id}")
123124
# not parsing - respond with empty struct
124125
reply = %Context{
125126
source_file: source_file,
@@ -136,9 +137,10 @@ defmodule ElixirLS.LanguageServer.Parser do
136137
{:parse_file, uri},
137138
%{files: files, debounce_refs: debounce_refs} = state
138139
) do
139-
Logger.debug("Parsing #{uri} after debounce")
140+
file = Map.fetch!(files, uri)
141+
Logger.debug("Parsing #{uri} after debounce: languageId #{file.source_file.language_id}")
140142

141-
updated_file = Map.fetch!(files, uri)
143+
updated_file = file
142144
|> do_parse()
143145

144146
updated_files = Map.put(files, uri, updated_file)
@@ -150,8 +152,12 @@ defmodule ElixirLS.LanguageServer.Parser do
150152
{:noreply, state}
151153
end
152154

155+
defp should_parse?(uri, source_file) do
156+
String.ends_with?(uri, [".ex", ".exs", ".eex"]) or source_file.language_id in ["elixir", "eex", "html-eex"]
157+
end
158+
153159
defp do_parse(%Context{source_file: source_file, path: path} = file) do
154-
{ast, diagnostics} = parse_file(source_file.text, path)
160+
{ast, diagnostics} = parse_file(source_file.text, path, source_file.language_id)
155161

156162
metadata = if ast do
157163
acc = MetadataBuilder.build(ast)
@@ -170,11 +176,7 @@ defmodule ElixirLS.LanguageServer.Parser do
170176
case uri do
171177
"file:" <> _ -> SourceFile.Path.from_uri(uri)
172178
_ ->
173-
# TODO think if this is sane
174-
extension = uri
175-
|> String.split(".")
176-
|> List.last
177-
"nofile." <> extension
179+
"nofile"
178180
end
179181
end
180182

@@ -184,10 +186,7 @@ defmodule ElixirLS.LanguageServer.Parser do
184186
|> Server.parser_finished()
185187
end
186188

187-
188-
# TODO uri instead of file?
189-
# defp parse_file(_text, nil), do: {nil, []}
190-
defp parse_file(text, file) do
189+
defp parse_file(text, file, language_id) do
191190
{result, raw_diagnostics} =
192191
Build.with_diagnostics([log: false], fn ->
193192
try do
@@ -196,7 +195,7 @@ defmodule ElixirLS.LanguageServer.Parser do
196195
columns: true
197196
]
198197

199-
ast = if String.ends_with?(file, ".eex") do
198+
ast = if is_binary(file) and String.ends_with?(file, ".eex") or language_id in ["eex", "html-eex"] do
200199
EEx.compile_string(text,
201200
file: file,
202201
parser_options: parser_options

0 commit comments

Comments
 (0)