From cd4f337993ff2304bb599304e7228aea850c8cb6 Mon Sep 17 00:00:00 2001 From: Mitchell Hanberg Date: Sun, 2 Nov 2025 18:10:36 -0500 Subject: [PATCH 1/4] ci: add elixir 1.19 to build matrix --- .github/matrix.json | 15 +++++++++++++++ matrix.exs | 1 + 2 files changed, 16 insertions(+) diff --git a/.github/matrix.json b/.github/matrix.json index 9a7d5d12..69fea274 100644 --- a/.github/matrix.json +++ b/.github/matrix.json @@ -1,5 +1,10 @@ { "include": [ + { + "otp": "28", + "elixir": "1.19", + "project": "engine" + }, { "otp": "28", "elixir": "1.18.4", @@ -30,6 +35,11 @@ "elixir": "1.16", "project": "engine" }, + { + "otp": "28", + "elixir": "1.19", + "project": "expert_credo" + }, { "otp": "28", "elixir": "1.18.4", @@ -60,6 +70,11 @@ "elixir": "1.16", "project": "expert_credo" }, + { + "otp": "28", + "elixir": "1.19", + "project": "forge" + }, { "otp": "28", "elixir": "1.18.4", diff --git a/matrix.exs b/matrix.exs index 095ba13d..073a1e15 100644 --- a/matrix.exs +++ b/matrix.exs @@ -1,6 +1,7 @@ Mix.install([:jason]) versions = [ + %{elixir: "1.19", otp: "28"}, %{elixir: "1.18.4", otp: "28"}, %{elixir: "1.18", otp: "27"}, %{elixir: "1.18", otp: "26"}, From b10b6c2836afd934cc0fb9ffd71709336a79eccf Mon Sep 17 00:00:00 2001 From: doorgan Date: Fri, 7 Nov 2025 16:24:41 -0300 Subject: [PATCH 2/4] fix: update build exceptions tests --- apps/engine/test/engine/build/error_test.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/engine/test/engine/build/error_test.exs b/apps/engine/test/engine/build/error_test.exs index 5dfad106..4fa312f8 100644 --- a/apps/engine/test/engine/build/error_test.exs +++ b/apps/engine/test/engine/build/error_test.exs @@ -451,7 +451,7 @@ defmodule Engine.Build.ErrorTest do # used a regex here because the error changed in elixir 1.18 assert diagnostic.message =~ - ~r[protocol Enumerable not implemented for( 1 of)? type Integer] + ~r[protocol Enumerable not implemented for( 1 of)?( type)? Integer] assert decorate(document_text, diagnostic.position) =~ "«for i <- 1, do: i\n»" end @@ -468,7 +468,7 @@ defmodule Engine.Build.ErrorTest do # used a regex here because the error changed in elixir 1.18 assert diagnostic.message =~ - ~r[protocol Enumerable not implemented for( 1 of)? type Integer] + ~r[protocol Enumerable not implemented for( 1 of)?( type)? Integer] assert decorate(document_text, diagnostic.position) =~ "«for i <- 1, do: i\n»" end From 60b7030fb45900a0b4710af64266428dc4d419f8 Mon Sep 17 00:00:00 2001 From: doorgan Date: Fri, 7 Nov 2025 16:43:30 -0300 Subject: [PATCH 3/4] fix: address warnings from elixir 1.19 --- apps/engine/lib/engine/build/state.ex | 2 +- .../lib/engine/code_action/handlers/remove_unused_alias.ex | 2 +- apps/engine/lib/engine/code_intelligence/symbols.ex | 4 ++-- apps/engine/lib/engine/code_mod/aliases.ex | 2 +- apps/expert/lib/expert.ex | 4 ++-- apps/expert/mix.exs | 2 +- apps/forge/lib/forge/document/position.ex | 2 -- apps/forge/lib/future/code.ex | 2 +- apps/forge/test/forge/ast_test.exs | 2 +- 9 files changed, 10 insertions(+), 12 deletions(-) diff --git a/apps/engine/lib/engine/build/state.ex b/apps/engine/lib/engine/build/state.ex index 45969ec6..ca077b48 100644 --- a/apps/engine/lib/engine/build/state.ex +++ b/apps/engine/lib/engine/build/state.ex @@ -38,7 +38,7 @@ defmodule Engine.Build.State do compile_file(state, document) end) - %__MODULE__{new_state | uri_to_document: %{}, project_compile: :none} + %{new_state | uri_to_document: %{}, project_compile: :none} end def on_file_compile(%__MODULE__{} = state, %Document{} = document) do diff --git a/apps/engine/lib/engine/code_action/handlers/remove_unused_alias.ex b/apps/engine/lib/engine/code_action/handlers/remove_unused_alias.ex index b30f81c5..66f28145 100644 --- a/apps/engine/lib/engine/code_action/handlers/remove_unused_alias.ex +++ b/apps/engine/lib/engine/code_action/handlers/remove_unused_alias.ex @@ -246,7 +246,7 @@ defmodule Engine.CodeAction.Handlers.RemoveUnusedAlias do defp include_next_line(%Range{} = range) do update_in(range.end, fn old_position -> - %Position{ + %{ old_position | line: old_position.line + 1, character: 1 diff --git a/apps/engine/lib/engine/code_intelligence/symbols.ex b/apps/engine/lib/engine/code_intelligence/symbols.ex index 6e614f6e..67a8f5f9 100644 --- a/apps/engine/lib/engine/code_intelligence/symbols.ex +++ b/apps/engine/lib/engine/code_intelligence/symbols.ex @@ -106,11 +106,11 @@ defmodule Engine.CodeIntelligence.Symbols do children = Enum.map(defs, fn child -> [_, rest] = String.split(child.name, " ", parts: 2) - %Symbols.Document{child | name: rest} + %{child | name: rest} end) range = Range.new(first.range.start, last.range.end) - %Symbols.Document{first | name: name, range: range, children: children} + %{first | name: name, range: range, children: children} end) grouped_functions diff --git a/apps/engine/lib/engine/code_mod/aliases.ex b/apps/engine/lib/engine/code_mod/aliases.ex index 5153eb62..dcc93a4f 100644 --- a/apps/engine/lib/engine/code_mod/aliases.ex +++ b/apps/engine/lib/engine/code_mod/aliases.ex @@ -226,7 +226,7 @@ defmodule Engine.CodeMod.Aliases do %Position{position | character: character} position.line > scope_range.end.line -> - %Position{scope_range.end | character: 1} + %{scope_range.end | character: 1} true -> position diff --git a/apps/expert/lib/expert.ex b/apps/expert/lib/expert.ex index 4ba633b6..8986d4f3 100644 --- a/apps/expert/lib/expert.ex +++ b/apps/expert/lib/expert.ex @@ -176,7 +176,7 @@ defmodule Expert do def handle_info(:engine_initialized, lsp) do state = assigns(lsp).state - new_state = %State{state | engine_initialized?: true} + new_state = %{state | engine_initialized?: true} lsp = assign(lsp, state: new_state) @@ -195,7 +195,7 @@ defmodule Expert do ) {:ok, config} = State.default_configuration(state) - {:noreply, assign(lsp, state: %State{state | configuration: config})} + {:noreply, assign(lsp, state: %{state | configuration: config})} else {:noreply, lsp} end diff --git a/apps/expert/mix.exs b/apps/expert/mix.exs index f117d11d..979fb235 100644 --- a/apps/expert/mix.exs +++ b/apps/expert/mix.exs @@ -77,7 +77,7 @@ defmodule Expert.MixProject do defp deps do [ - {:burrito, "~> 1.5", only: [:dev, :prod]}, + {:burrito, "~> 1.5"}, {:deps_nix, "~> 2.4", only: :dev}, Mix.Credo.dependency(), Mix.Dialyzer.dependency(), diff --git a/apps/forge/lib/forge/document/position.ex b/apps/forge/lib/forge/document/position.ex index 4904a16e..5ca732d5 100644 --- a/apps/forge/lib/forge/document/position.ex +++ b/apps/forge/lib/forge/document/position.ex @@ -107,8 +107,6 @@ end defimpl Inspect, for: Forge.Document.Position do import Inspect.Algebra - def inspect(nil, _), do: "nil" - def inspect(pos, _) do concat(["XpPos", to_string(pos)]) end diff --git a/apps/forge/lib/future/code.ex b/apps/forge/lib/future/code.ex index 80fbc204..a3e652b7 100644 --- a/apps/forge/lib/future/code.ex +++ b/apps/forge/lib/future/code.ex @@ -1894,7 +1894,7 @@ defmodule Future.Code do case :code.ensure_loaded(module) do {:error, :nofile} = error -> if can_await_module_compilation?() do - case Kernel.ErrorHandler.ensure_compiled(module, :module, mode) do + case Kernel.ErrorHandler.ensure_compiled(module, :module, mode, nil) do :found -> {:module, module} :deadlock -> {:error, :unavailable} :not_found -> {:error, :nofile} diff --git a/apps/forge/test/forge/ast_test.exs b/apps/forge/test/forge/ast_test.exs index 16796b65..fb978477 100644 --- a/apps/forge/test/forge/ast_test.exs +++ b/apps/forge/test/forge/ast_test.exs @@ -226,7 +226,7 @@ defmodule Forge.AstTest do end test "within the node", %{ast: ast, range: range} do - position = %Position{range.start | character: range.start.character + 1} + position = %{range.start | character: range.start.character + 1} assert Ast.contains_position?(ast, position) end From 60a221a45b4e1835b229b434f9a03a54f0cfbeae Mon Sep 17 00:00:00 2001 From: doorgan Date: Fri, 7 Nov 2025 16:53:08 -0300 Subject: [PATCH 4/4] fix: address private api that change in elixir 1.19 --- apps/forge/lib/future/code.ex | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/forge/lib/future/code.ex b/apps/forge/lib/future/code.ex index a3e652b7..75b0787a 100644 --- a/apps/forge/lib/future/code.ex +++ b/apps/forge/lib/future/code.ex @@ -1894,7 +1894,7 @@ defmodule Future.Code do case :code.ensure_loaded(module) do {:error, :nofile} = error -> if can_await_module_compilation?() do - case Kernel.ErrorHandler.ensure_compiled(module, :module, mode, nil) do + case do_ensure_compiled(module, :module, mode, nil) do :found -> {:module, module} :deadlock -> {:error, :unavailable} :not_found -> {:error, :nofile} @@ -1908,6 +1908,16 @@ defmodule Future.Code do end end + if Version.match?(System.version(), ">= 1.19.0") do + defp do_ensure_compiled(module, kind, deadlock, position) do + Kernel.ErrorHandler.ensure_compiled(module, kind, deadlock, position) + end + else + defp do_ensure_compiled(module, kind, deadlock, _position) do + Kernel.ErrorHandler.ensure_compiled(module, kind, deadlock) + end + end + @doc """ Returns `true` if the module is loaded.