From 4ad48559d31496253093ad57eaa60b8b21105de7 Mon Sep 17 00:00:00 2001 From: Mitchell Hanberg Date: Mon, 18 Sep 2023 13:04:10 -0400 Subject: [PATCH] fix: handle aliases injected by macros --- lib/next_ls/runtime/sidecar.ex | 40 +++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/lib/next_ls/runtime/sidecar.ex b/lib/next_ls/runtime/sidecar.ex index 805883ba..7d52da65 100644 --- a/lib/next_ls/runtime/sidecar.ex +++ b/lib/next_ls/runtime/sidecar.ex @@ -31,23 +31,29 @@ defmodule NextLS.Runtime.Sidecar do end def handle_info({{:tracer, :reference, :alias}, payload}, state) do - if payload.meta[:end_of_expression] do - start = %{line: payload.meta[:line], col: payload.meta[:column]} - stop = %{line: payload.meta[:end_of_expression][:line], col: payload.meta[:end_of_expression][:column]} - - {start, stop} = - Aliases.extract_alias_range( - File.read!(payload.file), - {start, stop}, - payload.identifier |> Macro.to_string() |> String.to_atom() - ) - - payload = - payload - |> Map.put(:identifier, payload.module) - |> Map.put(:range, %{start: start, stop: stop}) - - DB.insert_reference(state.db, payload) + # TODO: in the next version of elixir, generated code will not have :column metadata, so we can tell if the alias is from + # a macro. For now, just try and rescue + try do + if payload.meta[:end_of_expression] do + start = %{line: payload.meta[:line], col: payload.meta[:column]} + stop = %{line: payload.meta[:end_of_expression][:line], col: payload.meta[:end_of_expression][:column]} + + {start, stop} = + Aliases.extract_alias_range( + File.read!(payload.file), + {start, stop}, + payload.identifier |> Macro.to_string() |> String.to_atom() + ) + + payload = + payload + |> Map.put(:identifier, payload.module) + |> Map.put(:range, %{start: start, stop: stop}) + + DB.insert_reference(state.db, payload) + end + rescue + _ -> :ok end {:noreply, state}