From d0e0340f0ccd88ec0ecd20f005748ef7f11cb586 Mon Sep 17 00:00:00 2001 From: Mitchell Hanberg Date: Sun, 30 Jul 2023 22:32:32 -0400 Subject: [PATCH] fix: clear out references when saving a file (#134) --- lib/next_ls.ex | 11 +++- lib/next_ls/definition.ex | 85 ++++++++++++++++--------------- lib/next_ls/runtime.ex | 3 +- lib/next_ls/runtime/supervisor.ex | 2 +- test/next_ls/runtime_test.exs | 3 ++ 5 files changed, 60 insertions(+), 44 deletions(-) diff --git a/lib/next_ls.ex b/lib/next_ls.ex index ffc0f20c..ed30b3fb 100644 --- a/lib/next_ls.ex +++ b/lib/next_ls.ex @@ -356,12 +356,21 @@ defmodule NextLS do refresh_refs = dispatch(lsp.assigns.registry, :runtimes, fn entries -> - for {pid, %{name: name, uri: wuri}} <- entries, String.starts_with?(uri, wuri), into: %{} do + for {pid, %{name: name, uri: wuri, db: db}} <- entries, String.starts_with?(uri, wuri), into: %{} do token = token() Progress.start(lsp, token, "Compiling...") task = Task.Supervisor.async_nolink(lsp.assigns.task_supervisor, fn -> + DB.query( + db, + ~Q""" + DELETE FROM 'references' + WHERE file = ?; + """, + [URI.parse(uri).path] + ) + {name, Runtime.compile(pid)} end) diff --git a/lib/next_ls/definition.ex b/lib/next_ls/definition.ex index 36d69c8a..5cd7ab6a 100644 --- a/lib/next_ls/definition.ex +++ b/lib/next_ls/definition.ex @@ -5,54 +5,57 @@ defmodule NextLS.Definition do alias NextLS.DB def fetch(file, {line, col}, db) do - [[_pk, identifier, _arity, _file, type, module, _start_l, _start_c, _end_l, _end_c]] = - DB.query( - db, + with [[_pk, identifier, _arity, _file, type, module, _start_l, _start_c, _end_l, _end_c]] <- + DB.query( + db, + ~Q""" + SELECT + * + FROM + 'references' AS refs + WHERE + refs.file = ? + AND refs.start_line <= ? + AND ? <= refs.end_line + AND refs.start_column <= ? + AND ? <= refs.end_column + ORDER BY refs.id desc + LIMIT 1; + + """, + [file, line, line, col, col] + ) do + query = ~Q""" SELECT * FROM - 'references' AS refs + symbols WHERE - refs.file = ? - AND refs.start_line <= ? - AND ? <= refs.end_line - AND refs.start_column <= ? - AND ? <= refs.end_column - ORDER BY refs.id desc - LIMIT 1; - - """, - [file, line, line, col, col] - ) - - query = - ~Q""" - SELECT - * - FROM - symbols - WHERE - symbols.module = ? - AND symbols.name = ?; - """ - - args = - case type do - "alias" -> - [module, module] - - "function" -> - [module, identifier] - - _ -> - nil + symbols.module = ? + AND symbols.name = ?; + """ + + args = + case type do + "alias" -> + [module, module] + + "function" -> + [module, identifier] + + _ -> + nil + end + + if args do + DB.query(db, query, args) + else + nil end - - if args do - DB.query(db, query, args) else - nil + _ -> + nil end end end diff --git a/lib/next_ls/runtime.ex b/lib/next_ls/runtime.ex index 444b6917..3d90f61b 100644 --- a/lib/next_ls/runtime.ex +++ b/lib/next_ls/runtime.ex @@ -50,8 +50,9 @@ defmodule NextLS.Runtime do task_supervisor = Keyword.fetch!(opts, :task_supervisor) registry = Keyword.fetch!(opts, :registry) on_initialized = Keyword.fetch!(opts, :on_initialized) + db = Keyword.fetch!(opts, :db) - Registry.register(registry, :runtimes, %{name: name, uri: uri}) + Registry.register(registry, :runtimes, %{name: name, uri: uri, db: db}) pid = cond do diff --git a/lib/next_ls/runtime/supervisor.ex b/lib/next_ls/runtime/supervisor.ex index 16404e47..defa3cc8 100644 --- a/lib/next_ls/runtime/supervisor.ex +++ b/lib/next_ls/runtime/supervisor.ex @@ -25,7 +25,7 @@ defmodule NextLS.Runtime.Supervisor do children = [ {NextLS.DB, logger: logger, file: ~c"#{hidden_folder}/nextls.db", registry: registry, name: db_name}, {NextLS.Runtime.Sidecar, name: sidecar_name, db: db_name, symbol_table: symbol_table_name}, - {NextLS.Runtime, init_arg[:runtime] ++ [name: name, registry: registry, parent: sidecar_name]} + {NextLS.Runtime, init_arg[:runtime] ++ [name: name, registry: registry, parent: sidecar_name, db: db_name]} ] Supervisor.init(children, strategy: :one_for_one) diff --git a/test/next_ls/runtime_test.exs b/test/next_ls/runtime_test.exs index 36f6d9ec..ee220b4b 100644 --- a/test/next_ls/runtime_test.exs +++ b/test/next_ls/runtime_test.exs @@ -58,6 +58,7 @@ defmodule NextLs.RuntimeTest do uri: "file://#{cwd}", parent: self(), logger: logger, + db: :some_db, registry: RuntimeTest.Registry} ) @@ -83,6 +84,7 @@ defmodule NextLs.RuntimeTest do uri: "file://#{cwd}", parent: self(), logger: logger, + db: :some_db, registry: RuntimeTest.Registry} ) @@ -107,6 +109,7 @@ defmodule NextLs.RuntimeTest do uri: "file://#{cwd}", parent: self(), logger: logger, + db: :some_db, registry: RuntimeTest.Registry} )