From 737dd2a56589a1384410ab59e4e3143f87b2f055 Mon Sep 17 00:00:00 2001 From: Lukasz Samson Date: Wed, 3 Feb 2021 11:29:46 +0100 Subject: [PATCH] Skip non file: URI scheme notifications file watcher receives them in some cases those notifications should not trigger build we are also unable to update dirty flag Fixes #474 --- apps/language_server/lib/language_server/server.ex | 9 +++++++-- apps/language_server/test/server_test.exs | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index 83e0390c7..fea5d443b 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -390,9 +390,13 @@ defmodule ElixirLS.LanguageServer.Server do end defp handle_notification(did_change_watched_files(changes), state) do + changes = Enum.filter(changes, &match?(%{"uri" => "file:" <> _}, &1)) + needs_build = - Enum.any?(changes, fn %{"uri" => uri, "type" => type} -> - Path.extname(uri) in @watched_extensions and + Enum.any?(changes, fn %{"uri" => uri = "file:" <> _, "type" => type} -> + path = SourceFile.path_from_uri(uri) + + Path.extname(path) in @watched_extensions and (type in [1, 3] or not Map.has_key?(state.source_files, uri) or state.source_files[uri].dirty?) end) @@ -422,6 +426,7 @@ defmodule ElixirLS.LanguageServer.Server do end _ -> + # file not open or not dirty acc end end) diff --git a/apps/language_server/test/server_test.exs b/apps/language_server/test/server_test.exs index b71818370..62fe29f7d 100644 --- a/apps/language_server/test/server_test.exs +++ b/apps/language_server/test/server_test.exs @@ -629,6 +629,18 @@ defmodule ElixirLS.LanguageServer.ServerTest do state = :sys.get_state(server) assert state.needs_build? end + + test "gracefully skip not supported URI scheme", %{server: server} do + uri = "git://github.com/user/repo.git" + fake_initialize(server) + + Server.receive_packet( + server, + did_change_watched_files([%{"uri" => uri, "type" => 2}]) + ) + + :sys.get_state(server) + end end test "hover", %{server: server} do