diff --git a/.gitignore b/.gitignore index ee91cbb4..ebde3b90 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,7 @@ expert_debug priv/plts apps/forge/src/future_elixir_parser.erl + +.DS_Store + .notes/ diff --git a/apps/engine/.formatter.exs b/apps/engine/.formatter.exs index b5eb9eee..4e725b36 100644 --- a/apps/engine/.formatter.exs +++ b/apps/engine/.formatter.exs @@ -3,30 +3,11 @@ current_directory = Path.dirname(__ENV__.file) import_deps = [:forge] -impossible_to_format = [ - Path.join([ - current_directory, - "test", - "fixtures", - "compilation_errors", - "lib", - "compilation_errors.ex" - ]), - Path.join([current_directory, "test", "fixtures", "parse_errors", "lib", "parse_errors.ex"]) -] - locals_without_parens = [with_progress: 2, with_progress: 3, defkey: 2, defkey: 3, with_wal: 2] [ locals_without_parens: locals_without_parens, export: [locals_without_parens: locals_without_parens], import_deps: import_deps, - inputs: - Enum.flat_map( - [ - Path.join(current_directory, "*.exs"), - Path.join(current_directory, "{lib,test}/**/*.{ex,exs}") - ], - &Path.wildcard(&1, match_dot: true) - ) -- impossible_to_format + inputs: ["*.exs", "{lib,test}/**/*.{ex,exs}"] ] diff --git a/apps/engine/lib/engine/engine.ex b/apps/engine/lib/engine/engine.ex index da25d7af..afe3c4e8 100644 --- a/apps/engine/lib/engine/engine.ex +++ b/apps/engine/lib/engine/engine.ex @@ -8,11 +8,8 @@ defmodule Engine do alias Engine.Api.Proxy alias Engine.CodeAction alias Engine.CodeIntelligence - alias Engine.ProjectNode alias Forge.Project - alias Mix.Tasks.Namespace - require Logger @excluded_apps [:patch, :nimble_parsec] @@ -67,21 +64,19 @@ defmodule Engine do def list_apps do for {app, _, _} <- :application.loaded_applications(), - not Namespace.Module.prefixed?(app), + not Forge.Namespace.Module.prefixed?(app), do: app end - def start_link(%Project{} = project) do - :ok = ensure_epmd_started() - start_net_kernel(project) - - apps_to_start = [:elixir | @allowed_apps] ++ [:runtime_tools] - node = Project.node_name(project) + def ensure_apps_started do + apps_to_start = [:elixir, :runtime_tools | @allowed_apps] - with {:ok, node_pid} <- ProjectNode.start(project, glob_paths()), - :ok <- ensure_apps_started(node, apps_to_start) do - {:ok, node, node_pid} - end + Enum.reduce_while(apps_to_start, :ok, fn app_name, _ -> + case :application.ensure_all_started(app_name) do + {:ok, _} -> {:cont, :ok} + error -> {:halt, error} + end + end) end def deps_paths do @@ -116,140 +111,4 @@ defmodule Engine do def set_project(%Project{} = project) do :persistent_term.put({__MODULE__, :project}, project) end - - defdelegate stop(project), to: ProjectNode - - def call(%Project{} = project, m, f, a \\ []) do - project - |> Project.node_name() - |> :erpc.call(m, f, a) - end - - def manager_node_name(%Project{} = project) do - :"manager-#{Project.name(project)}-#{Project.entropy(project)}@127.0.0.1" - end - - defp start_net_kernel(%Project{} = project) do - manager = manager_node_name(project) - :net_kernel.start(manager, %{name_domain: :longnames}) - end - - defp ensure_apps_started(node, app_names) do - Enum.reduce_while(app_names, :ok, fn app_name, _ -> - case :rpc.call(node, :application, :ensure_all_started, [app_name]) do - {:ok, _} -> {:cont, :ok} - error -> {:halt, error} - end - end) - end - - defp glob_paths do - for entry <- :code.get_path(), - entry_string = List.to_string(entry), - entry_string != ".", - Enum.any?(app_globs(), &PathGlob.match?(entry_string, &1, match_dot: true)) do - entry - end - end - - def elixir_executable(%Project{} = project) do - root_path = Project.root_path(project) - - {path_result, env} = - with nil <- version_manager_path_and_env("asdf", root_path), - nil <- version_manager_path_and_env("mise", root_path), - nil <- version_manager_path_and_env("rtx", root_path) do - {File.cd!(root_path, fn -> System.find_executable("elixir") end), System.get_env()} - end - - case path_result do - nil -> - {:error, :no_elixir} - - executable when is_binary(executable) -> - {:ok, executable, env} - end - end - - defp app_globs do - app_globs = Enum.map(@allowed_apps, fn app_name -> "/**/#{app_name}*/ebin" end) - ["/**/priv" | app_globs] - end - - defp ensure_epmd_started do - case System.cmd("epmd", ~w(-daemon)) do - {"", 0} -> - :ok - - _ -> - {:error, :epmd_failed} - end - end - - defp version_manager_path_and_env(manager, root_path) do - with true <- is_binary(System.find_executable(manager)), - env = reset_env(manager, root_path), - {path, 0} <- System.cmd(manager, ~w(which elixir), cd: root_path, env: env) do - {String.trim(path), env} - else - _ -> - nil - end - end - - # We launch expert by asking the version managers to provide an environment, - # which contains path munging. This initial environment is present in the running - # VM, and needs to be undone so we can find the correct elixir executable in the project. - defp reset_env("asdf", _root_path) do - orig_path = System.get_env("PATH_SAVE", System.get_env("PATH")) - - Enum.map(System.get_env(), fn - {"ASDF_ELIXIR_VERSION", _} -> {"ASDF_ELIXIR_VERSION", nil} - {"ASDF_ERLANG_VERSION", _} -> {"ASDF_ERLANG_VERSION", nil} - {"PATH", _} -> {"PATH", orig_path} - other -> other - end) - end - - defp reset_env("rtx", root_path) do - {env, _} = System.cmd("rtx", ~w(env -s bash), cd: root_path) - - env - |> String.trim() - |> String.split("\n") - |> Enum.map(fn - "export " <> key_and_value -> - [key, value] = - key_and_value - |> String.split("=", parts: 2) - |> Enum.map(&String.trim/1) - - {key, value} - - _ -> - nil - end) - |> Enum.reject(&is_nil/1) - end - - defp reset_env("mise", root_path) do - {env, _} = System.cmd("mise", ~w(env -s bash), cd: root_path) - - env - |> String.trim() - |> String.split("\n") - |> Enum.map(fn - "export " <> key_and_value -> - [key, value] = - key_and_value - |> String.split("=", parts: 2) - |> Enum.map(&String.trim/1) - - {key, value} - - _ -> - nil - end) - |> Enum.reject(&is_nil/1) - end end diff --git a/apps/engine/lib/engine/engine/api/proxy.ex b/apps/engine/lib/engine/engine/api/proxy.ex index 9b669d24..ebd6c791 100644 --- a/apps/engine/lib/engine/engine/api/proxy.ex +++ b/apps/engine/lib/engine/engine/api/proxy.ex @@ -33,13 +33,13 @@ defmodule Engine.Api.Proxy do alias Forge.Document alias Forge.Document.Changes - alias Engine.Api.Messages alias Engine.Api.Proxy.BufferingState alias Engine.Api.Proxy.DrainingState alias Engine.Api.Proxy.ProxyingState alias Engine.Api.Proxy.Records alias Engine.CodeMod alias Engine.Commands + alias Forge.EngineApi.Messages import Messages import Record diff --git a/apps/engine/lib/engine/engine/api/proxy/buffering_state.ex b/apps/engine/lib/engine/engine/api/proxy/buffering_state.ex index 6cd23c40..bee50d47 100644 --- a/apps/engine/lib/engine/engine/api/proxy/buffering_state.ex +++ b/apps/engine/lib/engine/engine/api/proxy/buffering_state.ex @@ -1,12 +1,11 @@ defmodule Engine.Api.Proxy.BufferingState do alias Forge.Document - alias Engine.Api alias Engine.Build alias Engine.Commands - import Api.Messages - import Api.Proxy.Records + import Forge.EngineApi.Messages + import Engine.Api.Proxy.Records defstruct initiator_pid: nil, buffer: [] diff --git a/apps/engine/lib/engine/engine/build.ex b/apps/engine/lib/engine/engine/build.ex index 32ab3e70..b9819a5a 100644 --- a/apps/engine/lib/engine/engine/build.ex +++ b/apps/engine/lib/engine/engine/build.ex @@ -4,7 +4,6 @@ defmodule Engine.Build do alias Engine.Build.Document.Compilers.HEEx alias Engine.Build.State - alias Forge.VM.Versions require Logger use GenServer @@ -13,15 +12,6 @@ defmodule Engine.Build do # Public interface - def path(%Project{} = project) do - %{elixir: elixir, erlang: erlang} = Versions.current() - erlang_major = erlang |> String.split(".") |> List.first() - elixir_version = Version.parse!(elixir) - elixir_major = "#{elixir_version.major}.#{elixir_version.minor}" - build_root = Project.build_path(project) - Path.join([build_root, "erl-#{erlang_major}", "elixir-#{elixir_major}"]) - end - def schedule_compile(%Project{} = _project, force? \\ false) do GenServer.cast(__MODULE__, {:compile, force?}) end diff --git a/apps/engine/lib/engine/engine/build/state.ex b/apps/engine/lib/engine/engine/build/state.ex index 93a50d4f..45969ec6 100644 --- a/apps/engine/lib/engine/engine/build/state.ex +++ b/apps/engine/lib/engine/engine/build/state.ex @@ -1,9 +1,9 @@ defmodule Engine.Build.State do alias Elixir.Features - alias Engine.Api.Messages alias Engine.Build alias Engine.Plugin alias Forge.Document + alias Forge.EngineApi.Messages alias Forge.Project alias Forge.VM.Versions @@ -60,7 +60,7 @@ defmodule Engine.Build.State do # If the project directory isn't there, for some reason the main build fails, so we create it here # to ensure that the build will succeed. project = state.project - build_path = Engine.Build.path(project) + build_path = Project.versioned_build_path(project) unless Versions.compatible?(build_path) do Logger.info("Build path #{build_path} was compiled on a previous erlang version. Deleting") diff --git a/apps/engine/lib/engine/engine/code_action.ex b/apps/engine/lib/engine/engine/code_action.ex index 08dc4dba..518bc61a 100644 --- a/apps/engine/lib/engine/engine/code_action.ex +++ b/apps/engine/lib/engine/engine/code_action.ex @@ -1,25 +1,9 @@ defmodule Engine.CodeAction do - alias Engine.CodeAction.Diagnostic alias Engine.CodeAction.Handlers + alias Forge.CodeAction.Diagnostic alias Forge.Document - alias Forge.Document.Changes alias Forge.Document.Range - require Logger - - defstruct [:title, :kind, :changes, :uri] - - @type code_action_kind :: GenLSP.Enumerations.CodeActionKind.t() - - @type trigger_kind :: GenLSP.Enumerations.CodeActionTriggerKind.t() - - @type t :: %__MODULE__{ - title: String.t(), - kind: code_action_kind, - changes: Changes.t(), - uri: Forge.uri() - } - @handlers [ Handlers.ReplaceRemoteFunction, Handlers.ReplaceWithUnderscore, @@ -29,18 +13,13 @@ defmodule Engine.CodeAction do Handlers.Refactorex ] - @spec new(Forge.uri(), String.t(), code_action_kind(), Changes.t()) :: t() - def new(uri, title, kind, changes) do - %__MODULE__{uri: uri, title: title, changes: changes, kind: kind} - end - @spec for_range( Document.t(), Range.t(), [Diagnostic.t()], - [code_action_kind] | :all, - trigger_kind - ) :: [t()] + [Forge.CodeAction.code_action_kind()] | :all, + Forge.CodeAction.trigger_kind() + ) :: [Forge.CodeAction.t()] def for_range(%Document{} = doc, %Range{} = range, diagnostics, kinds, trigger_kind) do Enum.flat_map(@handlers, fn handler -> if handle_kinds?(handler, kinds) and handle_trigger_kind?(handler, trigger_kind) do diff --git a/apps/engine/lib/engine/engine/code_action/handler.ex b/apps/engine/lib/engine/engine/code_action/handler.ex index bc352766..630b52e1 100644 --- a/apps/engine/lib/engine/engine/code_action/handler.ex +++ b/apps/engine/lib/engine/engine/code_action/handler.ex @@ -1,6 +1,6 @@ defmodule Engine.CodeAction.Handler do - alias Engine.CodeAction - alias Engine.CodeAction.Diagnostic + alias Forge.CodeAction + alias Forge.CodeAction.Diagnostic alias Forge.Document alias Forge.Document.Range diff --git a/apps/engine/lib/engine/engine/code_action/handlers/add_alias.ex b/apps/engine/lib/engine/engine/code_action/handlers/add_alias.ex index 1176c68b..48593468 100644 --- a/apps/engine/lib/engine/engine/code_action/handlers/add_alias.ex +++ b/apps/engine/lib/engine/engine/code_action/handlers/add_alias.ex @@ -5,7 +5,6 @@ defmodule Engine.CodeAction.Handlers.AddAlias do alias Engine.CodeMod alias Engine.Modules alias Engine.Search.Fuzzy - alias Engine.Search.Indexer.Entry alias Forge.Ast alias Forge.Ast.Analysis alias Forge.Ast.Analysis.Alias @@ -14,8 +13,8 @@ defmodule Engine.CodeAction.Handlers.AddAlias do alias Forge.Document.Position alias Forge.Document.Range alias Forge.Formats + alias Forge.Search.Indexer.Entry alias GenLSP.Enumerations.CodeActionKind - alias Mix.Tasks.Namespace alias Sourceror.Zipper @behaviour CodeAction.Handler @@ -66,7 +65,7 @@ defmodule Engine.CodeAction.Handlers.AddAlias do changes = Changes.new(analysis.document, replace_current_alias ++ alias_edits) - CodeAction.new( + Forge.CodeAction.new( analysis.document.uri, "alias #{Formats.module(potential_alias_module)}", CodeActionKind.quick_fix(), @@ -189,7 +188,7 @@ defmodule Engine.CodeAction.Handlers.AddAlias do for {mod, _, _} <- all_modules(), elixir_module?(mod), - not Namespace.Module.prefixed?(mod) do + not Forge.Namespace.Module.prefixed?(mod) do module_name = List.to_atom(mod) %Entry{ diff --git a/apps/engine/lib/engine/engine/code_action/handlers/organize_aliases.ex b/apps/engine/lib/engine/engine/code_action/handlers/organize_aliases.ex index bc1be535..9b79c34a 100644 --- a/apps/engine/lib/engine/engine/code_action/handlers/organize_aliases.ex +++ b/apps/engine/lib/engine/engine/code_action/handlers/organize_aliases.ex @@ -26,7 +26,7 @@ defmodule Engine.CodeAction.Handlers.OrganizeAliases do changes = Changes.new(doc, edits) [ - CodeAction.new( + Forge.CodeAction.new( doc.uri, "Organize aliases", CodeActionKind.source_organize_imports(), diff --git a/apps/engine/lib/engine/engine/code_action/handlers/refactorex.ex b/apps/engine/lib/engine/engine/code_action/handlers/refactorex.ex index 0b5921d4..0a67edb9 100644 --- a/apps/engine/lib/engine/engine/code_action/handlers/refactorex.ex +++ b/apps/engine/lib/engine/engine/code_action/handlers/refactorex.ex @@ -17,7 +17,7 @@ defmodule Engine.CodeAction.Handlers.Refactorex do |> Sourceror.Zipper.zip() |> Refactor.available_refactorings(target, true) |> Enum.map(fn refactoring -> - CodeAction.new( + Forge.CodeAction.new( doc.uri, refactoring.title, refactoring.kind, diff --git a/apps/engine/lib/engine/engine/code_action/handlers/remove_unused_alias.ex b/apps/engine/lib/engine/engine/code_action/handlers/remove_unused_alias.ex index 02d495e5..b30f81c5 100644 --- a/apps/engine/lib/engine/engine/code_action/handlers/remove_unused_alias.ex +++ b/apps/engine/lib/engine/engine/code_action/handlers/remove_unused_alias.ex @@ -23,9 +23,9 @@ defmodule Engine.CodeAction.Handlers.RemoveUnusedAlias do alias Engine.Analyzer alias Engine.CodeAction - alias Engine.CodeAction.Diagnostic alias Forge.Ast alias Forge.Ast.Analysis + alias Forge.CodeAction.Diagnostic alias Forge.Document alias Forge.Document.Changes alias Forge.Document.Edit @@ -54,7 +54,7 @@ defmodule Engine.CodeAction.Handlers.RemoveUnusedAlias do changes = Changes.new(document, [edit]) action = - CodeAction.new( + Forge.CodeAction.new( document.uri, "Remove alias #{module_name}", Enumerations.CodeActionKind.source(), diff --git a/apps/engine/lib/engine/engine/code_action/handlers/replace_remote_function.ex b/apps/engine/lib/engine/engine/code_action/handlers/replace_remote_function.ex index 7c6ac41d..e2c873a9 100644 --- a/apps/engine/lib/engine/engine/code_action/handlers/replace_remote_function.ex +++ b/apps/engine/lib/engine/engine/code_action/handlers/replace_remote_function.ex @@ -1,8 +1,8 @@ defmodule Engine.CodeAction.Handlers.ReplaceRemoteFunction do alias Engine.CodeAction - alias Engine.CodeAction.Diagnostic alias Engine.Modules alias Forge.Ast + alias Forge.CodeAction.Diagnostic alias Forge.Document alias Forge.Document.Changes alias Forge.Document.Edit @@ -34,7 +34,7 @@ defmodule Engine.CodeAction.Handlers.ReplaceRemoteFunction do def trigger_kind, do: :all @spec to_code_actions(Document.t(), non_neg_integer(), module(), String.t(), [atom()]) :: - [CodeAction.t()] + [Forge.CodeAction.t()] defp to_code_actions(%Document{} = doc, line_number, module, function, suggestions) do suggestions |> Enum.reduce([], fn suggestion, acc -> @@ -43,7 +43,7 @@ defmodule Engine.CodeAction.Handlers.ReplaceRemoteFunction do changes = Changes.new(doc, edits) code_action = - CodeAction.new( + Forge.CodeAction.new( doc.uri, "Rename to #{suggestion}", CodeActionKind.quick_fix(), diff --git a/apps/engine/lib/engine/engine/code_action/handlers/replace_with_underscore.ex b/apps/engine/lib/engine/engine/code_action/handlers/replace_with_underscore.ex index cf000e62..83762926 100644 --- a/apps/engine/lib/engine/engine/code_action/handlers/replace_with_underscore.ex +++ b/apps/engine/lib/engine/engine/code_action/handlers/replace_with_underscore.ex @@ -1,7 +1,7 @@ defmodule Engine.CodeAction.Handlers.ReplaceWithUnderscore do alias Engine.CodeAction - alias Engine.CodeAction.Diagnostic alias Forge.Ast + alias Forge.CodeAction.Diagnostic alias Forge.Document alias Forge.Document.Changes alias Forge.Document.Range @@ -16,7 +16,7 @@ defmodule Engine.CodeAction.Handlers.ReplaceWithUnderscore do with {:ok, variable_name, line_number} <- extract_variable_and_line(diagnostic), {:ok, changes} <- to_changes(doc, line_number, variable_name) do action = - CodeAction.new( + Forge.CodeAction.new( doc.uri, "Rename to _#{variable_name}", CodeActionKind.quick_fix(), diff --git a/apps/engine/lib/engine/engine/code_intelligence/definition.ex b/apps/engine/lib/engine/engine/code_intelligence/definition.ex index e4590def..d8f21302 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/definition.ex +++ b/apps/engine/lib/engine/engine/code_intelligence/definition.ex @@ -1,7 +1,6 @@ defmodule Engine.CodeIntelligence.Definition do alias ElixirSense.Providers.Location, as: ElixirSenseLocation alias Engine.CodeIntelligence.Entity - alias Engine.Search.Indexer.Entry alias Engine.Search.Store alias Forge.Ast alias Forge.Ast.Analysis @@ -9,6 +8,7 @@ defmodule Engine.CodeIntelligence.Definition do alias Forge.Document.Location alias Forge.Document.Position alias Forge.Formats + alias Forge.Search.Indexer.Entry alias Forge.Text alias Future.Code diff --git a/apps/engine/lib/engine/engine/code_intelligence/docs.ex b/apps/engine/lib/engine/engine/code_intelligence/docs.ex index 6fb9bad2..39335f03 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/docs.ex +++ b/apps/engine/lib/engine/engine/code_intelligence/docs.ex @@ -1,21 +1,12 @@ defmodule Engine.CodeIntelligence.Docs do + alias Engine.Modules + alias Forge.CodeIntelligence.Docs + alias Forge.CodeIntelligence.Docs.Entry + @moduledoc """ Utilities for fetching documentation for a compiled module. """ - alias Engine.CodeIntelligence.Docs.Entry - alias Engine.Modules - - defstruct [:module, :doc, functions_and_macros: [], callbacks: [], types: []] - - @type t :: %__MODULE__{ - module: module(), - doc: Entry.content(), - functions_and_macros: %{optional(atom()) => [Entry.t(:function | :macro)]}, - callbacks: %{optional(atom()) => [Entry.t(:callback)]}, - types: %{optional(atom()) => [Entry.t(:type)]} - } - @doc """ Fetches known documentation for the given module. @@ -26,7 +17,7 @@ defmodule Engine.CodeIntelligence.Docs do Defaults to `false`. """ - @spec for_module(module(), [opt]) :: {:ok, t} | {:error, any()} + @spec for_module(module(), [opt]) :: {:ok, Docs.t()} | {:error, any()} when opt: {:exclude_hidden, boolean()} def for_module(module, opts) when is_atom(module) do exclude_hidden? = Keyword.get(opts, :exclude_hidden, false) @@ -54,7 +45,7 @@ defmodule Engine.CodeIntelligence.Docs do callback_defs = beam |> Modules.fetch_callbacks() |> ok_or([]) type_defs = beam |> Modules.fetch_types() |> ok_or([]) - result = %__MODULE__{ + result = %Docs{ module: module, doc: Entry.parse_doc(module_doc), functions_and_macros: diff --git a/apps/engine/lib/engine/engine/code_intelligence/references.ex b/apps/engine/lib/engine/engine/code_intelligence/references.ex index 05727860..264b9a5d 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/references.ex +++ b/apps/engine/lib/engine/engine/code_intelligence/references.ex @@ -2,13 +2,13 @@ defmodule Engine.CodeIntelligence.References do alias Engine.Analyzer alias Engine.CodeIntelligence.Entity alias Engine.CodeIntelligence.Variable - alias Engine.Search.Indexer.Entry alias Engine.Search.Store alias Engine.Search.Subject alias Forge.Ast.Analysis alias Forge.Document alias Forge.Document.Location alias Forge.Document.Position + alias Forge.Search.Indexer.Entry require Logger diff --git a/apps/engine/lib/engine/engine/code_intelligence/structs.ex b/apps/engine/lib/engine/engine/code_intelligence/structs.ex index bc2cd664..c9c2d96f 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/structs.ex +++ b/apps/engine/lib/engine/engine/code_intelligence/structs.ex @@ -1,7 +1,7 @@ defmodule Engine.CodeIntelligence.Structs do alias Engine.Module.Loader - alias Engine.Search.Indexer.Entry alias Engine.Search.Store + alias Forge.Search.Indexer.Entry def for_project do if Mix.Project.get() do diff --git a/apps/engine/lib/engine/engine/code_intelligence/symbols.ex b/apps/engine/lib/engine/engine/code_intelligence/symbols.ex index 1b110e53..6e614f6e 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/symbols.ex +++ b/apps/engine/lib/engine/engine/code_intelligence/symbols.ex @@ -1,11 +1,11 @@ defmodule Engine.CodeIntelligence.Symbols do - alias Engine.CodeIntelligence.Symbols alias Engine.Search alias Engine.Search.Indexer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Extractors + alias Forge.CodeIntelligence.Symbols alias Forge.Document alias Forge.Document.Range + alias Forge.Search.Indexer.Entry @block_types [ :ex_unit_describe, diff --git a/apps/engine/lib/engine/engine/code_intelligence/variable.ex b/apps/engine/lib/engine/engine/code_intelligence/variable.ex index 4f59c7c8..ad18c711 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/variable.ex +++ b/apps/engine/lib/engine/engine/code_intelligence/variable.ex @@ -1,9 +1,9 @@ defmodule Engine.CodeIntelligence.Variable do alias Engine.Search.Indexer - alias Engine.Search.Indexer.Entry alias Forge.Ast.Analysis alias Forge.Document.Position alias Forge.Document.Range + alias Forge.Search.Indexer.Entry require Logger diff --git a/apps/engine/lib/engine/engine/commands/reindex.ex b/apps/engine/lib/engine/engine/commands/reindex.ex index 3927e87f..1a9d8a9a 100644 --- a/apps/engine/lib/engine/engine/commands/reindex.ex +++ b/apps/engine/lib/engine/engine/commands/reindex.ex @@ -71,13 +71,13 @@ defmodule Engine.Commands.Reindex do """ alias Forge.Document + alias Forge.EngineApi alias Forge.Project - alias Engine.Api alias Engine.Search use GenServer - import Api.Messages + import EngineApi.Messages def start_link(opts) do [reindex_fun: fun] = Keyword.validate!(opts, reindex_fun: &do_reindex/1) diff --git a/apps/engine/lib/engine/engine/compilation/tracer.ex b/apps/engine/lib/engine/engine/compilation/tracer.ex index d4b3a59d..6d687984 100644 --- a/apps/engine/lib/engine/engine/compilation/tracer.ex +++ b/apps/engine/lib/engine/engine/compilation/tracer.ex @@ -2,7 +2,7 @@ defmodule Engine.Compilation.Tracer do alias Engine.Build alias Engine.Module.Loader - import Engine.Api.Messages + import Forge.EngineApi.Messages def trace({:on_module, module_binary, _filename}, %Macro.Env{} = env) do message = extract_module_updated(env.module, module_binary, env.file) diff --git a/apps/engine/lib/engine/engine/completion.ex b/apps/engine/lib/engine/engine/completion.ex index 26092c3b..30895ab5 100644 --- a/apps/engine/lib/engine/engine/completion.ex +++ b/apps/engine/lib/engine/engine/completion.ex @@ -5,7 +5,7 @@ defmodule Engine.Completion do alias Forge.Document.Position alias Engine.CodeMod.Format - alias Engine.Completion.Candidate + alias Forge.Completion.Candidate import Document.Line import Forge.Logging diff --git a/apps/engine/lib/engine/engine/dispatch.ex b/apps/engine/lib/engine/engine/dispatch.ex index be264d74..752136d3 100644 --- a/apps/engine/lib/engine/engine/dispatch.ex +++ b/apps/engine/lib/engine/engine/dispatch.ex @@ -9,7 +9,8 @@ defmodule Engine.Dispatch do alias Engine.Dispatch.Handlers alias Engine.Dispatch.PubSub - import Engine.Api.Messages + alias Forge.Project + import Forge.EngineApi.Messages @handlers [PubSub, Handlers.Indexing] @@ -78,7 +79,7 @@ defmodule Engine.Dispatch do defp progress_pid do project = Engine.get_project() - manager_node_name = Engine.manager_node_name(project) + manager_node_name = Project.manager_node_name(project) :rpc.call(manager_node_name, Expert.Project.Progress, :whereis, [project]) end end diff --git a/apps/engine/lib/engine/engine/dispatch/handler.ex b/apps/engine/lib/engine/engine/dispatch/handler.ex index 47d4fcbc..a9f56f3e 100644 --- a/apps/engine/lib/engine/engine/dispatch/handler.ex +++ b/apps/engine/lib/engine/engine/dispatch/handler.ex @@ -7,7 +7,7 @@ defmodule Engine.Dispatch.Handler do Define a handler, specifying the events to be handled and implementing `on_event/2`: defmodule MyHandler do - alias Engine.Api.Messages + alias Forge.EngineApi.Messages alias Engine.Dispatch.Handler import Messages diff --git a/apps/engine/lib/engine/engine/dispatch/handlers/indexing.ex b/apps/engine/lib/engine/engine/dispatch/handlers/indexing.ex index a6e6b74e..b877f7bc 100644 --- a/apps/engine/lib/engine/engine/dispatch/handlers/indexing.ex +++ b/apps/engine/lib/engine/engine/dispatch/handlers/indexing.ex @@ -1,9 +1,9 @@ defmodule Engine.Dispatch.Handlers.Indexing do - alias Engine.Api.Messages alias Engine.Commands alias Engine.Dispatch alias Engine.Search alias Forge.Document + alias Forge.EngineApi.Messages require Logger import Messages diff --git a/apps/engine/lib/engine/engine/mix.ex b/apps/engine/lib/engine/engine/mix.ex index b8757ed7..7b7d5c65 100644 --- a/apps/engine/lib/engine/engine/mix.ex +++ b/apps/engine/lib/engine/engine/mix.ex @@ -19,7 +19,7 @@ defmodule Engine.Mix do try do Mix.ProjectStack.post_config(prune_code_paths: false) - build_path = Engine.Build.path(project) + build_path = Project.versioned_build_path(project) project_root = Project.root_path(project) project diff --git a/apps/engine/lib/engine/engine/module_mappings.ex b/apps/engine/lib/engine/engine/module_mappings.ex index c2090dee..ed351c5d 100644 --- a/apps/engine/lib/engine/engine/module_mappings.ex +++ b/apps/engine/lib/engine/engine/module_mappings.ex @@ -39,7 +39,7 @@ defmodule Engine.ModuleMappings do end end - alias Engine.Api.Messages + alias Forge.EngineApi.Messages use GenServer diff --git a/apps/engine/lib/engine/engine/plugin.ex b/apps/engine/lib/engine/engine/plugin.ex index 2f590c99..e32d6bb2 100644 --- a/apps/engine/lib/engine/engine/plugin.ex +++ b/apps/engine/lib/engine/engine/plugin.ex @@ -1,10 +1,9 @@ defmodule Engine.Plugin do + alias Engine.Plugin.Runner alias Forge.Document + alias Forge.EngineApi.Messages alias Forge.Project - alias Engine.Api.Messages - alias Engine.Plugin.Runner - import Messages def diagnose(%Project{} = project, build_number) do diff --git a/apps/engine/lib/engine/engine/plugin/discovery.ex b/apps/engine/lib/engine/engine/plugin/discovery.ex index 02d3e317..d0d1d60f 100644 --- a/apps/engine/lib/engine/engine/plugin/discovery.ex +++ b/apps/engine/lib/engine/engine/plugin/discovery.ex @@ -12,13 +12,12 @@ defmodule Engine.Plugin.Discovery do alias Engine.Module.Loader alias Engine.Plugin.Runner - alias Mix.Tasks.Namespace require Logger @namespaced_document_module [:Forge, :Document] |> Module.concat() - |> Namespace.Module.apply() + |> Forge.Namespace.Module.apply() def run do for {app_name, _, _} <- :application.loaded_applications(), @@ -53,7 +52,7 @@ defmodule Engine.Plugin.Discovery do module |> :code.which() |> List.to_string() - |> Namespace.Transform.Beams.apply() + |> Forge.Namespace.Transform.Beams.apply() end defp unload_module(module) do diff --git a/apps/engine/lib/engine/engine/port.ex b/apps/engine/lib/engine/engine/port.ex deleted file mode 100644 index c6815a9c..00000000 --- a/apps/engine/lib/engine/engine/port.ex +++ /dev/null @@ -1,86 +0,0 @@ -defmodule Engine.Port do - @moduledoc """ - Utilities for launching ports in the context of a project - """ - - alias Forge.Project - - @type open_opt :: - {:env, list()} - | {:cd, String.t() | charlist()} - | {:env, [{:os.env_var_name(), :os.env_var_value()}]} - | {:args, list()} - - @type open_opts :: [open_opt] - - @doc """ - Launches elixir in a port. - - This function takes the project's context into account and looks for the executable via calling - `Engine.elixir_executable(project)`. Environment variables are also retrieved with that call. - """ - @spec open_elixir(Project.t(), open_opts()) :: port() - def open_elixir(%Project{} = project, opts) do - {:ok, elixir_executable, environment_variables} = Engine.elixir_executable(project) - - opts = - opts - |> Keyword.put_new_lazy(:cd, fn -> Project.root_path(project) end) - |> Keyword.put_new(:env, environment_variables) - - open(project, elixir_executable, opts) - end - - @doc """ - Launches an executable in the project context via a port. - """ - def open(%Project{} = project, executable, opts) do - {launcher, opts} = Keyword.pop_lazy(opts, :path, &path/0) - - opts = - opts - |> Keyword.put_new_lazy(:cd, fn -> Project.root_path(project) end) - |> Keyword.update(:args, [executable], fn old_args -> - [executable | Enum.map(old_args, &to_string/1)] - end) - - opts = - if Keyword.has_key?(opts, :env) do - Keyword.update!(opts, :env, &ensure_charlists/1) - else - opts - end - - Port.open({:spawn_executable, launcher}, opts) - end - - @doc """ - Provides the path of an executable to launch another erlang node via ports. - """ - def path do - path(:os.type()) - end - - def path({:unix, _}) do - with :non_existing <- :code.where_is_file(~c"port_wrapper.sh") do - :engine - |> :code.priv_dir() - |> Path.join("port_wrapper.sh") - |> Path.expand() - end - |> to_string() - end - - def path(os_tuple) do - raise ArgumentError, "Operating system #{inspect(os_tuple)} is not currently supported" - end - - defp ensure_charlists(environment_variables) do - Enum.map(environment_variables, fn {key, value} -> - # using to_string ensures nil values won't blow things up - erl_key = key |> to_string() |> String.to_charlist() - erl_value = value |> to_string() |> String.to_charlist() - {erl_key, erl_value} - end) - end -end diff --git a/apps/engine/lib/engine/engine/progress.ex b/apps/engine/lib/engine/engine/progress.ex index ab24e5e8..2c724b62 100644 --- a/apps/engine/lib/engine/engine/progress.ex +++ b/apps/engine/lib/engine/engine/progress.ex @@ -1,5 +1,5 @@ defmodule Engine.Progress do - import Engine.Api.Messages + import Forge.EngineApi.Messages @type label :: String.t() @type message :: String.t() diff --git a/apps/engine/lib/engine/engine/search/fuzzy.ex b/apps/engine/lib/engine/engine/search/fuzzy.ex index f6a071d2..1c1a9855 100644 --- a/apps/engine/lib/engine/engine/search/fuzzy.ex +++ b/apps/engine/lib/engine/engine/search/fuzzy.ex @@ -12,8 +12,8 @@ defmodule Engine.Search.Fuzzy do """ alias Engine.Search.Fuzzy.Scorer - alias Engine.Search.Indexer.Entry alias Forge.Project + alias Forge.Search.Indexer.Entry import Record defstruct subject_to_values: %{}, diff --git a/apps/engine/lib/engine/engine/search/indexer.ex b/apps/engine/lib/engine/engine/search/indexer.ex index 7d5994bc..783220ce 100644 --- a/apps/engine/lib/engine/engine/search/indexer.ex +++ b/apps/engine/lib/engine/engine/search/indexer.ex @@ -1,10 +1,10 @@ defmodule Engine.Search.Indexer do alias Engine.Progress alias Engine.Search.Indexer - alias Engine.Search.Indexer.Entry alias Forge.Identifier alias Forge.ProcessCache alias Forge.Project + alias Forge.Search.Indexer.Entry require ProcessCache diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/ecto_schema.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/ecto_schema.ex index 40102425..94e7a178 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/ecto_schema.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/ecto_schema.ex @@ -1,10 +1,10 @@ defmodule Engine.Search.Indexer.Extractors.EctoSchema do alias Engine.Analyzer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Metadata alias Engine.Search.Indexer.Source.Reducer alias Forge.Ast alias Forge.Document.Position + alias Forge.Search.Indexer.Entry def extract( {:schema, meta, [{:__block__, _, [_source]} | _]} = schema_block, diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/ex_unit.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/ex_unit.ex index 4e1d4e29..f0d1c302 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/ex_unit.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/ex_unit.ex @@ -1,6 +1,5 @@ defmodule Engine.Search.Indexer.Extractors.ExUnit do alias Engine.Analyzer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Metadata alias Engine.Search.Indexer.Source.Reducer alias Forge.Ast @@ -8,6 +7,7 @@ defmodule Engine.Search.Indexer.Extractors.ExUnit do alias Forge.Document.Position alias Forge.Document.Range alias Forge.Formats + alias Forge.Search.Indexer.Entry require Logger diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/function_definition.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/function_definition.ex index cafb61cc..e1972a65 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/function_definition.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/function_definition.ex @@ -1,10 +1,10 @@ defmodule Engine.Search.Indexer.Extractors.FunctionDefinition do alias Engine.Analyzer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Source.Reducer alias Engine.Search.Subject alias Forge.Ast alias Forge.Ast.Analysis + alias Forge.Search.Indexer.Entry @function_definitions [:def, :defp] diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/function_reference.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/function_reference.ex index 801b3362..de8ac680 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/function_reference.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/function_reference.ex @@ -1,5 +1,4 @@ defmodule Engine.Search.Indexer.Extractors.FunctionReference do - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Extractors.FunctionDefinition alias Engine.Search.Indexer.Metadata alias Engine.Search.Indexer.Source.Reducer @@ -7,6 +6,7 @@ defmodule Engine.Search.Indexer.Extractors.FunctionReference do alias Forge.Ast alias Forge.Document.Position alias Forge.Document.Range + alias Forge.Search.Indexer.Entry require Logger diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/module.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/module.ex index 4883a059..32878336 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/module.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/module.ex @@ -3,15 +3,15 @@ defmodule Engine.Search.Indexer.Extractors.Module do Extracts module references and definitions from AST """ - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Metadata - alias Engine.Search.Indexer.Source.Block alias Engine.Search.Indexer.Source.Reducer alias Engine.Search.Subject alias Forge.Ast alias Forge.Document.Position alias Forge.Document.Range alias Forge.ProcessCache + alias Forge.Search.Indexer.Entry + alias Forge.Search.Indexer.Source.Block require Logger diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/module_attribute.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/module_attribute.ex index af6ab2f9..aa025bf9 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/module_attribute.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/module_attribute.ex @@ -4,11 +4,11 @@ defmodule Engine.Search.Indexer.Extractors.ModuleAttribute do """ alias Engine.Analyzer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Source.Reducer alias Engine.Search.Subject alias Forge.Document.Position alias Forge.Document.Range + alias Forge.Search.Indexer.Entry require Logger diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/struct_definition.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/struct_definition.ex index c9b2fec0..d10446e5 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/struct_definition.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/struct_definition.ex @@ -1,8 +1,8 @@ defmodule Engine.Search.Indexer.Extractors.StructDefinition do alias Engine.Analyzer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Source.Reducer alias Forge.Ast + alias Forge.Search.Indexer.Entry def extract({:defstruct, _, [_fields]} = definition, %Reducer{} = reducer) do document = reducer.analysis.document diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/struct_reference.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/struct_reference.ex index 5621cd6c..1733684f 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/struct_reference.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/struct_reference.ex @@ -1,9 +1,9 @@ defmodule Engine.Search.Indexer.Extractors.StructReference do alias Engine.Analyzer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Source.Reducer alias Engine.Search.Subject alias Forge.Ast + alias Forge.Search.Indexer.Entry require Logger diff --git a/apps/engine/lib/engine/engine/search/indexer/extractors/variable.ex b/apps/engine/lib/engine/engine/search/indexer/extractors/variable.ex index 41c32fe4..8679ba32 100644 --- a/apps/engine/lib/engine/engine/search/indexer/extractors/variable.ex +++ b/apps/engine/lib/engine/engine/search/indexer/extractors/variable.ex @@ -1,8 +1,8 @@ defmodule Engine.Search.Indexer.Extractors.Variable do alias Engine.Analyzer - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Source.Reducer alias Forge.Ast + alias Forge.Search.Indexer.Entry @defs [:def, :defmacro, :defp, :defmacrop] diff --git a/apps/engine/lib/engine/engine/search/indexer/source/reducer.ex b/apps/engine/lib/engine/engine/search/indexer/source/reducer.ex index 6c4580a8..6f94ebcb 100644 --- a/apps/engine/lib/engine/engine/search/indexer/source/reducer.ex +++ b/apps/engine/lib/engine/engine/search/indexer/source/reducer.ex @@ -6,12 +6,12 @@ defmodule Engine.Search.Indexer.Source.Reducer do with the AST's overall structure, and can focus on extracting content from it. """ - alias Engine.Search.Indexer.Entry alias Engine.Search.Indexer.Extractors alias Engine.Search.Indexer.Metadata - alias Engine.Search.Indexer.Source.Block alias Forge.Ast.Analysis alias Forge.Document.Position + alias Forge.Search.Indexer.Entry + alias Forge.Search.Indexer.Source.Block defstruct [:analysis, :entries, :position, :blocks, :block_hierarchy, extractors: []] diff --git a/apps/engine/lib/engine/engine/search/store.ex b/apps/engine/lib/engine/engine/search/store.ex index 190ce2a2..b6f160df 100644 --- a/apps/engine/lib/engine/engine/search/store.ex +++ b/apps/engine/lib/engine/engine/search/store.ex @@ -3,13 +3,13 @@ defmodule Engine.Search.Store do A persistent store for search entries """ - alias Forge.Project - - alias Engine.Api - alias Engine.Search.Indexer.Entry alias Engine.Search.Store alias Engine.Search.Store.State + alias Forge.EngineApi + alias Forge.Project + alias Forge.Search.Indexer.Entry + @type index_state :: :empty | :stale @type existing_entries :: [Entry.t()] @type new_entries :: [Entry.t()] @@ -36,7 +36,7 @@ defmodule Engine.Search.Store do 2500 ) - import Api.Messages + import EngineApi.Messages use GenServer require Logger diff --git a/apps/engine/lib/engine/engine/search/store/backend.ex b/apps/engine/lib/engine/engine/search/store/backend.ex index 02ca0652..d9f02b2e 100644 --- a/apps/engine/lib/engine/engine/search/store/backend.ex +++ b/apps/engine/lib/engine/engine/search/store/backend.ex @@ -2,8 +2,8 @@ defmodule Engine.Search.Store.Backend do @moduledoc """ A behaviour for search store backends """ - alias Engine.Search.Indexer.Entry alias Forge.Project + alias Forge.Search.Indexer.Entry @type version :: pos_integer() diff --git a/apps/engine/lib/engine/engine/search/store/backends/ets.ex b/apps/engine/lib/engine/engine/search/store/backends/ets.ex index bafd854f..f5952ac3 100644 --- a/apps/engine/lib/engine/engine/search/store/backends/ets.ex +++ b/apps/engine/lib/engine/engine/search/store/backends/ets.ex @@ -1,8 +1,8 @@ defmodule Engine.Search.Store.Backends.Ets do - alias Engine.Search.Indexer.Entry alias Engine.Search.Store.Backend alias Engine.Search.Store.Backends.Ets.State alias Forge.Project + alias Forge.Search.Indexer.Entry use GenServer diff --git a/apps/engine/lib/engine/engine/search/store/backends/ets/schema.ex b/apps/engine/lib/engine/engine/search/store/backends/ets/schema.ex index d7517a5b..e2b6b265 100644 --- a/apps/engine/lib/engine/engine/search/store/backends/ets/schema.ex +++ b/apps/engine/lib/engine/engine/search/store/backends/ets/schema.ex @@ -43,9 +43,9 @@ defmodule Engine.Search.Store.Backends.Ets.Schema do end end - alias Engine.Search.Indexer.Entry alias Engine.Search.Store.Backends.Ets.Wal alias Forge.Project + alias Forge.Search.Indexer.Entry import Wal, only: :macros diff --git a/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v1.ex b/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v1.ex index 502f81d9..7bcc3df8 100644 --- a/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v1.ex +++ b/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v1.ex @@ -9,8 +9,8 @@ defmodule Engine.Search.Store.Backends.Ets.Schemas.V1 do """ - alias Engine.Search.Indexer.Entry alias Engine.Search.Store.Backends.Ets.Schema + alias Forge.Search.Indexer.Entry use Schema, version: 1 diff --git a/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v2.ex b/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v2.ex index 13fec328..f582bc53 100644 --- a/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v2.ex +++ b/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v2.ex @@ -1,6 +1,6 @@ defmodule Engine.Search.Store.Backends.Ets.Schemas.V2 do - alias Engine.Search.Indexer.Entry alias Engine.Search.Store.Backends.Ets.Schema + alias Forge.Search.Indexer.Entry require Entry use Schema, version: 2 diff --git a/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v3.ex b/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v3.ex index 19713ca2..d7579cde 100644 --- a/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v3.ex +++ b/apps/engine/lib/engine/engine/search/store/backends/ets/schemas/v3.ex @@ -1,6 +1,6 @@ defmodule Engine.Search.Store.Backends.Ets.Schemas.V3 do - alias Engine.Search.Indexer.Entry alias Engine.Search.Store.Backends.Ets.Schema + alias Forge.Search.Indexer.Entry require Entry use Schema, version: 3 diff --git a/apps/engine/lib/engine/engine/search/store/backends/ets/state.ex b/apps/engine/lib/engine/engine/search/store/backends/ets/state.ex index 59ebb1ae..06c6ebdf 100644 --- a/apps/engine/lib/engine/engine/search/store/backends/ets/state.ex +++ b/apps/engine/lib/engine/engine/search/store/backends/ets/state.ex @@ -5,11 +5,11 @@ defmodule Engine.Search.Store.Backends.Ets.State do This backend uses an ETS table to store its data using a schema defined in the schemas submodule. """ - alias Engine.Search.Indexer.Entry alias Engine.Search.Store.Backends.Ets.Schema alias Engine.Search.Store.Backends.Ets.Schemas alias Engine.Search.Store.Backends.Ets.Wal alias Forge.Project + alias Forge.Search.Indexer.Entry @schema_order [ Schemas.LegacyV0, diff --git a/apps/engine/lib/engine/engine/search/store/state.ex b/apps/engine/lib/engine/engine/search/store/state.ex index 5179d328..7d2b6f90 100644 --- a/apps/engine/lib/engine/engine/search/store/state.ex +++ b/apps/engine/lib/engine/engine/search/store/state.ex @@ -1,9 +1,9 @@ defmodule Engine.Search.Store.State do - alias Engine.Api.Messages alias Engine.Dispatch alias Engine.Search.Fuzzy - alias Engine.Search.Indexer.Entry + alias Forge.EngineApi.Messages alias Forge.Project + alias Forge.Search.Indexer.Entry require Logger import Messages diff --git a/apps/engine/lib/mix/tasks/namespace/path.ex b/apps/engine/lib/mix/tasks/namespace/path.ex deleted file mode 100644 index aaf1778f..00000000 --- a/apps/engine/lib/mix/tasks/namespace/path.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule Mix.Tasks.Namespace.Path do - alias Mix.Tasks.Namespace - - def apply(path) when is_list(path) do - path - |> List.to_string() - |> apply() - |> String.to_charlist() - end - - def apply(path) when is_binary(path) do - path - |> Path.split() - |> Enum.map(&replace_namespaced_apps/1) - |> Path.join() - end - - defp replace_namespaced_apps(path_component) do - Enum.reduce(Namespace.app_names(), path_component, fn app_name, path -> - if path == Atom.to_string(app_name) do - app_name - |> Namespace.Module.apply() - |> Atom.to_string() - else - path - end - end) - end -end diff --git a/apps/engine/mix.exs b/apps/engine/mix.exs index 0b24e811..f0450dcd 100644 --- a/apps/engine/mix.exs +++ b/apps/engine/mix.exs @@ -41,18 +41,18 @@ defmodule Engine.MixProject do defp deps do [ {:benchee, "~> 1.3", only: :test}, - {:forge, path: "../forge", env: Mix.env()}, Mix.Credo.dependency(), Mix.Dialyzer.dependency(), {:elixir_sense, github: "elixir-lsp/elixir_sense", ref: "73ce7e0d239342fb9527d7ba567203e77dbb9b25"}, + {:forge, path: "../forge", env: Mix.env()}, {:gen_lsp, "~> 0.11"}, {:patch, "~> 0.15", only: [:dev, :test], optional: true, runtime: false}, {:path_glob, "~> 0.2", optional: true}, {:phoenix_live_view, "~> 1.0", only: [:test], optional: true, runtime: false}, {:sourceror, "~> 1.9"}, {:stream_data, "~> 1.1", only: [:test], runtime: false}, - {:refactorex, "~> 0.1.51"} + {:refactorex, "~> 0.1.52"} ] end diff --git a/apps/engine/mix.lock b/apps/engine/mix.lock index 947b1e67..35ca2232 100644 --- a/apps/engine/mix.lock +++ b/apps/engine/mix.lock @@ -22,10 +22,10 @@ "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, "plug": {:hex, :plug, "1.17.0", "a0832e7af4ae0f4819e0c08dd2e7482364937aea6a8a997a679f2cbb7e026b2e", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6692046652a69a00a5a21d0b7e11fcf401064839d59d6b8787f23af55b1e6bc"}, "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, - "refactorex": {:hex, :refactorex, "0.1.51", "74fc4603b31b600d78539ffea9fe170038aa8d471eec5aed261354c9734b4b27", [:mix], [{:sourceror, "~> 1.7", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "aefa150ab2c0d62aa8c01c4d04b932806118790f09c4106e20883281932fba03"}, + "refactorex": {:hex, :refactorex, "0.1.52", "22a69062c84e0f20a752d3d6580269c09c242645ee4f722f03d4270dd8cbf218", [:mix], [{:sourceror, "~> 1.7", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "4927fe6c3acd1f4695d6d3e443380167d61d004d507b1279c6084433900c94d0"}, "schematic": {:hex, :schematic, "0.2.1", "0b091df94146fd15a0a343d1bd179a6c5a58562527746dadd09477311698dbb1", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"}, "snowflake": {:hex, :snowflake, "1.0.4", "8433b4e04fbed19272c55e1b7de0f7a1ee1230b3ae31a813b616fd6ef279e87a", [:mix], [], "hexpm", "badb07ebb089a5cff737738297513db3962760b10fe2b158ae3bebf0b4d5be13"}, - "sourceror": {:hex, :sourceror, "1.9.0", "3bf5fe2d017aaabe3866d8a6da097dd7c331e0d2d54e59e21c2b066d47f1e08e", [:mix], [], "hexpm", "d20a9dd5efe162f0d75a307146faa2e17b823ea4f134f662358d70f0332fed82"}, + "sourceror": {:hex, :sourceror, "1.10.0", "38397dedbbc286966ec48c7af13e228b171332be1ad731974438c77791945ce9", [:mix], [], "hexpm", "29dbdfc92e04569c9d8e6efdc422fc1d815f4bd0055dc7c51b8800fb75c4b3f1"}, "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, "stream_data": {:hex, :stream_data, "1.2.0", "58dd3f9e88afe27dc38bef26fce0c84a9e7a96772b2925c7b32cd2435697a52b", [:mix], [], "hexpm", "eb5c546ee3466920314643edf68943a5b14b32d1da9fe01698dc92b73f89a9ed"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, diff --git a/apps/engine/priv/.gitkeep b/apps/engine/priv/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/apps/engine/test/engine/api/proxy/buffering_state_test.exs b/apps/engine/test/engine/api/proxy/buffering_state_test.exs index 49adc6cf..4c66f730 100644 --- a/apps/engine/test/engine/api/proxy/buffering_state_test.exs +++ b/apps/engine/test/engine/api/proxy/buffering_state_test.exs @@ -1,13 +1,12 @@ defmodule Engine.Api.Proxy.BufferingStateStateTest do - alias Forge.Document - - alias Engine.Api.Messages alias Engine.Api.Proxy alias Engine.Api.Proxy.BufferingState alias Engine.Build alias Engine.Commands + alias Forge.Document + alias Forge.EngineApi.Messages - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Messages import Proxy.Records diff --git a/apps/engine/test/engine/api/proxy_test.exs b/apps/engine/test/engine/api/proxy_test.exs index 69661b9c..a1e9b548 100644 --- a/apps/engine/test/engine/api/proxy_test.exs +++ b/apps/engine/test/engine/api/proxy_test.exs @@ -1,8 +1,4 @@ defmodule Engine.Api.ProxyTest do - alias Forge.Document - alias Forge.Document.Changes - - alias Engine.Api alias Engine.Api.Proxy alias Engine.Api.Proxy.BufferingState alias Engine.Api.Proxy.DrainingState @@ -11,14 +7,17 @@ defmodule Engine.Api.ProxyTest do alias Engine.Commands alias Engine.Dispatch + alias Forge.Document + alias Forge.Document.Changes + use ExUnit.Case use Patch - import Api.Messages - import Engine.Test.Fixtures + import Forge.EngineApi.Messages + import Forge.Test.Fixtures setup do - start_supervised!(Api.Proxy) + start_supervised!(Proxy) project = project() Engine.set_project(project) diff --git a/apps/engine/test/engine/build/state_test.exs b/apps/engine/test/engine/build/state_test.exs index 8041e8bb..b9e834fa 100644 --- a/apps/engine/test/engine/build/state_test.exs +++ b/apps/engine/test/engine/build/state_test.exs @@ -5,7 +5,7 @@ defmodule Engine.Build.StateTest do alias Forge.Document alias Forge.Project - import Engine.Test.Fixtures + import Forge.Test.Fixtures use ExUnit.Case, async: false use Patch diff --git a/apps/engine/test/engine/code_action/handlers/add_alias_test.exs b/apps/engine/test/engine/code_action/handlers/add_alias_test.exs index ed104f14..da5b601a 100644 --- a/apps/engine/test/engine/code_action/handlers/add_alias_test.exs +++ b/apps/engine/test/engine/code_action/handlers/add_alias_test.exs @@ -11,7 +11,7 @@ defmodule Engine.CodeAction.Handlers.AddAliasTest do import Forge.Test.CursorSupport import Forge.Test.CodeSigil - use Engine.Test.CodeMod.Case, enable_ast_conversion: false + use Forge.Test.CodeMod.Case, enable_ast_conversion: false use Patch setup do diff --git a/apps/engine/test/engine/code_action/handlers/organize_aliases_test.exs b/apps/engine/test/engine/code_action/handlers/organize_aliases_test.exs index 499eff0d..3ad96f7c 100644 --- a/apps/engine/test/engine/code_action/handlers/organize_aliases_test.exs +++ b/apps/engine/test/engine/code_action/handlers/organize_aliases_test.exs @@ -7,7 +7,7 @@ defmodule Engine.CodeAction.Handlers.OrganizeAliasesTest do import Forge.Test.CursorSupport import Forge.Test.CodeSigil - use Engine.Test.CodeMod.Case, enable_ast_conversion: false + use Forge.Test.CodeMod.Case, enable_ast_conversion: false use Patch setup do diff --git a/apps/engine/test/engine/code_action/handlers/refactorex_test.exs b/apps/engine/test/engine/code_action/handlers/refactorex_test.exs index a52388f9..c571bbab 100644 --- a/apps/engine/test/engine/code_action/handlers/refactorex_test.exs +++ b/apps/engine/test/engine/code_action/handlers/refactorex_test.exs @@ -1,5 +1,5 @@ defmodule Engine.CodeAction.Handlers.RefactorexTest do - use Engine.Test.CodeMod.Case + use Forge.Test.CodeMod.Case alias Engine.CodeAction.Handlers.Refactorex alias Forge.Document diff --git a/apps/engine/test/engine/code_action/handlers/remove_unused_alias_test.exs b/apps/engine/test/engine/code_action/handlers/remove_unused_alias_test.exs index 1ce0adbc..d67c3679 100644 --- a/apps/engine/test/engine/code_action/handlers/remove_unused_alias_test.exs +++ b/apps/engine/test/engine/code_action/handlers/remove_unused_alias_test.exs @@ -1,14 +1,14 @@ defmodule Engine.CodeAction.Handlers.RemoveUnusedAliasTest do - alias Engine.CodeAction.Diagnostic alias Engine.CodeAction.Handlers.RemoveUnusedAlias alias Forge.Ast + alias Forge.CodeAction.Diagnostic alias Forge.Document alias Forge.Document.Range import Forge.Test.CursorSupport import Forge.Test.CodeSigil - use Engine.Test.CodeMod.Case, enable_ast_conversion: false + use Forge.Test.CodeMod.Case, enable_ast_conversion: false def apply_code_mod(original_text, _ast, options) do Document.Store.open("file:///file.ex", original_text, 1) diff --git a/apps/engine/test/engine/code_action/handlers/replace_remote_function_test.exs b/apps/engine/test/engine/code_action/handlers/replace_remote_function_test.exs index baed29e9..330d52a6 100644 --- a/apps/engine/test/engine/code_action/handlers/replace_remote_function_test.exs +++ b/apps/engine/test/engine/code_action/handlers/replace_remote_function_test.exs @@ -1,9 +1,9 @@ defmodule Engine.CodeAction.Handlers.ReplaceRemoteFunctionTest do - alias Engine.CodeAction.Diagnostic alias Engine.CodeAction.Handlers.ReplaceRemoteFunction + alias Forge.CodeAction.Diagnostic alias Forge.Document - use Engine.Test.CodeMod.Case + use Forge.Test.CodeMod.Case setup do start_supervised!({Document.Store, derive: [analysis: &Forge.Ast.analyze/1]}) diff --git a/apps/engine/test/engine/code_action/handlers/replace_with_underscore_test.exs b/apps/engine/test/engine/code_action/handlers/replace_with_underscore_test.exs index e37e37b5..fa070222 100644 --- a/apps/engine/test/engine/code_action/handlers/replace_with_underscore_test.exs +++ b/apps/engine/test/engine/code_action/handlers/replace_with_underscore_test.exs @@ -1,9 +1,9 @@ defmodule Engine.CodeAction.Handlers.ReplaceWithUnderscoreTest do - alias Engine.CodeAction.Diagnostic alias Engine.CodeAction.Handlers.ReplaceWithUnderscore + alias Forge.CodeAction.Diagnostic alias Forge.Document - use Engine.Test.CodeMod.Case + use Forge.Test.CodeMod.Case def apply_code_mod(original_text, _ast, options) do variable = Keyword.get(options, :variable, :unused) diff --git a/apps/engine/test/engine/code_intelligence/entity_test.exs b/apps/engine/test/engine/code_intelligence/entity_test.exs index 1c80b538..ea216b66 100644 --- a/apps/engine/test/engine/code_intelligence/entity_test.exs +++ b/apps/engine/test/engine/code_intelligence/entity_test.exs @@ -5,7 +5,7 @@ defmodule Engine.CodeIntelligence.EntityTest do import ExUnit.CaptureIO import Forge.Test.CodeSigil import Forge.Test.CursorSupport - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Forge.Test.RangeSupport use ExUnit.Case diff --git a/apps/engine/test/engine/code_intelligence/references_test.exs b/apps/engine/test/engine/code_intelligence/references_test.exs index 4ae8ab04..9e9ba968 100644 --- a/apps/engine/test/engine/code_intelligence/references_test.exs +++ b/apps/engine/test/engine/code_intelligence/references_test.exs @@ -10,7 +10,7 @@ defmodule Engine.CodeIntelligence.ReferencesTest do import Forge.Test.CodeSigil import Forge.Test.CursorSupport - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Forge.Test.RangeSupport import Forge.Test.EventualAssertions diff --git a/apps/engine/test/engine/code_intelligence/symbols_test.exs b/apps/engine/test/engine/code_intelligence/symbols_test.exs index afd1a656..1f1e9778 100644 --- a/apps/engine/test/engine/code_intelligence/symbols_test.exs +++ b/apps/engine/test/engine/code_intelligence/symbols_test.exs @@ -2,7 +2,7 @@ defmodule Engine.CodeIntelligence.SymbolsTest do alias Engine.CodeIntelligence.Symbols alias Engine.Search.Indexer.Extractors alias Engine.Search.Indexer.Source - alias Forge.Document + alias Forge.CodeIntelligence.Symbols.Document use ExUnit.Case use Patch @@ -11,13 +11,13 @@ defmodule Engine.CodeIntelligence.SymbolsTest do import Forge.Test.RangeSupport def document_symbols(code) do - doc = Document.new("file:///file.ex", code, 1) + doc = Forge.Document.new("file:///file.ex", code, 1) symbols = Symbols.for_document(doc) {symbols, doc} end def workspace_symbols(code) do - doc = Document.new("file:///file.ex", code, 1) + doc = Forge.Document.new("file:///file.ex", code, 1) {:ok, entries} = Source.index_document(doc, [ @@ -45,7 +45,7 @@ defmodule Engine.CodeIntelligence.SymbolsTest do describe "document symbols" do test "a top level module is found" do - {[%Symbols.Document{} = module], doc} = + {[%Document{} = module], doc} = ~q[ defmodule MyModule do end diff --git a/apps/engine/test/engine/code_mod/aliases_test.exs b/apps/engine/test/engine/code_mod/aliases_test.exs index 1d9a8db2..24c36cd3 100644 --- a/apps/engine/test/engine/code_mod/aliases_test.exs +++ b/apps/engine/test/engine/code_mod/aliases_test.exs @@ -4,7 +4,7 @@ defmodule Engine.CodeMod.AliasesTest do alias Engine.CodeMod.Aliases import Forge.Test.CursorSupport - use Engine.Test.CodeMod.Case + use Forge.Test.CodeMod.Case use Patch setup do diff --git a/apps/engine/test/engine/code_mod/diff_test.exs b/apps/engine/test/engine/code_mod/diff_test.exs index 5f3094e8..ab3b7605 100644 --- a/apps/engine/test/engine/code_mod/diff_test.exs +++ b/apps/engine/test/engine/code_mod/diff_test.exs @@ -4,7 +4,7 @@ defmodule Engine.CodeMod.DiffTest do alias Forge.Document.Edit alias Forge.Document.Range - use Engine.Test.CodeMod.Case + use Forge.Test.CodeMod.Case use Forge.Test.PositionSupport def edit(start_line, start_code_unit, end_line, end_code_unit, replacement) do diff --git a/apps/engine/test/engine/code_mod/format_test.exs b/apps/engine/test/engine/code_mod/format_test.exs index 6d60cc81..35870d25 100644 --- a/apps/engine/test/engine/code_mod/format_test.exs +++ b/apps/engine/test/engine/code_mod/format_test.exs @@ -1,14 +1,12 @@ # credo:disable-for-this-file Credo.Check.Readability.RedundantBlankLines defmodule Engine.CodeMod.FormatTest do - alias Engine.Api.Messages alias Engine.Build alias Engine.CodeMod.Format alias Forge.Document alias Forge.Project - use Engine.Test.CodeMod.Case, enable_ast_conversion: false + use Forge.Test.CodeMod.Case, enable_ast_conversion: false use Patch - import Messages def apply_code_mod(text, _ast, opts) do project = Keyword.get(opts, :project) @@ -52,13 +50,6 @@ defmodule Engine.CodeMod.FormatTest do ]t end - def with_real_project(%{project: project}) do - {:ok, _} = start_supervised({Engine.ProjectNodeSupervisor, project}) - {:ok, _, _} = Engine.start_link(project) - Engine.Api.register_listener(project, self(), [:all]) - :ok - end - def with_patched_build(_) do patch(Build, :compile_document, fn _, _ -> :ok end) :ok @@ -124,20 +115,4 @@ defmodule Engine.CodeMod.FormatTest do assert result == formatted() end end - - describe "emitting diagnostics" do - setup [:with_real_project] - - test "it should emit diagnostics when a syntax error occurs", %{project: project} do - text = ~q[ - def foo(a, ) do - end - ] - document = document("file:///file.ex", text) - Engine.Api.format(project, document) - - assert_receive file_diagnostics(diagnostics: [diagnostic]), 500 - assert diagnostic.message =~ "syntax error" - end - end end diff --git a/apps/engine/test/engine/commands/reindex_test.exs b/apps/engine/test/engine/commands/reindex_test.exs index eeddff64..d49e3ef8 100644 --- a/apps/engine/test/engine/commands/reindex_test.exs +++ b/apps/engine/test/engine/commands/reindex_test.exs @@ -4,7 +4,7 @@ defmodule Engine.Commands.ReindexTest do alias Forge.Document import Forge.Test.EventualAssertions - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Engine.Test.Entry.Builder use ExUnit.Case diff --git a/apps/engine/test/engine/completion/candidate/argument_names_test.exs b/apps/engine/test/engine/completion/candidate/argument_names_test.exs index 3a871f10..58aa4198 100644 --- a/apps/engine/test/engine/completion/candidate/argument_names_test.exs +++ b/apps/engine/test/engine/completion/candidate/argument_names_test.exs @@ -1,5 +1,5 @@ -defmodule Engine.Completion.Candidate.ArgumentNamesTest do - alias Engine.Completion.Candidate.ArgumentNames +defmodule Forge.Completion.Candidate.ArgumentNamesTest do + alias Forge.Completion.Candidate.ArgumentNames use ExUnit.Case import ArgumentNames diff --git a/apps/engine/test/engine/completion_test.exs b/apps/engine/test/engine/completion_test.exs index 2c5b232a..ddcad527 100644 --- a/apps/engine/test/engine/completion_test.exs +++ b/apps/engine/test/engine/completion_test.exs @@ -6,7 +6,7 @@ defmodule Engine.CompletionTest do import Forge.Test.CodeSigil import Forge.Test.CursorSupport - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Forge.Test.Quiet use ExUnit.Case, async: true diff --git a/apps/engine/test/engine/dispatch/handler_test.exs b/apps/engine/test/engine/dispatch/handler_test.exs index 927407fc..59c65995 100644 --- a/apps/engine/test/engine/dispatch/handler_test.exs +++ b/apps/engine/test/engine/dispatch/handler_test.exs @@ -1,6 +1,6 @@ defmodule Engine.Dispatch.HandlerTest do - alias Engine.Api.Messages alias Engine.Dispatch + alias Forge.EngineApi.Messages import Messages use ExUnit.Case diff --git a/apps/engine/test/engine/dispatch/handlers/indexer_test.exs b/apps/engine/test/engine/dispatch/handlers/indexer_test.exs index be21eb82..ca4776a3 100644 --- a/apps/engine/test/engine/dispatch/handlers/indexer_test.exs +++ b/apps/engine/test/engine/dispatch/handlers/indexer_test.exs @@ -1,15 +1,14 @@ defmodule Engine.Dispatch.Handlers.IndexingTest do alias Forge.Document - alias Engine.Api alias Engine.Commands alias Engine.Dispatch.Handlers.Indexing alias Engine.Search - import Api.Messages + import Forge.EngineApi.Messages import Forge.Test.CodeSigil import Forge.Test.EventualAssertions - import Engine.Test.Fixtures + import Forge.Test.Fixtures use ExUnit.Case use Patch diff --git a/apps/engine/test/engine/dispatch_test.exs b/apps/engine/test/engine/dispatch_test.exs index 0ddb2688..d261c489 100644 --- a/apps/engine/test/engine/dispatch_test.exs +++ b/apps/engine/test/engine/dispatch_test.exs @@ -1,6 +1,6 @@ defmodule Engine.DispatchTest do - alias Engine.Api.Messages alias Engine.Dispatch + alias Forge.EngineApi.Messages import Messages use ExUnit.Case diff --git a/apps/engine/test/engine/module_mappings_test.exs b/apps/engine/test/engine/module_mappings_test.exs index 3a4def9b..7ea19950 100644 --- a/apps/engine/test/engine/module_mappings_test.exs +++ b/apps/engine/test/engine/module_mappings_test.exs @@ -5,7 +5,7 @@ defmodule Engine.ModuleMappingsTest do use ExUnit.Case use Forge.Test.EventualAssertions - import Engine.Api.Messages + import Forge.EngineApi.Messages setup do start_supervised!(Dispatch) diff --git a/apps/engine/test/engine/progress_test.exs b/apps/engine/test/engine/progress_test.exs index 6daa4ad6..19b12a04 100644 --- a/apps/engine/test/engine/progress_test.exs +++ b/apps/engine/test/engine/progress_test.exs @@ -1,7 +1,7 @@ defmodule Engine.ProgressTest do alias Engine.Progress - import Engine.Api.Messages + import Forge.EngineApi.Messages use ExUnit.Case use Patch diff --git a/apps/engine/test/engine/search/indexer/extractors/function_definition_test.exs b/apps/engine/test/engine/search/indexer/extractors/function_definition_test.exs index 3d7941c1..2902face 100644 --- a/apps/engine/test/engine/search/indexer/extractors/function_definition_test.exs +++ b/apps/engine/test/engine/search/indexer/extractors/function_definition_test.exs @@ -1,5 +1,5 @@ defmodule Engine.Search.Indexer.Extractors.FunctionDefinitionTest do - alias Engine.Search.Indexer.Entry + alias Forge.Search.Indexer.Entry use Engine.Test.ExtractorCase def index(source) do diff --git a/apps/engine/test/engine/search/indexer_test.exs b/apps/engine/test/engine/search/indexer_test.exs index 29379b6c..25965518 100644 --- a/apps/engine/test/engine/search/indexer_test.exs +++ b/apps/engine/test/engine/search/indexer_test.exs @@ -1,12 +1,12 @@ defmodule Engine.Search.IndexerTest do alias Engine.Dispatch alias Engine.Search.Indexer - alias Engine.Search.Indexer.Entry alias Forge.Project + alias Forge.Search.Indexer.Entry use ExUnit.Case use Patch - import Engine.Test.Fixtures + import Forge.Test.Fixtures defmodule FakeBackend do def set_entries(entries) when is_list(entries) do diff --git a/apps/engine/test/engine/search/store/backends/ets/schema_test.exs b/apps/engine/test/engine/search/store/backends/ets/schema_test.exs index 67f1c82e..f52a03de 100644 --- a/apps/engine/test/engine/search/store/backends/ets/schema_test.exs +++ b/apps/engine/test/engine/search/store/backends/ets/schema_test.exs @@ -3,7 +3,7 @@ defmodule Engine.Search.Store.Backends.Ets.SchemaTest do alias Engine.Search.Store.Backends.Ets.Wal alias Forge.Project - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Wal, only: :macros use ExUnit.Case diff --git a/apps/engine/test/engine/search/store/backends/ets/wal_test.exs b/apps/engine/test/engine/search/store/backends/ets/wal_test.exs index ea812cec..8cff9050 100644 --- a/apps/engine/test/engine/search/store/backends/ets/wal_test.exs +++ b/apps/engine/test/engine/search/store/backends/ets/wal_test.exs @@ -1,7 +1,7 @@ defmodule Engine.Search.Store.Backends.Ets.WalTest do alias Engine.Search.Store.Backends.Ets.Wal - import Engine.Test.Fixtures + import Forge.Test.Fixtures use ExUnit.Case use Patch diff --git a/apps/engine/test/engine/search/store/backends/ets_test.exs b/apps/engine/test/engine/search/store/backends/ets_test.exs index 786c3a88..b6efd3e0 100644 --- a/apps/engine/test/engine/search/store/backends/ets_test.exs +++ b/apps/engine/test/engine/search/store/backends/ets_test.exs @@ -3,9 +3,9 @@ defmodule Engine.Search.Store.Backend.EtsTest do alias Engine.Search.Store alias Engine.Search.Store.Backends alias Engine.Test.Entry - alias Engine.Test.Fixtures alias Forge.Project alias Forge.Test.EventualAssertions + alias Forge.Test.Fixtures use ExUnit.Case, async: false diff --git a/apps/engine/test/engine/search/store_test.exs b/apps/engine/test/engine/search/store_test.exs index 7628e096..0fbd2a71 100644 --- a/apps/engine/test/engine/search/store_test.exs +++ b/apps/engine/test/engine/search/store_test.exs @@ -1,16 +1,15 @@ defmodule Engine.Search.StoreTest do alias Engine.Dispatch alias Engine.Search.Indexer - alias Engine.Search.Indexer.Entry alias Engine.Search.Store alias Engine.Search.Store.Backends.Ets - alias Engine.Test.Entry - alias Engine.Test.Fixtures + alias Forge.Search.Indexer.Entry alias Forge.Test.EventualAssertions + alias Forge.Test.Fixtures use ExUnit.Case, async: false - import Entry.Builder + import Engine.Test.Entry.Builder import EventualAssertions import Fixtures import Forge.Test.CodeSigil @@ -246,7 +245,7 @@ defmodule Engine.Search.StoreTest do end test "findidng siblings of a non-existent entry" do - assert :error = Store.siblings(%Indexer.Entry{}) + assert :error = Store.siblings(%Entry{}) end test "finding a parent in a function" do @@ -324,7 +323,7 @@ defmodule Engine.Search.StoreTest do end test "finding a non-existent entry" do - assert Store.parent(%Indexer.Entry{}) == :error + assert Store.parent(%Entry{}) == :error end end end diff --git a/apps/engine/test/fixtures/project/.expert/project.log b/apps/engine/test/fixtures/project/.expert/project.log new file mode 100644 index 00000000..629181fb --- /dev/null +++ b/apps/engine/test/fixtures/project/.expert/project.log @@ -0,0 +1,316 @@ +2025-06-27T17:55:07.711895-03:00 error: ** Connection attempt from node 'project-project-26527@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:12.896484-03:00 error: ** Connection attempt from node 'project-project-32261@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:15.909631-03:00 error: ** Connection attempt from node 'project-project-35017@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:18.838230-03:00 error: ** Connection attempt from node 'project-project-46677@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:21.590215-03:00 error: ** Connection attempt from node 'project-project-29311@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:24.319625-03:00 error: ** Connection attempt from node 'project-project-59859@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:26.971925-03:00 error: ** Connection attempt from node 'project-project-36574@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:33.457528-03:00 error: ** Connection attempt from node 'project-project-22049@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:34.006338-03:00 error: ** Connection attempt from node 'project-project-52198@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:36.647764-03:00 error: ** Connection attempt from node 'project-project-65331@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:39.641319-03:00 error: ** Connection attempt from node 'project-project-10217@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:40.121935-03:00 error: ** Connection attempt from node 'project-project-11812@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:40.746678-03:00 error: ** Connection attempt from node 'project-project-23124@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:41.243479-03:00 error: ** Connection attempt from node 'project-project-51954@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:41.849064-03:00 error: ** Connection attempt from node 'project-project-3854@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:42.334043-03:00 error: ** Connection attempt from node 'project-project-38967@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:45.296391-03:00 error: ** Connection attempt from node 'project-project-48366@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:48.038275-03:00 error: ** Connection attempt from node 'project-project-10642@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T17:55:52.843072-03:00 error: ** Connection attempt from node 'project-project-55893@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:15.134189-03:00 error: ** Connection attempt from node 'project-project-24330@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:15.627743-03:00 error: ** Connection attempt from node 'project-project-5224@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:16.187446-03:00 error: ** Connection attempt from node 'project-project-53048@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:17.007827-03:00 error: ** Connection attempt from node 'project-project-17072@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:17.488831-03:00 error: ** Connection attempt from node 'project-project-14105@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:20.440570-03:00 error: ** Connection attempt from node 'project-project-46561@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:24.535754-03:00 error: ** Connection attempt from node 'project-project-20685@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:27.230938-03:00 error: ** Connection attempt from node 'project-project-64865@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:30.361143-03:00 error: ** Connection attempt from node 'project-project-10067@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:33.285299-03:00 error: ** Connection attempt from node 'project-project-57225@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:37.175945-03:00 error: ** Connection attempt from node 'project-project-24942@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:39.459734-03:00 error: ** Connection attempt from node 'project-project-3249@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:40.137355-03:00 error: ** Connection attempt from node 'project-project-52514@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:42.753815-03:00 error: ** Connection attempt from node 'project-project-33241@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:46.212046-03:00 error: ** Connection attempt from node 'project-project-26834@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:51.119782-03:00 error: ** Connection attempt from node 'project-project-14382@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:53.689614-03:00 error: ** Connection attempt from node 'project-project-26411@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:54.154988-03:00 error: ** Connection attempt from node 'project-project-29186@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:54.800252-03:00 error: ** Connection attempt from node 'project-project-39039@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:55.300953-03:00 error: ** Connection attempt from node 'project-project-29695@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:29:57.951961-03:00 error: ** Connection attempt from node 'project-project-56633@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:00.565596-03:00 error: ** Connection attempt from node 'project-project-49960@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:03.360042-03:00 error: ** Connection attempt from node 'project-project-29500@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:04.146295-03:00 error: ** Connection attempt from node 'project-project-25247@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:06.675842-03:00 error: ** Connection attempt from node 'project-project-31600@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:09.364095-03:00 error: ** Connection attempt from node 'project-project-43851@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:13.531055-03:00 error: ** Connection attempt from node 'project-project-25112@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:16.630546-03:00 error: ** Connection attempt from node 'project-project-47248@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:30:20.480177-03:00 error: ** Connection attempt from node 'project-project-27289@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:31:34.130765-03:00 error: ** Connection attempt from node 'project-project-4005@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:33:50.308512-03:00 error: ** Connection attempt from node 'project-project-31982@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:33:53.223099-03:00 error: ** Connection attempt from node 'project-project-36773@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:33:53.771141-03:00 error: ** Connection attempt from node 'project-project-18482@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:33:54.356758-03:00 error: ** Connection attempt from node 'project-project-33716@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:33:56.240617-03:00 error: ** Connection attempt from node 'project-project-16735@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:33:56.752989-03:00 error: ** Connection attempt from node 'project-project-60903@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:33:57.496397-03:00 error: ** Connection attempt from node 'project-project-43645@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:00.463373-03:00 error: ** Connection attempt from node 'project-project-867@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:03.363222-03:00 error: ** Connection attempt from node 'project-project-20894@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:06.987201-03:00 error: ** Connection attempt from node 'project-project-27924@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:09.837150-03:00 error: ** Connection attempt from node 'project-project-6851@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:12.537434-03:00 error: ** Connection attempt from node 'project-project-9643@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:21.597379-03:00 error: ** Connection attempt from node 'project-project-57549@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:24.329164-03:00 error: ** Connection attempt from node 'project-project-50478@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:27.187234-03:00 error: ** Connection attempt from node 'project-project-41856@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:30.317583-03:00 error: ** Connection attempt from node 'project-project-57905@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:33.705079-03:00 error: ** Connection attempt from node 'project-project-21018@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:36.490311-03:00 error: ** Connection attempt from node 'project-project-48028@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:37.084429-03:00 error: ** Connection attempt from node 'project-project-6561@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:37.594688-03:00 error: ** Connection attempt from node 'project-project-12023@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:38.262035-03:00 error: ** Connection attempt from node 'project-project-50692@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:38.741909-03:00 error: ** Connection attempt from node 'project-project-12898@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:42.765296-03:00 error: ** Connection attempt from node 'project-project-37322@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:45.725226-03:00 error: ** Connection attempt from node 'project-project-15104@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:48.662948-03:00 error: ** Connection attempt from node 'project-project-40533@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:53.402771-03:00 error: ** Connection attempt from node 'project-project-39335@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:56.468789-03:00 error: ** Connection attempt from node 'project-project-30678@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:34:59.352488-03:00 error: ** Connection attempt from node 'project-project-49892@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:02.396299-03:00 error: ** Connection attempt from node 'project-project-30012@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:05.134660-03:00 error: ** Connection attempt from node 'project-project-12591@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:08.017303-03:00 error: ** Connection attempt from node 'project-project-12880@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:12.113083-03:00 error: ** Connection attempt from node 'project-project-51847@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:15.859083-03:00 error: ** Connection attempt from node 'project-project-47422@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:16.781267-03:00 error: ** Connection attempt from node 'project-project-47541@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.381229-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.446313-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.478048-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.507177-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.516331-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.523616-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.549741-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.577522-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.603364-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.631534-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.659170-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.685438-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.711350-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.735556-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.762651-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.787368-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.814386-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.839745-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:39.864827-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.098541-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.110966-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.155192-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.192695-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.226304-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.247009-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.268402-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.276396-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.283776-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.292766-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.302045-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.335563-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.367376-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.374464-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.394682-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:45.403954-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:46.788279-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:46.872530-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:46.913108-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:46.921004-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:46.961931-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.755741-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.775795-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.789960-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.809047-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.826120-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.837240-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.848126-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.862722-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.971696-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:35:49.983605-03:00 error: ** Connection attempt from node 'testing-188@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:13.686999-03:00 error: ** Connection attempt from node 'project-project-40852@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:14.207684-03:00 error: ** Connection attempt from node 'project-project-62620@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:17.665038-03:00 error: ** Connection attempt from node 'project-project-27863@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:20.436590-03:00 error: ** Connection attempt from node 'project-project-15945@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:23.283528-03:00 error: ** Connection attempt from node 'project-project-17558@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:26.438036-03:00 error: ** Connection attempt from node 'project-project-53510@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:30.272303-03:00 error: ** Connection attempt from node 'project-project-3161@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:33.337858-03:00 error: ** Connection attempt from node 'project-project-43987@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:35.019659-03:00 error: ** Connection attempt from node 'project-project-5544@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:35.531024-03:00 error: ** Connection attempt from node 'project-project-56021@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:38.762228-03:00 error: ** Connection attempt from node 'project-project-58000@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:43.318530-03:00 error: ** Connection attempt from node 'project-project-11257@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:46.336622-03:00 error: ** Connection attempt from node 'project-project-54803@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:47.175450-03:00 error: ** Connection attempt from node 'project-project-61448@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:47.729386-03:00 error: ** Connection attempt from node 'project-project-47432@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:48.219851-03:00 error: ** Connection attempt from node 'project-project-27261@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:50.728239-03:00 error: ** Connection attempt from node 'project-project-26702@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:52.481478-03:00 error: ** Connection attempt from node 'project-project-46170@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:40:55.981156-03:00 error: ** Connection attempt from node 'project-project-11133@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:41:01.015731-03:00 error: ** Connection attempt from node 'project-project-35100@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:45:52.119740-03:00 error: ** Connection attempt from node 'project-project-52402@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:45:55.100009-03:00 error: ** Connection attempt from node 'project-project-2022@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:45:55.670557-03:00 error: ** Connection attempt from node 'project-project-56306@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:45:56.221305-03:00 error: ** Connection attempt from node 'project-project-34104@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:45:58.066639-03:00 error: ** Connection attempt from node 'project-project-12014@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:45:58.804467-03:00 error: ** Connection attempt from node 'project-project-41604@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:01.621791-03:00 error: ** Connection attempt from node 'project-project-57621@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:05.540622-03:00 error: ** Connection attempt from node 'project-project-5322@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:11.043053-03:00 error: ** Connection attempt from node 'project-project-64764@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:11.656228-03:00 error: ** Connection attempt from node 'project-project-12144@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:14.645900-03:00 error: ** Connection attempt from node 'project-project-25658@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:15.180148-03:00 error: ** Connection attempt from node 'project-project-2594@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:16.766352-03:00 error: ** Connection attempt from node 'project-project-27426@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:19.811064-03:00 error: ** Connection attempt from node 'project-project-60754@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:23.851477-03:00 error: ** Connection attempt from node 'project-project-28315@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:26.787005-03:00 error: ** Connection attempt from node 'project-project-57114@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:29.640918-03:00 error: ** Connection attempt from node 'project-project-37214@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:34.302339-03:00 error: ** Connection attempt from node 'project-project-10910@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:35.244006-03:00 error: ** Connection attempt from node 'project-project-9017@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:46:38.979533-03:00 error: ** Connection attempt from node 'project-project-56988@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:54:57.407300-03:00 error: ** Connection attempt from node 'project-project-11669@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.109815-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.181070-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.261077-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.300282-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.361251-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.391227-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.419457-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.447593-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.476726-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.503668-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.532139-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.558767-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.584428-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.612185-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.619565-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.626333-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.652431-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.677827-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.703832-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.728907-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.753909-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.781057-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.807711-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:31.834111-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.166517-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.275756-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.288543-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.296429-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.310599-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.326903-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.338208-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.349134-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.360958-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:33.377521-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.012155-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.024513-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.030869-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.038431-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.045974-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.074996-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.094059-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.132378-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.151854-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.158968-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.186761-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.213030-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.240819-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.260644-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.266864-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:56:39.274255-03:00 error: ** Connection attempt from node 'testing-469@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.556823-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.580976-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.594243-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.604988-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.712712-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.722279-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.733069-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.745224-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.757407-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:52.768445-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.072851-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.082735-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.107996-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.127987-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.155091-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.162020-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.169550-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.198022-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.225717-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.232322-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.239110-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.266270-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.285387-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.291652-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.309548-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:54.316188-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.595049-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.630982-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.674514-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.768613-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.825430-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.887142-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.949858-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:58:59.988691-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.155788-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.166185-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.200003-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.237849-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.268567-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.304545-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.334006-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.362049-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.391110-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.398686-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:00.427200-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:01.147568-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:01.220109-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:01.267201-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:01.276730-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:01.342179-03:00 error: ** Connection attempt from node 'testing-5@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:30.189967-03:00 error: ** Connection attempt from node 'project-project-816@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:33.350491-03:00 error: ** Connection attempt from node 'project-project-45514@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:33.820271-03:00 error: ** Connection attempt from node 'project-project-10082@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:35.354557-03:00 error: ** Connection attempt from node 'project-project-2125@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:38.153451-03:00 error: ** Connection attempt from node 'project-project-56808@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:40.834289-03:00 error: ** Connection attempt from node 'project-project-24775@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:41.382041-03:00 error: ** Connection attempt from node 'project-project-9405@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:43.093771-03:00 error: ** Connection attempt from node 'project-project-54644@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:43.608900-03:00 error: ** Connection attempt from node 'project-project-42776@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:44.550367-03:00 error: ** Connection attempt from node 'project-project-35491@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:50.028881-03:00 error: ** Connection attempt from node 'project-project-27394@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:52.703629-03:00 error: ** Connection attempt from node 'project-project-21778@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:56.742971-03:00 error: ** Connection attempt from node 'project-project-49850@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T19:59:59.856205-03:00 error: ** Connection attempt from node 'project-project-25657@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T20:00:02.728770-03:00 error: ** Connection attempt from node 'project-project-20179@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T20:00:06.644223-03:00 error: ** Connection attempt from node 'project-project-25334@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T20:00:09.702967-03:00 error: ** Connection attempt from node 'project-project-18836@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T20:00:12.469070-03:00 error: ** Connection attempt from node 'project-project-33598@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T20:00:16.220664-03:00 error: ** Connection attempt from node 'project-project-3278@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T20:00:22.316115-03:00 error: ** Connection attempt from node 'project-project-49741@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-27T20:00:36.768520-03:00 error: ** Connection attempt from node 'project-project-49128@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:17.852394-03:00 error: ** Connection attempt from node 'project-project-40911@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:20.984698-03:00 error: ** Connection attempt from node 'project-project-8880@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:21.530195-03:00 error: ** Connection attempt from node 'project-project-25006@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:23.241672-03:00 error: ** Connection attempt from node 'project-project-17904@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:23.827564-03:00 error: ** Connection attempt from node 'project-project-50291@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:25.355420-03:00 error: ** Connection attempt from node 'project-project-377@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:28.181544-03:00 error: ** Connection attempt from node 'project-project-15700@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:31.095768-03:00 error: ** Connection attempt from node 'project-project-41368@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:31.643356-03:00 error: ** Connection attempt from node 'project-project-15273@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:34.540522-03:00 error: ** Connection attempt from node 'project-project-30994@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:37.729694-03:00 error: ** Connection attempt from node 'project-project-22263@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:40.799733-03:00 error: ** Connection attempt from node 'project-project-57330@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:43.660094-03:00 error: ** Connection attempt from node 'project-project-41724@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:46.763882-03:00 error: ** Connection attempt from node 'project-project-32890@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:50.251812-03:00 error: ** Connection attempt from node 'project-project-50223@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:54.255895-03:00 error: ** Connection attempt from node 'project-project-20535@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T17:59:57.246481-03:00 error: ** Connection attempt from node 'project-project-56987@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T18:00:02.101814-03:00 error: ** Connection attempt from node 'project-project-42438@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T18:00:06.041655-03:00 error: ** Connection attempt from node 'project-project-64281@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T18:00:07.556026-03:00 error: ** Connection attempt from node 'project-project-50094@127.0.0.1' rejected. Invalid challenge reply. ** +2025-06-29T18:00:24.856010-03:00 error: ** Connection attempt from node 'project-project-62223@127.0.0.1' rejected. Invalid challenge reply. ** diff --git a/apps/engine/test/support/test/entry/entry_builder.ex b/apps/engine/test/support/test/entry/entry_builder.ex index 82759c6e..e086795a 100644 --- a/apps/engine/test/support/test/entry/entry_builder.ex +++ b/apps/engine/test/support/test/entry/entry_builder.ex @@ -1,7 +1,7 @@ defmodule Engine.Test.Entry.Builder do - alias Engine.Search.Indexer.Entry alias Forge.Document.Range alias Forge.Identifier + alias Forge.Search.Indexer.Entry import Forge.Test.PositionSupport diff --git a/apps/expert/config/runtime.exs b/apps/expert/config/runtime.exs index f888c3b9..71f77d68 100644 --- a/apps/expert/config/runtime.exs +++ b/apps/expert/config/runtime.exs @@ -20,3 +20,5 @@ if Code.ensure_loaded?(LoggerFileBackend) do else :ok end + +require Logger diff --git a/apps/expert/lib/expert/application.ex b/apps/expert/lib/expert/application.ex index f3537eff..de275596 100644 --- a/apps/expert/lib/expert/application.ex +++ b/apps/expert/lib/expert/application.ex @@ -7,11 +7,13 @@ defmodule Expert.Application do use Application + require Logger + @impl true def start(_type, _args) do children = [ document_store_child_spec(), - {DynamicSupervisor, Expert.Project.Supervisor.options()}, + {DynamicSupervisor, Expert.Project.DynamicSupervisor.options()}, {DynamicSupervisor, name: Expert.DynamicSupervisor}, {GenLSP.Assigns, [name: Expert.Assigns]}, {Task.Supervisor, name: :expert_task_queue}, diff --git a/apps/expert/lib/expert/code_intelligence/completion.ex b/apps/expert/lib/expert/code_intelligence/completion.ex index 868eb70c..f10a37fd 100644 --- a/apps/expert/lib/expert/code_intelligence/completion.ex +++ b/apps/expert/lib/expert/code_intelligence/completion.ex @@ -1,11 +1,12 @@ defmodule Expert.CodeIntelligence.Completion do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.Builder alias Expert.CodeIntelligence.Completion.Translatable alias Expert.Configuration + alias Expert.EngineApi alias Expert.Project.Intelligence alias Forge.Ast.Analysis alias Forge.Ast.Env + alias Forge.Completion.Candidate alias Forge.Document.Position alias Forge.Project alias Future.Code, as: Code @@ -13,7 +14,6 @@ defmodule Expert.CodeIntelligence.Completion do alias GenLSP.Structures.CompletionContext alias GenLSP.Structures.CompletionItem alias GenLSP.Structures.CompletionList - alias Mix.Tasks.Namespace require Logger @@ -77,12 +77,12 @@ defmodule Expert.CodeIntelligence.Completion do Env.in_context?(env, :struct_field_key) -> project - |> Engine.Api.complete_struct_fields(env.analysis, env.position) + |> EngineApi.complete_struct_fields(env.analysis, env.position) |> Enum.map(&Translatable.translate(&1, Builder, env)) true -> project - |> Engine.Api.complete(env) + |> EngineApi.complete(env) |> to_completion_items(project, env, context) end end @@ -165,7 +165,7 @@ defmodule Expert.CodeIntelligence.Completion do %CompletionContext{} = context ) do debug_local_completions(local_completions) - project_apps = Engine.Api.project_apps(project) + project_apps = EngineApi.project_apps(project) for result <- local_completions, displayable?(project, project_apps, result), @@ -215,7 +215,7 @@ defmodule Expert.CodeIntelligence.Completion do end cond do - Namespace.Module.prefixed?(suggested_module) -> + Forge.Namespace.Module.prefixed?(suggested_module) -> false # If we're working on the dependency, we should include it! @@ -320,7 +320,7 @@ defmodule Expert.CodeIntelligence.Completion do case completion do %{full_name: full_name} -> with_prefix = - Engine.Api.modules_with_prefix( + EngineApi.modules_with_prefix( env.project, full_name, {Kernel, :macro_exported?, [:__using__, 1]} @@ -340,7 +340,7 @@ defmodule Expert.CodeIntelligence.Completion do case completion do %{full_name: full_name} -> with_prefix = - Engine.Api.modules_with_prefix( + EngineApi.modules_with_prefix( env.project, full_name, {Kernel, :function_exported?, [:behaviour_info, 1]} @@ -375,7 +375,7 @@ defmodule Expert.CodeIntelligence.Completion do end defp typespec_or_type_candidate?(%Candidate.Function{} = function, %Env{} = env) do - case Engine.Api.expand_alias(env.project, [:__MODULE__], env.analysis, env.position) do + case EngineApi.expand_alias(env.project, [:__MODULE__], env.analysis, env.position) do {:ok, expanded} -> expanded == function.origin diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/bitstring_option.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/bitstring_option.ex index e8b1d162..01299aad 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/bitstring_option.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/bitstring_option.ex @@ -1,9 +1,9 @@ defmodule Expert.CodeIntelligence.Completion.Translations.BitstringOption do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.SortScope alias Expert.CodeIntelligence.Completion.Translatable alias Expert.CodeIntelligence.Completion.Translations alias Forge.Ast.Env + alias Forge.Completion.Candidate alias GenLSP.Enumerations.CompletionItemKind require Logger diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/callable.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/callable.ex index 0eb2e190..b64b9190 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/callable.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/callable.ex @@ -1,8 +1,8 @@ defmodule Expert.CodeIntelligence.Completion.Translations.Callable do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.Builder alias Expert.CodeIntelligence.Completion.SortScope alias Forge.Ast.Env + alias Forge.Completion.Candidate alias GenLSP.Enumerations.CompletionItemKind @callables [Candidate.Function, Candidate.Macro, Candidate.Callback, Candidate.Typespec] diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/callback.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/callback.ex index 384cfc07..5b9ad7ee 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/callback.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/callback.ex @@ -1,9 +1,9 @@ defmodule Expert.CodeIntelligence.Completion.Translations.Callback do - alias Engine.Completion.Candidate.Callback alias Expert.CodeIntelligence.Completion.Builder alias Expert.CodeIntelligence.Completion.SortScope alias Expert.CodeIntelligence.Completion.Translatable alias Forge.Ast.Env + alias Forge.Completion.Candidate.Callback alias Forge.Document alias GenLSP.Enumerations.CompletionItemKind diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/function.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/function.ex index 332b0719..ae7b64fa 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/function.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/function.ex @@ -1,8 +1,8 @@ defmodule Expert.CodeIntelligence.Completion.Translations.Function do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.Translatable alias Expert.CodeIntelligence.Completion.Translations alias Forge.Ast.Env + alias Forge.Completion.Candidate defimpl Translatable, for: Candidate.Function do def translate(function, _builder, %Env{} = env) do diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/macro.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/macro.ex index 2723ead4..baaed649 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/macro.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/macro.ex @@ -1,5 +1,4 @@ defmodule Expert.CodeIntelligence.Completion.Translations.Macro do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.SortScope alias Expert.CodeIntelligence.Completion.Translatable alias Expert.CodeIntelligence.Completion.Translations @@ -7,6 +6,7 @@ defmodule Expert.CodeIntelligence.Completion.Translations.Macro do alias Expert.CodeIntelligence.Completion.Translations.Struct alias Forge.Ast alias Forge.Ast.Env + alias Forge.Completion.Candidate alias Forge.Document alias Forge.Document.Position alias GenLSP.Enumerations.CompletionItemKind diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/map_field.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/map_field.ex index b00ada08..bf37f51d 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/map_field.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/map_field.ex @@ -1,7 +1,7 @@ defmodule Expert.CodeIntelligence.Completion.Translations.MapField do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.Translatable alias Forge.Ast.Env + alias Forge.Completion.Candidate alias GenLSP.Enumerations.CompletionItemKind defimpl Translatable, for: Candidate.MapField do diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/module_attribute.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/module_attribute.ex index e80a052d..230e4eb4 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/module_attribute.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/module_attribute.ex @@ -1,10 +1,10 @@ defmodule Expert.CodeIntelligence.Completion.Translations.ModuleAttribute do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.SortScope alias Expert.CodeIntelligence.Completion.Translatable alias Expert.CodeIntelligence.Completion.Translations alias Forge.Ast alias Forge.Ast.Env + alias Forge.Completion.Candidate alias Forge.Document.Position alias GenLSP.Enumerations.CompletionItemKind diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/module_or_behaviour.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/module_or_behaviour.ex index 0d25eda9..b8a4b8e4 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/module_or_behaviour.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/module_or_behaviour.ex @@ -1,10 +1,10 @@ defmodule Expert.CodeIntelligence.Completion.Translations.ModuleOrBehaviour do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.SortScope alias Expert.CodeIntelligence.Completion.Translatable alias Expert.CodeIntelligence.Completion.Translations alias Expert.Project.Intelligence alias Forge.Ast.Env + alias Forge.Completion.Candidate alias GenLSP.Enumerations.CompletionItemKind defimpl Translatable, for: Candidate.Module do diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/struct_field.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/struct_field.ex index f8063bb9..1317e53a 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/struct_field.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/struct_field.ex @@ -1,9 +1,9 @@ defmodule Expert.CodeIntelligence.Completion.Translations.StructField do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.SortScope alias Expert.CodeIntelligence.Completion.Translatable alias Expert.CodeIntelligence.Completion.Translations alias Forge.Ast.Env + alias Forge.Completion.Candidate alias Future.Code, as: Code alias GenLSP.Enumerations.CompletionItemKind diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/typespec.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/typespec.ex index 44b0f9c0..8530c0a7 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/typespec.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/typespec.ex @@ -1,8 +1,8 @@ defmodule Expert.CodeIntelligence.Completion.Translations.Typespec do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.Translatable alias Expert.CodeIntelligence.Completion.Translations.Callable alias Forge.Ast.Env + alias Forge.Completion.Candidate defimpl Translatable, for: Candidate.Typespec do def translate(typespec, _builder, %Env{} = env) do diff --git a/apps/expert/lib/expert/code_intelligence/completion/translations/variable.ex b/apps/expert/lib/expert/code_intelligence/completion/translations/variable.ex index 5c5f7f3a..caac50d8 100644 --- a/apps/expert/lib/expert/code_intelligence/completion/translations/variable.ex +++ b/apps/expert/lib/expert/code_intelligence/completion/translations/variable.ex @@ -1,8 +1,8 @@ defmodule Expert.CodeIntelligence.Completion.Translations.Variable do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.SortScope alias Expert.CodeIntelligence.Completion.Translatable alias Forge.Ast.Env + alias Forge.Completion.Candidate alias GenLSP.Enumerations.CompletionItemKind defimpl Translatable, for: Candidate.Variable do diff --git a/apps/engine/lib/engine/engine/api.ex b/apps/expert/lib/expert/engine_api.ex similarity index 65% rename from apps/engine/lib/engine/engine/api.ex rename to apps/expert/lib/expert/engine_api.ex index 93d3e55a..46aa28e3 100644 --- a/apps/engine/lib/engine/engine/api.ex +++ b/apps/expert/lib/expert/engine_api.ex @@ -1,5 +1,5 @@ -defmodule Engine.Api do - alias Engine.CodeIntelligence +defmodule Expert.EngineApi do + alias Expert.EngineNode alias Forge.Ast.Analysis alias Forge.Ast.Env alias Forge.Document @@ -7,14 +7,22 @@ defmodule Engine.Api do alias Forge.Document.Range alias Forge.Project + alias Forge.CodeIntelligence + require Logger + def call(%Project{} = project, m, f, a \\ []) do + project + |> Project.node_name() + |> :erpc.call(m, f, a) + end + def schedule_compile(%Project{} = project, force?) do - Engine.call(project, Engine, :schedule_compile, [force?]) + call(project, Engine, :schedule_compile, [force?]) end def compile_document(%Project{} = project, %Document{} = document) do - Engine.call(project, Engine, :compile_document, [document]) + call(project, Engine, :compile_document, [document]) end def expand_alias( @@ -23,7 +31,7 @@ defmodule Engine.Api do %Analysis{} = analysis, %Position{} = position ) do - Engine.call(project, Engine, :expand_alias, [ + call(project, Engine, :expand_alias, [ segments_or_module, analysis, position @@ -31,15 +39,15 @@ defmodule Engine.Api do end def list_modules(%Project{} = project) do - Engine.call(project, Engine, :list_modules) + call(project, Engine, :list_modules) end def project_apps(%Project{} = project) do - Engine.call(project, Engine, :list_apps) + call(project, Engine, :list_apps) end def format(%Project{} = project, %Document{} = document) do - Engine.call(project, Engine, :format, [document]) + call(project, Engine, :format, [document]) end def code_actions( @@ -50,7 +58,7 @@ defmodule Engine.Api do kinds, trigger_kind ) do - Engine.call(project, Engine, :code_actions, [ + call(project, Engine, :code_actions, [ document, range, diagnostics, @@ -61,18 +69,18 @@ defmodule Engine.Api do def complete(%Project{} = project, %Env{} = env) do Logger.info("Completion for #{inspect(env.position)}") - Engine.call(project, Engine, :complete, [env]) + call(project, Engine, :complete, [env]) end def complete_struct_fields(%Project{} = project, %Analysis{} = analysis, %Position{} = position) do - Engine.call(project, Engine, :complete_struct_fields, [ + call(project, Engine, :complete_struct_fields, [ analysis, position ]) end def definition(%Project{} = project, %Document{} = document, %Position{} = position) do - Engine.call(project, Engine, :definition, [document, position]) + call(project, Engine, :definition, [document, position]) end def references( @@ -81,7 +89,7 @@ defmodule Engine.Api do %Position{} = position, include_definitions? ) do - Engine.call(project, Engine, :references, [ + call(project, Engine, :references, [ analysis, position, include_definitions? @@ -90,52 +98,54 @@ defmodule Engine.Api do def modules_with_prefix(%Project{} = project, prefix) when is_binary(prefix) or is_atom(prefix) do - Engine.call(project, Engine, :modules_with_prefix, [prefix]) + call(project, Engine, :modules_with_prefix, [prefix]) end def modules_with_prefix(%Project{} = project, prefix, predicate) when is_binary(prefix) or is_atom(prefix) do - Engine.call(project, Engine, :modules_with_prefix, [prefix, predicate]) + call(project, Engine, :modules_with_prefix, [prefix, predicate]) end @spec docs(Project.t(), module()) :: {:ok, CodeIntelligence.Docs.t()} | {:error, any()} def docs(%Project{} = project, module, opts \\ []) when is_atom(module) do - Engine.call(project, Engine, :docs, [module, opts]) + call(project, Engine, :docs, [module, opts]) end def register_listener(%Project{} = project, listener_pid, message_types) when is_pid(listener_pid) and is_list(message_types) do - Engine.call(project, Engine, :register_listener, [ + call(project, Engine, :register_listener, [ listener_pid, message_types ]) end def broadcast(%Project{} = project, message) do - Engine.call(project, Engine, :broadcast, [message]) + call(project, Engine, :broadcast, [message]) end def reindex(%Project{} = project) do - Engine.call(project, Engine, :reindex, []) + call(project, Engine, :reindex, []) end def index_running?(%Project{} = project) do - Engine.call(project, Engine, :index_running?, []) + call(project, Engine, :index_running?, []) end def resolve_entity(%Project{} = project, %Analysis{} = analysis, %Position{} = position) do - Engine.call(project, Engine, :resolve_entity, [analysis, position]) + call(project, Engine, :resolve_entity, [analysis, position]) end def struct_definitions(%Project{} = project) do - Engine.call(project, Engine, :struct_definitions, []) + call(project, Engine, :struct_definitions, []) end def document_symbols(%Project{} = project, %Document{} = document) do - Engine.call(project, Engine, :document_symbols, [document]) + call(project, Engine, :document_symbols, [document]) end def workspace_symbols(%Project{} = project, query) do - Engine.call(project, Engine, :workspace_symbols, [query]) + call(project, Engine, :workspace_symbols, [query]) end + + defdelegate stop(project), to: EngineNode end diff --git a/apps/engine/lib/engine/engine/project_node.ex b/apps/expert/lib/expert/engine_node.ex similarity index 80% rename from apps/engine/lib/engine/engine/project_node.ex rename to apps/expert/lib/expert/engine_node.ex index 2d9e6c24..0722491d 100644 --- a/apps/engine/lib/engine/engine/project_node.ex +++ b/apps/expert/lib/expert/engine_node.ex @@ -1,4 +1,4 @@ -defmodule Engine.ProjectNode do +defmodule Expert.EngineNode do alias Forge.Project require Logger @@ -39,7 +39,7 @@ defmodule Engine.ProjectNode do | path_append_arguments(paths) ] - port = Engine.Port.open_elixir(state.project, args: args) + port = Expert.Port.open_elixir(state.project, args: args) %{state | port: port, started_by: from} end @@ -103,18 +103,58 @@ defmodule Engine.ProjectNode do end end - alias Engine.ProjectNodeSupervisor + alias Expert.EngineSupervisor alias Forge.Document use GenServer - def start(project, paths) do + def start(project) do + :ok = ensure_epmd_started() + start_net_kernel(project) + node_name = Project.node_name(project) bootstrap_args = [project, Document.Store.entropy(), all_app_configs()] - with {:ok, node_pid} <- ProjectNodeSupervisor.start_project_node(project), - :ok <- start_node(project, paths), - :ok <- :rpc.call(node_name, Engine.Bootstrap, :init, bootstrap_args) do - {:ok, node_pid} + with {:ok, node_pid} <- EngineSupervisor.start_project_node(project), + :ok <- start_node(project, glob_paths()), + :ok <- :rpc.call(node_name, Engine.Bootstrap, :init, bootstrap_args), + :ok <- ensure_apps_started(node_name) do + {:ok, node_name, node_pid} + end + end + + defp start_net_kernel(%Project{} = project) do + manager = Project.manager_node_name(project) + :net_kernel.start(manager, %{name_domain: :longnames}) + end + + defp ensure_apps_started(node) do + :rpc.call(node, Engine, :ensure_apps_started, []) + end + + defp ensure_epmd_started do + case System.cmd("epmd", ~w(-daemon)) do + {"", 0} -> + :ok + + _ -> + {:error, :epmd_failed} + end + end + + @excluded_apps [:patch, :nimble_parsec] + @allowed_apps [:engine | Mix.Project.deps_apps()] -- @excluded_apps + + defp app_globs do + app_globs = Enum.map(@allowed_apps, fn app_name -> "/**/#{app_name}*/ebin" end) + ["/**/priv" | app_globs] + end + + def glob_paths do + for entry <- :code.get_path(), + entry_string = List.to_string(entry), + entry_string != ".", + Enum.any?(app_globs(), &PathGlob.match?(entry_string, &1, match_dot: true)) do + entry end end diff --git a/apps/engine/lib/engine/engine/project_node_supervisor.ex b/apps/expert/lib/expert/engine_supervisor.ex similarity index 78% rename from apps/engine/lib/engine/engine/project_node_supervisor.ex rename to apps/expert/lib/expert/engine_supervisor.ex index cd7d3d13..680b40d5 100644 --- a/apps/engine/lib/engine/engine/project_node_supervisor.ex +++ b/apps/expert/lib/expert/engine_supervisor.ex @@ -1,7 +1,7 @@ -defmodule Engine.ProjectNodeSupervisor do +defmodule Expert.EngineSupervisor do use DynamicSupervisor - alias Engine.ProjectNode + alias Expert.EngineNode alias Forge.Project @dialyzer {:no_return, start_link: 1} @@ -18,7 +18,7 @@ defmodule Engine.ProjectNodeSupervisor do end def start_project_node(%Project{} = project) do - DynamicSupervisor.start_child(__MODULE__, ProjectNode.child_spec(project)) + DynamicSupervisor.start_child(__MODULE__, EngineNode.child_spec(project)) end @impl true diff --git a/apps/expert/lib/expert/iex/helpers.ex b/apps/expert/lib/expert/iex/helpers.ex index 92dfe17b..270d0b6c 100644 --- a/apps/expert/lib/expert/iex/helpers.ex +++ b/apps/expert/lib/expert/iex/helpers.ex @@ -1,6 +1,6 @@ defmodule Expert.IEx.Helpers do - alias Engine.Search alias Expert.CodeIntelligence + alias Expert.EngineApi alias Forge.Ast alias Forge.Document alias Forge.Document.Position @@ -13,11 +13,7 @@ defmodule Expert.IEx.Helpers do alias Forge.Document alias Forge.Document.Position - alias Engine.Search import unquote(__MODULE__) - - Engine.Module.Loader.start_link(nil) - Engine.Dispatch.start_link([]) end end @@ -29,7 +25,7 @@ defmodule Expert.IEx.Helpers do def observer(project) do project |> ensure_project() - |> Engine.call(:observer, :start) + |> EngineApi.call(:observer, :start) end def doc(text) do @@ -54,27 +50,6 @@ defmodule Expert.IEx.Helpers do |> Document.new(text, 0) end - def search_store(project) do - project = ensure_project(project) - Engine.set_project(project) - - Search.Store.start_link( - project, - &Search.Indexer.create_index/1, - &Search.Indexer.update_index/2, - Search.Store.Backends.Ets - ) - end - - def search_entries(project) do - {:ok, entries} = - project - |> ensure_project() - |> Search.Indexer.create_index() - - entries - end - def pos(doc, line, character) do Position.new(doc, line, character) end @@ -82,7 +57,7 @@ defmodule Expert.IEx.Helpers do def compile_project(project) do project |> ensure_project() - |> Engine.Api.schedule_compile(true) + |> EngineApi.schedule_compile(true) end def compile_file(project, source) when is_binary(source) do @@ -94,7 +69,7 @@ defmodule Expert.IEx.Helpers do def compile_file(project, %Document{} = document) do project |> ensure_project() - |> Engine.Api.compile_document(document) + |> EngineApi.compile_document(document) end def complete(project, source, context \\ nil) diff --git a/apps/expert/lib/expert/port.ex b/apps/expert/lib/expert/port.ex new file mode 100644 index 00000000..d85096a1 --- /dev/null +++ b/apps/expert/lib/expert/port.ex @@ -0,0 +1,174 @@ +defmodule Expert.Port do + @moduledoc """ + Utilities for launching ports in the context of a project + """ + + alias Forge.Project + + @type open_opt :: + {:env, list()} + | {:cd, String.t() | charlist()} + | {:env, [{:os.env_var_name(), :os.env_var_value()}]} + | {:args, list()} + + @type open_opts :: [open_opt] + + @doc """ + Launches elixir in a port. + + This function takes the project's context into account and looks for the executable via calling + `elixir_executable(project)`. Environment variables are also retrieved with that call. + """ + @spec open_elixir(Project.t(), open_opts()) :: port() + def open_elixir(%Project{} = project, opts) do + {:ok, elixir_executable, environment_variables} = elixir_executable(project) + + opts = + opts + |> Keyword.put_new_lazy(:cd, fn -> Project.root_path(project) end) + |> Keyword.put_new(:env, environment_variables) + + open(project, elixir_executable, opts) + end + + def elixir_executable(%Project{} = project) do + root_path = Project.root_path(project) + + {path_result, env} = + with nil <- version_manager_path_and_env("asdf", root_path), + nil <- version_manager_path_and_env("mise", root_path), + nil <- version_manager_path_and_env("rtx", root_path) do + {File.cd!(root_path, fn -> System.find_executable("elixir") end), System.get_env()} + end + + case path_result do + nil -> + {:error, :no_elixir} + + executable when is_binary(executable) -> + {:ok, executable, env} + end + end + + defp version_manager_path_and_env(manager, root_path) do + with true <- is_binary(System.find_executable(manager)), + env = reset_env(manager, root_path), + {path, 0} <- System.cmd(manager, ~w(which elixir), cd: root_path, env: env) do + {String.trim(path), env} + else + _ -> + nil + end + end + + # We launch expert by asking the version managers to provide an environment, + # which contains path munging. This initial environment is present in the running + # VM, and needs to be undone so we can find the correct elixir executable in the project. + defp reset_env("asdf", _root_path) do + orig_path = System.get_env("PATH_SAVE", System.get_env("PATH")) + + Enum.map(System.get_env(), fn + {"ASDF_ELIXIR_VERSION", _} -> {"ASDF_ELIXIR_VERSION", nil} + {"ASDF_ERLANG_VERSION", _} -> {"ASDF_ERLANG_VERSION", nil} + {"PATH", _} -> {"PATH", orig_path} + other -> other + end) + end + + defp reset_env("rtx", root_path) do + {env, _} = System.cmd("rtx", ~w(env -s bash), cd: root_path) + + env + |> String.trim() + |> String.split("\n") + |> Enum.map(fn + "export " <> key_and_value -> + [key, value] = + key_and_value + |> String.split("=", parts: 2) + |> Enum.map(&String.trim/1) + + {key, value} + + _ -> + nil + end) + |> Enum.reject(&is_nil/1) + end + + defp reset_env("mise", root_path) do + {env, _} = System.cmd("mise", ~w(env -s bash), cd: root_path) + + env + |> String.trim() + |> String.split("\n") + |> Enum.map(fn + "export " <> key_and_value -> + [key, value] = + key_and_value + |> String.split("=", parts: 2) + |> Enum.map(&String.trim/1) + + {key, value} + + _ -> + nil + end) + |> Enum.reject(&is_nil/1) + end + + @doc """ + Launches an executable in the project context via a port. + """ + def open(%Project{} = project, executable, opts) do + {launcher, opts} = Keyword.pop_lazy(opts, :path, &path/0) + + opts = + opts + |> Keyword.put_new_lazy(:cd, fn -> Project.root_path(project) end) + |> Keyword.update(:args, [executable], fn old_args -> + [executable | Enum.map(old_args, &to_string/1)] + end) + + opts = + if Keyword.has_key?(opts, :env) do + Keyword.update!(opts, :env, &ensure_charlists/1) + else + opts + end + + Port.open({:spawn_executable, launcher}, opts) + end + + @doc """ + Provides the path of an executable to launch another erlang node via ports. + """ + def path do + path(:os.type()) + end + + def path({:unix, _}) do + require Logger + + with :non_existing <- :code.where_is_file(~c"port_wrapper.sh") do + :expert + |> :code.priv_dir() + |> Path.join("port_wrapper.sh") + |> Path.expand() + end + |> to_string() + end + + def path(os_tuple) do + raise ArgumentError, "Operating system #{inspect(os_tuple)} is not currently supported" + end + + defp ensure_charlists(environment_variables) do + Enum.map(environment_variables, fn {key, value} -> + # using to_string ensures nil values won't blow things up + erl_key = key |> to_string() |> String.to_charlist() + erl_value = value |> to_string() |> String.to_charlist() + {erl_key, erl_value} + end) + end +end diff --git a/apps/expert/lib/expert/project/diagnostics.ex b/apps/expert/lib/expert/project/diagnostics.ex index 0a123d63..babee274 100644 --- a/apps/expert/lib/expert/project/diagnostics.ex +++ b/apps/expert/lib/expert/project/diagnostics.ex @@ -1,6 +1,7 @@ defmodule Expert.Project.Diagnostics do - alias Engine.Api.Messages + alias Expert.EngineApi alias Expert.Project.Diagnostics.State + alias Forge.EngineApi.Messages alias Forge.Formats alias Forge.Project alias GenLSP.Notifications.TextDocumentPublishDiagnostics @@ -25,7 +26,7 @@ defmodule Expert.Project.Diagnostics do @impl GenServer def init([%Project{} = project]) do - Engine.Api.register_listener(project, self(), [ + EngineApi.register_listener(project, self(), [ file_diagnostics(), project_compile_requested(), project_compiled(), diff --git a/apps/expert/lib/expert/project/dynamic_supervisor.ex b/apps/expert/lib/expert/project/dynamic_supervisor.ex new file mode 100644 index 00000000..93557863 --- /dev/null +++ b/apps/expert/lib/expert/project/dynamic_supervisor.ex @@ -0,0 +1,9 @@ +defmodule Expert.Project.DynamicSupervisor do + def name do + Expert.ProjectSupervisor + end + + def options do + [name: name(), strategy: :one_for_one] + end +end diff --git a/apps/expert/lib/expert/project/intelligence.ex b/apps/expert/lib/expert/project/intelligence.ex index 3bc82fd6..c5c16a64 100644 --- a/apps/expert/lib/expert/project/intelligence.ex +++ b/apps/expert/lib/expert/project/intelligence.ex @@ -58,11 +58,11 @@ defmodule Expert.Project.Intelligence do end end - alias Engine.Api + alias Expert.EngineApi alias Forge.Project use GenServer - import Api.Messages + import Forge.EngineApi.Messages @generations [ :self, @@ -167,7 +167,7 @@ defmodule Expert.Project.Intelligence do @impl GenServer def init([%Project{} = project]) do - Api.register_listener(project, self(), [ + EngineApi.register_listener(project, self(), [ project_index_ready(), module_updated(), struct_discovered() @@ -213,7 +213,7 @@ defmodule Expert.Project.Intelligence do @impl GenServer def handle_info(project_index_ready(), %State{} = state) do - {:ok, struct_definitions} = Api.struct_definitions(state.project) + {:ok, struct_definitions} = EngineApi.struct_definitions(state.project) state = Enum.reduce(struct_definitions, State.new(state.project), fn module, state -> diff --git a/apps/expert/lib/expert/project/node.ex b/apps/expert/lib/expert/project/node.ex index 69121482..5f8b6b3b 100644 --- a/apps/expert/lib/expert/project/node.ex +++ b/apps/expert/lib/expert/project/node.ex @@ -13,6 +13,8 @@ defmodule Expert.Project.Node do alias Forge.Project + alias Expert.EngineApi + alias Expert.EngineNode alias Expert.Project.Progress require Logger @@ -60,7 +62,7 @@ defmodule Expert.Project.Node do @impl GenServer def handle_continue(:trigger_build, %State{} = state) do - Engine.Api.schedule_compile(state.project, true) + EngineApi.schedule_compile(state.project, true) {:noreply, state} end @@ -71,7 +73,7 @@ defmodule Expert.Project.Node do @impl GenServer def handle_cast(:trigger_build, %State{} = state) do - Engine.Api.schedule_compile(state.project, true) + EngineApi.schedule_compile(state.project, true) {:noreply, state} end @@ -90,15 +92,15 @@ defmodule Expert.Project.Node do # private api - def start_node(%Project{} = project) do - with {:ok, node, node_pid} <- Engine.start_link(project) do + defp start_node(%Project{} = project) do + with {:ok, node, node_pid} <- EngineNode.start(project) do Node.monitor(node, true) {:ok, State.new(project, node, node_pid)} end end defp delete_build_artifacts(%Project{} = project) do - build_path = Engine.Build.path(project) + build_path = Project.versioned_build_path(project) case File.rm_rf(build_path) do {:ok, _deleted} -> :ok diff --git a/apps/expert/lib/expert/project/progress.ex b/apps/expert/lib/expert/project/progress.ex index bfa9f151..73561c28 100644 --- a/apps/expert/lib/expert/project/progress.ex +++ b/apps/expert/lib/expert/project/progress.ex @@ -2,7 +2,7 @@ defmodule Expert.Project.Progress do alias Expert.Project.Progress.State alias Forge.Project - import Engine.Api.Messages + import Forge.EngineApi.Messages use GenServer diff --git a/apps/expert/lib/expert/project/progress/state.ex b/apps/expert/lib/expert/project/progress/state.ex index 75cf4226..f55b97a2 100644 --- a/apps/expert/lib/expert/project/progress/state.ex +++ b/apps/expert/lib/expert/project/progress/state.ex @@ -7,7 +7,7 @@ defmodule Expert.Project.Progress.State do alias GenLSP.Requests alias GenLSP.Structures - import Engine.Api.Messages + import Forge.EngineApi.Messages defstruct project: nil, progress_by_label: %{} diff --git a/apps/expert/lib/expert/project/progress/support.ex b/apps/expert/lib/expert/project/progress/support.ex index bcd590ba..148f5f27 100644 --- a/apps/expert/lib/expert/project/progress/support.ex +++ b/apps/expert/lib/expert/project/progress/support.ex @@ -2,7 +2,7 @@ defmodule Expert.Project.Progress.Support do alias Expert.Project.Progress alias Forge.Project - import Engine.Api.Messages + import Forge.EngineApi.Messages defmacro __using__(_) do quote do diff --git a/apps/expert/lib/expert/project/search_listener.ex b/apps/expert/lib/expert/project/search_listener.ex index f3c67043..e09b05e9 100644 --- a/apps/expert/lib/expert/project/search_listener.ex +++ b/apps/expert/lib/expert/project/search_listener.ex @@ -1,11 +1,11 @@ defmodule Expert.Project.SearchListener do - alias Engine.Api + alias Expert.EngineApi alias Forge.Formats alias Forge.Project alias Forge.Protocol.Id alias GenLSP.Requests - import Api.Messages + import Forge.EngineApi.Messages use GenServer require Logger @@ -20,7 +20,7 @@ defmodule Expert.Project.SearchListener do @impl GenServer def init([%Project{} = project]) do - Api.register_listener(project, self(), [ + EngineApi.register_listener(project, self(), [ project_reindex_requested(), project_reindexed() ]) diff --git a/apps/expert/lib/expert/project/supervisor.ex b/apps/expert/lib/expert/project/supervisor.ex index 27b39500..d23d6d65 100644 --- a/apps/expert/lib/expert/project/supervisor.ex +++ b/apps/expert/lib/expert/project/supervisor.ex @@ -1,5 +1,5 @@ defmodule Expert.Project.Supervisor do - alias Engine.ProjectNodeSupervisor + alias Expert.EngineSupervisor alias Expert.Project.Diagnostics alias Expert.Project.Intelligence alias Expert.Project.Node @@ -19,22 +19,14 @@ defmodule Expert.Project.Supervisor do use Supervisor - def dynamic_supervisor_name do - Expert.ProjectSupervisor - end - - def options do - [name: dynamic_supervisor_name(), strategy: :one_for_one] - end - def start_link(%Project{} = project) do - Supervisor.start_link(__MODULE__, project, name: supervisor_name(project)) + Supervisor.start_link(__MODULE__, project, name: name(project)) end def init(%Project{} = project) do children = [ {Progress, project}, - {ProjectNodeSupervisor, project}, + {EngineSupervisor, project}, {Node, project}, {Diagnostics, project}, {Intelligence, project}, @@ -45,19 +37,19 @@ defmodule Expert.Project.Supervisor do end def start(%Project{} = project) do - DynamicSupervisor.start_child(dynamic_supervisor_name(), {__MODULE__, project}) + DynamicSupervisor.start_child(Expert.Project.DynamicSupervisor.name(), {__MODULE__, project}) end def stop(%Project{} = project) do pid = project - |> supervisor_name() + |> name() |> Process.whereis() - DynamicSupervisor.terminate_child(dynamic_supervisor_name(), pid) + DynamicSupervisor.terminate_child(Expert.Project.DynamicSupervisor.name(), pid) end - defp supervisor_name(%Project{} = project) do + defp name(%Project{} = project) do :"#{Project.name(project)}::supervisor" end end diff --git a/apps/expert/lib/expert/provider/handlers/code_action.ex b/apps/expert/lib/expert/provider/handlers/code_action.ex index 5be304f9..d116b4b9 100644 --- a/apps/expert/lib/expert/provider/handlers/code_action.ex +++ b/apps/expert/lib/expert/provider/handlers/code_action.ex @@ -1,6 +1,7 @@ defmodule Expert.Provider.Handlers.CodeAction do - alias Engine.CodeAction alias Expert.Configuration + alias Expert.EngineApi + alias Forge.CodeAction alias GenLSP.Requests alias GenLSP.Structures @@ -12,7 +13,7 @@ defmodule Expert.Provider.Handlers.CodeAction do diagnostics = Enum.map(params.context.diagnostics, &to_code_action_diagnostic/1) code_actions = - Engine.Api.code_actions( + EngineApi.code_actions( config.project, document, params.range, diff --git a/apps/expert/lib/expert/provider/handlers/code_lens.ex b/apps/expert/lib/expert/provider/handlers/code_lens.ex index 3218addb..62ccdd6e 100644 --- a/apps/expert/lib/expert/provider/handlers/code_lens.ex +++ b/apps/expert/lib/expert/provider/handlers/code_lens.ex @@ -1,5 +1,6 @@ defmodule Expert.Provider.Handlers.CodeLens do alias Expert.Configuration + alias Expert.EngineApi alias Expert.Provider.Handlers alias Forge.Document alias Forge.Document.Position @@ -55,6 +56,6 @@ defmodule Expert.Provider.Handlers.CodeLens do document_path = Path.expand(document.path) document_path == Project.mix_exs_path(project) and - not Engine.Api.index_running?(project) + not EngineApi.index_running?(project) end end diff --git a/apps/expert/lib/expert/provider/handlers/commands.ex b/apps/expert/lib/expert/provider/handlers/commands.ex index 875a8dcf..d18836f2 100644 --- a/apps/expert/lib/expert/provider/handlers/commands.ex +++ b/apps/expert/lib/expert/provider/handlers/commands.ex @@ -1,5 +1,6 @@ defmodule Expert.Provider.Handlers.Commands do alias Expert.Configuration + alias Expert.EngineApi alias Forge.Project alias GenLSP.Enumerations.ErrorCodes alias GenLSP.Requests @@ -41,7 +42,7 @@ defmodule Expert.Provider.Handlers.Commands do end defp reindex(%Project{} = project) do - case Engine.Api.reindex(project) do + case EngineApi.reindex(project) do :ok -> {:ok, "ok"} diff --git a/apps/expert/lib/expert/provider/handlers/document_symbols.ex b/apps/expert/lib/expert/provider/handlers/document_symbols.ex index d09feca0..a026a97a 100644 --- a/apps/expert/lib/expert/provider/handlers/document_symbols.ex +++ b/apps/expert/lib/expert/provider/handlers/document_symbols.ex @@ -1,7 +1,7 @@ defmodule Expert.Provider.Handlers.DocumentSymbols do - alias Engine.Api - alias Engine.CodeIntelligence.Symbols alias Expert.Configuration + alias Expert.EngineApi + alias Forge.CodeIntelligence.Symbols alias Forge.Document alias GenLSP.Enumerations.SymbolKind alias GenLSP.Requests @@ -12,7 +12,7 @@ defmodule Expert.Provider.Handlers.DocumentSymbols do symbols = config.project - |> Api.document_symbols(document) + |> EngineApi.document_symbols(document) |> Enum.map(&to_response(&1, document)) {:ok, symbols} diff --git a/apps/expert/lib/expert/provider/handlers/find_references.ex b/apps/expert/lib/expert/provider/handlers/find_references.ex index 38c06a9b..d7318934 100644 --- a/apps/expert/lib/expert/provider/handlers/find_references.ex +++ b/apps/expert/lib/expert/provider/handlers/find_references.ex @@ -1,6 +1,6 @@ defmodule Expert.Provider.Handlers.FindReferences do - alias Engine.Api alias Expert.Configuration + alias Expert.EngineApi alias Forge.Ast alias Forge.Document alias GenLSP.Requests.TextDocumentReferences @@ -18,7 +18,7 @@ defmodule Expert.Provider.Handlers.FindReferences do locations = case Document.Store.fetch(document.uri, :analysis) do {:ok, _document, %Ast.Analysis{} = analysis} -> - Api.references(config.project, analysis, params.position, include_declaration?) + EngineApi.references(config.project, analysis, params.position, include_declaration?) _ -> nil diff --git a/apps/expert/lib/expert/provider/handlers/formatting.ex b/apps/expert/lib/expert/provider/handlers/formatting.ex index 0c4f86b6..9d9f043a 100644 --- a/apps/expert/lib/expert/provider/handlers/formatting.ex +++ b/apps/expert/lib/expert/provider/handlers/formatting.ex @@ -1,5 +1,6 @@ defmodule Expert.Provider.Handlers.Formatting do alias Expert.Configuration + alias Expert.EngineApi alias Forge.Document.Changes alias GenLSP.Requests alias GenLSP.Structures @@ -12,7 +13,7 @@ defmodule Expert.Provider.Handlers.Formatting do ) do document = Forge.Document.Container.context_document(params, nil) - case Engine.Api.format(config.project, document) do + case EngineApi.format(config.project, document) do {:ok, %Changes{} = document_edits} -> {:ok, document_edits} diff --git a/apps/expert/lib/expert/provider/handlers/go_to_definition.ex b/apps/expert/lib/expert/provider/handlers/go_to_definition.ex index 3115131e..b18e744d 100644 --- a/apps/expert/lib/expert/provider/handlers/go_to_definition.ex +++ b/apps/expert/lib/expert/provider/handlers/go_to_definition.ex @@ -1,5 +1,6 @@ defmodule Expert.Provider.Handlers.GoToDefinition do alias Expert.Configuration + alias Expert.EngineApi alias GenLSP.Requests alias GenLSP.Structures @@ -13,7 +14,7 @@ defmodule Expert.Provider.Handlers.GoToDefinition do ) do document = Forge.Document.Container.context_document(params, nil) - case Engine.Api.definition(config.project, document, params.position) do + case EngineApi.definition(config.project, document, params.position) do {:ok, native_location} -> {:ok, native_location} diff --git a/apps/expert/lib/expert/provider/handlers/hover.ex b/apps/expert/lib/expert/provider/handlers/hover.ex index 6697eba0..ce43e9c7 100644 --- a/apps/expert/lib/expert/provider/handlers/hover.ex +++ b/apps/expert/lib/expert/provider/handlers/hover.ex @@ -1,9 +1,10 @@ defmodule Expert.Provider.Handlers.Hover do - alias Engine.CodeIntelligence.Docs alias Expert.Configuration + alias Expert.EngineApi alias Expert.Provider.Markdown alias Forge.Ast alias Forge.Ast.Analysis + alias Forge.CodeIntelligence.Docs alias Forge.Document alias Forge.Document.Position alias Forge.Project @@ -37,11 +38,11 @@ defmodule Expert.Provider.Handlers.Hover do end defp resolve_entity(%Project{} = project, %Analysis{} = analysis, %Position{} = position) do - Engine.Api.resolve_entity(project, analysis, position) + EngineApi.resolve_entity(project, analysis, position) end defp hover_content({kind, module}, %Project{} = project) when kind in [:module, :struct] do - case Engine.Api.docs(project, module, exclude_hidden: false) do + case EngineApi.docs(project, module, exclude_hidden: false) do {:ok, %Docs{} = module_docs} -> header = module_header(kind, module_docs) types = module_header_types(kind, module_docs) @@ -64,7 +65,7 @@ defmodule Expert.Provider.Handlers.Hover do end defp hover_content({:call, module, fun, arity}, %Project{} = project) do - with {:ok, %Docs{} = module_docs} <- Engine.Api.docs(project, module), + with {:ok, %Docs{} = module_docs} <- EngineApi.docs(project, module), {:ok, entries} <- Map.fetch(module_docs.functions_and_macros, fun) do sections = entries @@ -77,7 +78,7 @@ defmodule Expert.Provider.Handlers.Hover do end defp hover_content({:type, module, type, arity}, %Project{} = project) do - with {:ok, %Docs{} = module_docs} <- Engine.Api.docs(project, module), + with {:ok, %Docs{} = module_docs} <- EngineApi.docs(project, module), {:ok, entries} <- Map.fetch(module_docs.types, type) do case Enum.find(entries, &(&1.arity == arity)) do %Docs.Entry{} = entry -> diff --git a/apps/expert/lib/expert/provider/handlers/workspace_symbol.ex b/apps/expert/lib/expert/provider/handlers/workspace_symbol.ex index 1b5211b0..e3154f23 100644 --- a/apps/expert/lib/expert/provider/handlers/workspace_symbol.ex +++ b/apps/expert/lib/expert/provider/handlers/workspace_symbol.ex @@ -1,7 +1,7 @@ defmodule Expert.Provider.Handlers.WorkspaceSymbol do - alias Engine.Api - alias Engine.CodeIntelligence.Symbols alias Expert.Configuration + alias Expert.EngineApi + alias Forge.CodeIntelligence.Symbols alias GenLSP.Enumerations.SymbolKind alias GenLSP.Requests alias GenLSP.Structures @@ -15,7 +15,7 @@ defmodule Expert.Provider.Handlers.WorkspaceSymbol do symbols = if String.length(params.query) > 1 do config.project - |> Api.workspace_symbols(params.query) + |> EngineApi.workspace_symbols(params.query) |> tap(fn symbols -> Logger.info("syms #{inspect(Enum.take(symbols, 5))}") end) |> Enum.map(&to_response/1) else diff --git a/apps/expert/lib/expert/state.ex b/apps/expert/lib/expert/state.ex index cfff6a19..c17a54b8 100644 --- a/apps/expert/lib/expert/state.ex +++ b/apps/expert/lib/expert/state.ex @@ -1,7 +1,7 @@ defmodule Expert.State do - alias Engine.Api alias Expert.CodeIntelligence alias Expert.Configuration + alias Expert.EngineApi alias Expert.Project alias Expert.Provider.Handlers alias Forge.Document @@ -12,7 +12,7 @@ defmodule Expert.State do require Logger - import Api.Messages + import Forge.EngineApi.Messages defstruct configuration: nil, initialized?: false, @@ -114,8 +114,8 @@ defmodule Expert.State do to_version: updated_source.version ) - Api.broadcast(project, updated_message) - Api.compile_document(state.configuration.project, updated_source) + EngineApi.broadcast(project, updated_message) + EngineApi.compile_document(state.configuration.project, updated_source) {:ok, state} error -> @@ -163,7 +163,7 @@ defmodule Expert.State do case Document.Store.save(uri) do :ok -> - Api.schedule_compile(state.configuration.project, false) + EngineApi.schedule_compile(state.configuration.project, false) {:ok, state} error -> @@ -190,7 +190,7 @@ defmodule Expert.State do Enum.each(params.changes, fn %GenLSP.Structures.FileEvent{} = change -> event = filesystem_event(project: Project, uri: change.uri, event_type: change.type) - Engine.Api.broadcast(project, event) + EngineApi.broadcast(project, event) end) {:ok, state} diff --git a/apps/expert/lib/mix/tasks/package.ex b/apps/expert/lib/mix/tasks/package.ex index f8fbf6e9..3fb7945e 100644 --- a/apps/expert/lib/mix/tasks/package.ex +++ b/apps/expert/lib/mix/tasks/package.ex @@ -66,8 +66,8 @@ defmodule Mix.Tasks.Package do to the code search path with the `-pa` argument. """ + alias Forge.Namespace alias Forge.VM.Versions - alias Mix.Tasks.Namespace @options [ strict: [ diff --git a/apps/expert/mix.exs b/apps/expert/mix.exs index d1595050..7722eb23 100644 --- a/apps/expert/mix.exs +++ b/apps/expert/mix.exs @@ -42,8 +42,6 @@ defmodule Expert.MixProject do [ Mix.Credo.dependency(), Mix.Dialyzer.dependency(), - {:elixir_sense, - github: "elixir-lsp/elixir_sense", ref: "73ce7e0d239342fb9527d7ba567203e77dbb9b25"}, {:engine, path: "../engine", env: Mix.env()}, {:forge, path: "../forge", env: Mix.env()}, {:gen_lsp, "~> 0.11"}, diff --git a/apps/expert/mix.lock b/apps/expert/mix.lock index e150551a..ea4f538f 100644 --- a/apps/expert/mix.lock +++ b/apps/expert/mix.lock @@ -14,10 +14,10 @@ "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, "patch": {:hex, :patch, "0.15.0", "947dd6a8b24a2d2d1137721f20bb96a8feb4f83248e7b4ad88b4871d52807af5", [:mix], [], "hexpm", "e8dadf9b57b30e92f6b2b1ce2f7f57700d14c66d4ed56ee27777eb73fb77e58d"}, "path_glob": {:hex, :path_glob, "0.2.0", "b9e34b5045cac5ecb76ef1aa55281a52bf603bf7009002085de40958064ca312", [:mix], [{:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "be2594cb4553169a1a189f95193d910115f64f15f0d689454bb4e8cfae2e7ebc"}, - "refactorex": {:hex, :refactorex, "0.1.51", "74fc4603b31b600d78539ffea9fe170038aa8d471eec5aed261354c9734b4b27", [:mix], [{:sourceror, "~> 1.7", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "aefa150ab2c0d62aa8c01c4d04b932806118790f09c4106e20883281932fba03"}, + "refactorex": {:hex, :refactorex, "0.1.52", "22a69062c84e0f20a752d3d6580269c09c242645ee4f722f03d4270dd8cbf218", [:mix], [{:sourceror, "~> 1.7", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "4927fe6c3acd1f4695d6d3e443380167d61d004d507b1279c6084433900c94d0"}, "schematic": {:hex, :schematic, "0.2.1", "0b091df94146fd15a0a343d1bd179a6c5a58562527746dadd09477311698dbb1", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"}, "snowflake": {:hex, :snowflake, "1.0.4", "8433b4e04fbed19272c55e1b7de0f7a1ee1230b3ae31a813b616fd6ef279e87a", [:mix], [], "hexpm", "badb07ebb089a5cff737738297513db3962760b10fe2b158ae3bebf0b4d5be13"}, - "sourceror": {:hex, :sourceror, "1.9.0", "3bf5fe2d017aaabe3866d8a6da097dd7c331e0d2d54e59e21c2b066d47f1e08e", [:mix], [], "hexpm", "d20a9dd5efe162f0d75a307146faa2e17b823ea4f134f662358d70f0332fed82"}, + "sourceror": {:hex, :sourceror, "1.10.0", "38397dedbbc286966ec48c7af13e228b171332be1ad731974438c77791945ce9", [:mix], [], "hexpm", "29dbdfc92e04569c9d8e6efdc422fc1d815f4bd0055dc7c51b8800fb75c4b3f1"}, "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, "stream_data": {:hex, :stream_data, "1.2.0", "58dd3f9e88afe27dc38bef26fce0c84a9e7a96772b2925c7b32cd2435697a52b", [:mix], [], "hexpm", "eb5c546ee3466920314643edf68943a5b14b32d1da9fe01698dc92b73f89a9ed"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, diff --git a/apps/engine/priv/port_wrapper.sh b/apps/expert/priv/port_wrapper.sh similarity index 100% rename from apps/engine/priv/port_wrapper.sh rename to apps/expert/priv/port_wrapper.sh diff --git a/apps/expert/test/engine/README.md b/apps/expert/test/engine/README.md new file mode 100644 index 00000000..21aee008 --- /dev/null +++ b/apps/expert/test/engine/README.md @@ -0,0 +1 @@ +While the Expert application does not depend on Engine as a dependency, and logically Engine should not depend on Expert, we still need to call the Engine from a client like the Expert application in order to test Engine specific functionality. Due to this, this folder with files that don't map to Expert exclusive modules exists. Also for this same reason, Expert does depend on Engine as a test dependency, so we can call Engine functions in tests. diff --git a/apps/engine/test/engine/build_test.exs b/apps/expert/test/engine/build_test.exs similarity index 96% rename from apps/engine/test/engine/build_test.exs rename to apps/expert/test/engine/build_test.exs index ffda124a..36f3a5e8 100644 --- a/apps/engine/test/engine/build_test.exs +++ b/apps/expert/test/engine/build_test.exs @@ -1,15 +1,16 @@ defmodule Engine.BuildTest do alias Elixir.Features - - alias Engine.Api.Messages alias Engine.Build - alias Engine.ProjectNodeSupervisor + alias Expert.EngineApi + alias Expert.EngineNode + alias Expert.EngineSupervisor alias Forge.Document + alias Forge.EngineApi.Messages alias Forge.Plugin.V1.Diagnostic alias Forge.Project import Messages - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Forge.Test.DiagnosticSupport use ExUnit.Case use Patch @@ -29,7 +30,7 @@ defmodule Engine.BuildTest do end source = Document.new(uri, source_code, 0) - Engine.call(project, Build, :force_compile_document, [source]) + EngineApi.call(project, Build, :force_compile_document, [source]) end def with_project(project_name) do @@ -41,9 +42,9 @@ defmodule Engine.BuildTest do |> Project.workspace_path() |> File.rm_rf() - {:ok, _} = start_supervised({ProjectNodeSupervisor, project}) - {:ok, _, _} = Engine.start_link(project) - Engine.Api.register_listener(project, self(), [:all]) + {:ok, _} = start_supervised({EngineSupervisor, project}) + {:ok, _, _} = EngineNode.start(project) + EngineApi.register_listener(project, self(), [:all]) {:ok, project} end @@ -72,7 +73,7 @@ defmodule Engine.BuildTest do describe "compiling a project" do test "sends a message when complete " do {:ok, project} = with_project(:project_metadata) - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(status: :success) assert_receive project_progress(label: "Building " <> project_name) @@ -82,7 +83,7 @@ defmodule Engine.BuildTest do test "receives metadata about the defined modules" do {:ok, project} = with_project(:project_metadata) - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive module_updated(name: ProjectMetadata, functions: functions) assert {:zero_arity, 0} in functions @@ -94,7 +95,7 @@ defmodule Engine.BuildTest do describe "compiling an umbrella project" do test "it sends a message when compilation is complete" do {:ok, project} = with_project(:umbrella) - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(status: :success) assert_receive project_diagnostics(diagnostics: []) @@ -119,7 +120,7 @@ defmodule Engine.BuildTest do describe "compiling a project that has errors" do test "it reports the errors" do {:ok, project} = with_project(:compilation_errors) - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(status: :error) assert_receive project_diagnostics(diagnostics: [%Diagnostic.Result{}]) @@ -132,7 +133,7 @@ defmodule Engine.BuildTest do @feature_condition span_in_diagnostic?: false @tag execute_if(@feature_condition) test "stuff", %{project: project} do - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(status: :error) assert_receive project_diagnostics(diagnostics: [%Diagnostic.Result{} = diagnostic]) @@ -144,7 +145,7 @@ defmodule Engine.BuildTest do @feature_condition span_in_diagnostic?: true @tag execute_if(@feature_condition) test "stuff when #{inspect(@feature_condition)}", %{project: project} do - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(status: :error) assert_receive project_diagnostics(diagnostics: [%Diagnostic.Result{} = diagnostic]) @@ -160,7 +161,7 @@ defmodule Engine.BuildTest do describe "when compiling a project that has warnings" do test "it reports them" do {:ok, project} = with_project(:compilation_warnings) - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(status: :success) assert_receive project_diagnostics(diagnostics: diagnostics) @@ -565,7 +566,7 @@ defmodule Engine.BuildTest do end def loaded?(project, module) do - Engine.call(project, Code, :ensure_loaded?, [module]) + EngineApi.call(project, Code, :ensure_loaded?, [module]) end describe "module sanitization" do @@ -675,7 +676,7 @@ defmodule Engine.BuildTest do describe "exceptions during compilation" do test "compiling a project with callback errors" do {:ok, project} = with_project(:compilation_callback_errors) - Engine.Api.schedule_compile(project, false) + EngineApi.schedule_compile(project, false) assert_receive project_compiled(status: :error) assert_receive project_diagnostics(diagnostics: [diagnostic]) diff --git a/apps/engine/test/engine/code_intelligence/definition_test.exs b/apps/expert/test/engine/code_intelligence/definition_test.exs similarity index 96% rename from apps/engine/test/engine/code_intelligence/definition_test.exs rename to apps/expert/test/engine/code_intelligence/definition_test.exs index e4ba6399..f2893f85 100644 --- a/apps/engine/test/engine/code_intelligence/definition_test.exs +++ b/apps/expert/test/engine/code_intelligence/definition_test.exs @@ -1,12 +1,14 @@ defmodule Engine.CodeIntelligence.DefinitionTest do - alias Engine.ProjectNodeSupervisor alias Engine.Search + alias Expert.EngineApi + alias Expert.EngineNode + alias Expert.EngineSupervisor alias Forge.Document - import Engine.Api.Messages + import Forge.EngineApi.Messages import Forge.Test.CodeSigil import Forge.Test.CursorSupport - import Engine.Test.Fixtures + import Forge.Test.Fixtures import Forge.Test.RangeSupport use ExUnit.Case, async: false @@ -43,11 +45,11 @@ defmodule Engine.CodeIntelligence.DefinitionTest do setup_all do project = project(:navigations) start_supervised!({Document.Store, derive: [analysis: &Forge.Ast.analyze/1]}) - {:ok, _} = start_supervised({ProjectNodeSupervisor, project}) - {:ok, _, _} = Engine.start_link(project) + {:ok, _} = start_supervised({EngineSupervisor, project}) + {:ok, _, _} = EngineNode.start(project) - Engine.Api.register_listener(project, self(), [:all]) - Engine.Api.schedule_compile(project, true) + EngineApi.register_listener(project, self(), [:all]) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(), 5000 assert_receive project_index_ready(), 5000 @@ -452,7 +454,7 @@ defmodule Engine.CodeIntelligence.DefinitionTest do {:ok, document} <- subject_module(project, code), :ok <- index(project, referenced_uri), {:ok, location} <- - Engine.Api.definition(project, document, position) do + EngineApi.definition(project, document, position) do if is_list(location) do {:ok, Enum.map(location, &{&1.document.uri, decorate(&1.document, &1.range)})} else @@ -463,12 +465,12 @@ defmodule Engine.CodeIntelligence.DefinitionTest do defp index(project, referenced_uris) when is_list(referenced_uris) do entries = Enum.flat_map(referenced_uris, &do_index/1) - Engine.call(project, Search.Store, :replace, [entries]) + EngineApi.call(project, Search.Store, :replace, [entries]) end defp index(project, referenced_uri) do entries = do_index(referenced_uri) - Engine.call(project, Search.Store, :replace, [entries]) + EngineApi.call(project, Search.Store, :replace, [entries]) end defp do_index(referenced_uri) do diff --git a/apps/engine/test/remote_control_test.exs b/apps/expert/test/engine/engine_test.exs similarity index 81% rename from apps/engine/test/remote_control_test.exs rename to apps/expert/test/engine/engine_test.exs index 6ac1e131..f4b0c5b3 100644 --- a/apps/engine/test/remote_control_test.exs +++ b/apps/expert/test/engine/engine_test.exs @@ -1,19 +1,21 @@ defmodule EngineTest do + alias Expert.EngineApi + alias Expert.EngineNode alias Forge.Document alias Forge.Project use ExUnit.Case use Forge.Test.EventualAssertions - import Engine.Test.Fixtures + import Forge.Test.Fixtures def start_project(%Project{} = project) do - start_supervised!({Engine.ProjectNodeSupervisor, project}) - assert {:ok, _, _} = Engine.start_link(project) + start_supervised!({Expert.EngineSupervisor, project}) + assert {:ok, _, _} = EngineNode.start(project) :ok end def engine_cwd(project) do - Engine.call(project, File, :cwd!, []) + EngineApi.call(project, File, :cwd!, []) end describe "detecting an umbrella app" do diff --git a/apps/expert/test/expert/code_intelligence/completion/builder_test.exs b/apps/expert/test/expert/code_intelligence/completion/builder_test.exs index 01c8dca0..66552733 100644 --- a/apps/expert/test/expert/code_intelligence/completion/builder_test.exs +++ b/apps/expert/test/expert/code_intelligence/completion/builder_test.exs @@ -8,7 +8,7 @@ defmodule Expert.CodeIntelligence.Completion.BuilderTest do import Expert.CodeIntelligence.Completion.Builder import Forge.Test.CursorSupport - import Engine.Test.Fixtures + import Forge.Test.Fixtures def new_env(text) do project = project() diff --git a/apps/expert/test/expert/code_intelligence/completion/translations/module_or_behaviour_test.exs b/apps/expert/test/expert/code_intelligence/completion/translations/module_or_behaviour_test.exs index ee03fcdc..4f795f33 100644 --- a/apps/expert/test/expert/code_intelligence/completion/translations/module_or_behaviour_test.exs +++ b/apps/expert/test/expert/code_intelligence/completion/translations/module_or_behaviour_test.exs @@ -1,4 +1,5 @@ defmodule Expert.CodeIntelligence.Completion.Translations.ModuleOrBehaviourTest do + alias Expert.EngineApi alias GenLSP.Enumerations.CompletionItemKind alias GenLSP.Enumerations.InsertTextFormat @@ -263,7 +264,7 @@ defmodule Expert.CodeIntelligence.Completion.Translations.ModuleOrBehaviourTest %{ project: project } do - patch(Engine.Api, :project_apps, [:project, :ex_unit, :stream_data]) + patch(EngineApi, :project_apps, [:project, :ex_unit, :stream_data]) source = ~q[ use En| diff --git a/apps/expert/test/expert/code_intelligence/completion_test.exs b/apps/expert/test/expert/code_intelligence/completion_test.exs index 9125a737..320cfb34 100644 --- a/apps/expert/test/expert/code_intelligence/completion_test.exs +++ b/apps/expert/test/expert/code_intelligence/completion_test.exs @@ -1,6 +1,7 @@ defmodule Expert.CodeIntelligence.CompletionTest do - alias Engine.Completion.Candidate alias Expert.CodeIntelligence.Completion.SortScope + alias Expert.EngineApi + alias Forge.Completion.Candidate alias GenLSP.Enumerations.CompletionItemKind alias GenLSP.Structures.CompletionItem @@ -16,49 +17,49 @@ defmodule Expert.CodeIntelligence.CompletionTest do describe "excluding modules from expert dependencies" do test "expert modules are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "Expert.CodeIntelligence|") end test "Expert submodules are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "Engin|e") assert [] = complete(project, "Forg|e") end test "Expert functions are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "Engine.|") end test "Dependency modules are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "ElixirSense|") end test "Dependency functions are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "Jason.encod|") end test "Dependency protocols are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "Jason.Encode|") end test "Dependency structs are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "Jason.Fragment|") end test "Dependency exceptions are removed", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [] = complete(project, "Jason.DecodeErro|") end end test "includes modules from dependencies shared by the project and Expert", %{project: project} do - patch(Engine.Api, :project_apps, [:project, :sourceror]) + patch(EngineApi, :project_apps, [:project, :sourceror]) assert [sourceror_module] = complete(project, "Sourcer|") assert sourceror_module.kind == CompletionItemKind.module() @@ -173,7 +174,7 @@ defmodule Expert.CodeIntelligence.CompletionTest do origin: nil } - patch(Engine.Api, :complete, [candidate]) + patch(EngineApi, :complete, [candidate]) [completion] = complete(project, " @type a|") assert completion.label == "any()" @@ -181,7 +182,7 @@ defmodule Expert.CodeIntelligence.CompletionTest do test "typespecs with no full_name are completed", %{project: project} do candidate = %Candidate.Struct{full_name: nil, metadata: %{}, name: "Struct"} - patch(Engine.Api, :complete, [candidate]) + patch(EngineApi, :complete, [candidate]) [completion] = complete(project, " %Stru|") assert completion.label == "Struct" @@ -234,7 +235,7 @@ defmodule Expert.CodeIntelligence.CompletionTest do %Candidate.Variable{name: "#{name}-variable"} ] - patch(Engine.Api, :complete, all_completions) + patch(EngineApi, :complete, all_completions) :ok end diff --git a/apps/engine/test/engine/project_node_test.exs b/apps/expert/test/expert/engine_node_test.exs similarity index 56% rename from apps/engine/test/engine/project_node_test.exs rename to apps/expert/test/expert/engine_node_test.exs index 4a7fee02..e45d5d81 100644 --- a/apps/engine/test/engine/project_node_test.exs +++ b/apps/expert/test/expert/engine_node_test.exs @@ -1,26 +1,26 @@ -defmodule Engine.ProjectNodeTest do - alias Engine.ProjectNode - alias Engine.ProjectNodeSupervisor +defmodule Expert.EngineNodeTest do + alias Expert.EngineNode + alias Expert.EngineSupervisor import Forge.Test.EventualAssertions - import Engine.Test.Fixtures + import Forge.Test.Fixtures use ExUnit.Case, async: false setup do project = project() - start_supervised!({ProjectNodeSupervisor, project}) + start_supervised!({EngineSupervisor, project}) {:ok, %{project: project}} end test "it should be able to stop a project node and won't restart", %{project: project} do - {:ok, _node_name, _} = Engine.start_link(project) + {:ok, _node_name, _} = EngineNode.start(project) - project_alive? = project |> ProjectNode.name() |> Process.whereis() |> Process.alive?() + project_alive? = project |> EngineNode.name() |> Process.whereis() |> Process.alive?() assert project_alive? - assert :ok = ProjectNode.stop(project, 1500) - assert Process.whereis(ProjectNode.name(project)) == nil + assert :ok = EngineNode.stop(project, 1500) + assert Process.whereis(EngineNode.name(project)) == nil end test "it should be stopped atomically when the startup process is dead", %{project: project} do @@ -28,13 +28,13 @@ defmodule Engine.ProjectNodeTest do linked_node_process = spawn(fn -> - {:ok, _node_name, _} = Engine.start_link(project) + {:ok, _node_name, _} = EngineNode.start(project) send(test_pid, :started) end) assert_receive :started, 1500 - node_process_name = ProjectNode.name(project) + node_process_name = EngineNode.name(project) assert node_process_name |> Process.whereis() |> Process.alive?() Process.exit(linked_node_process, :kill) diff --git a/apps/expert/test/expert/project/diagnostics/state_test.exs b/apps/expert/test/expert/project/diagnostics/state_test.exs index 234066ae..25fd4315 100644 --- a/apps/expert/test/expert/project/diagnostics/state_test.exs +++ b/apps/expert/test/expert/project/diagnostics/state_test.exs @@ -5,9 +5,9 @@ defmodule Forge.Project.Diagnostics.StateTest do alias Forge.Plugin.V1.Diagnostic alias Forge.Project - import Engine.Test.Fixtures + import Forge.Test.Fixtures - use Engine.Test.CodeMod.Case + use Forge.Test.CodeMod.Case setup do {:ok, _} = start_supervised(Forge.Document.Store) diff --git a/apps/expert/test/expert/project/diagnostics_test.exs b/apps/expert/test/expert/project/diagnostics_test.exs index 687a2a85..ee0213a8 100644 --- a/apps/expert/test/expert/project/diagnostics_test.exs +++ b/apps/expert/test/expert/project/diagnostics_test.exs @@ -1,4 +1,5 @@ defmodule Expert.Project.DiagnosticsTest do + alias Expert.EngineApi alias Expert.Test.DispatchFake alias Forge.Document alias Forge.Plugin.V1.Diagnostic @@ -10,8 +11,8 @@ defmodule Expert.Project.DiagnosticsTest do use Patch use DispatchFake - import Engine.Api.Messages - import Engine.Test.Fixtures + import Forge.EngineApi.Messages + import Forge.Test.Fixtures setup do project = project() @@ -72,7 +73,7 @@ defmodule Expert.Project.DiagnosticsTest do file_diagnostics_message = file_diagnostics(diagnostics: [diagnostic(document.uri)], uri: document.uri) - Engine.Api.broadcast(project, file_diagnostics_message) + EngineApi.broadcast(project, file_diagnostics_message) expected_severity = GenLSP.Enumerations.DiagnosticSeverity.error() @@ -91,8 +92,8 @@ defmodule Expert.Project.DiagnosticsTest do Document.Store.get_and_update(document.uri, &{:ok, Document.mark_clean(&1)}) - Engine.Api.broadcast(project, project_compile_requested()) - Engine.Api.broadcast(project, project_diagnostics(diagnostics: [])) + EngineApi.broadcast(project, project_compile_requested()) + EngineApi.broadcast(project, project_diagnostics(diagnostics: [])) assert_receive {:transport, %TextDocumentPublishDiagnostics{ @@ -108,13 +109,13 @@ defmodule Expert.Project.DiagnosticsTest do file_diagnostics_message = file_diagnostics(diagnostics: [diagnostic(document.uri)], uri: document.uri) - Engine.Api.broadcast(project, file_diagnostics_message) + EngineApi.broadcast(project, file_diagnostics_message) assert_receive {:transport, %TextDocumentPublishDiagnostics{}}, 500 Document.Store.close(document.uri) - Engine.Api.broadcast(project, project_compile_requested()) - Engine.Api.broadcast(project, project_diagnostics(diagnostics: [])) + EngineApi.broadcast(project, project_compile_requested()) + EngineApi.broadcast(project, project_diagnostics(diagnostics: [])) assert_receive {:transport, %TextDocumentPublishDiagnostics{ @@ -133,7 +134,7 @@ defmodule Expert.Project.DiagnosticsTest do file_diagnostics_message = file_diagnostics(diagnostics: [diagnostic], uri: document.uri) - Engine.Api.broadcast(project, file_diagnostics_message) + EngineApi.broadcast(project, file_diagnostics_message) assert_receive {:transport, %TextDocumentPublishDiagnostics{ diff --git a/apps/expert/test/expert/project/intelligence_test.exs b/apps/expert/test/expert/project/intelligence_test.exs index 17c661d2..1484e32e 100644 --- a/apps/expert/test/expert/project/intelligence_test.exs +++ b/apps/expert/test/expert/project/intelligence_test.exs @@ -1,8 +1,9 @@ defmodule Expert.Project.IntelligenceTest do - alias Engine.Api.Messages - alias Engine.Test.Fixtures + alias Expert.EngineApi alias Expert.Project.Intelligence alias Expert.Test.DispatchFake + alias Forge.EngineApi.Messages + alias Forge.Test.Fixtures use ExUnit.Case use Patch @@ -38,7 +39,7 @@ defmodule Expert.Project.IntelligenceTest do struct: [name: nil] ) ] - |> Enum.each(&Engine.Api.broadcast(project, &1)) + |> Enum.each(&EngineApi.broadcast(project, &1)) Process.sleep(50) :ok diff --git a/apps/expert/test/expert/project/node_test.exs b/apps/expert/test/expert/project/node_test.exs index 0a4db7d4..58f5d917 100644 --- a/apps/expert/test/expert/project/node_test.exs +++ b/apps/expert/test/expert/project/node_test.exs @@ -1,7 +1,9 @@ defmodule Expert.Project.NodeTest do - import Engine.Test.Fixtures - import Engine.Api.Messages - alias Expert.Project.Node, as: ProjectNode + alias Expert.EngineApi + alias Expert.Project.Node, as: EngineNode + + import Forge.Test.Fixtures + import Forge.EngineApi.Messages use ExUnit.Case use Forge.Test.EventualAssertions @@ -9,10 +11,10 @@ defmodule Expert.Project.NodeTest do setup do project = project() - {:ok, _} = start_supervised({DynamicSupervisor, Expert.Project.Supervisor.options()}) + {:ok, _} = start_supervised({DynamicSupervisor, Expert.Project.DynamicSupervisor.options()}) {:ok, _} = start_supervised({Expert.Project.Supervisor, project}) - :ok = Engine.Api.register_listener(project, self(), [project_compiled()]) + :ok = EngineApi.register_listener(project, self(), [project_compiled()]) {:ok, project: project} end @@ -22,16 +24,16 @@ defmodule Expert.Project.NodeTest do end test "remote control is started when the node starts", %{project: project} do - apps = Engine.call(project, Application, :started_applications) + apps = EngineApi.call(project, Application, :started_applications) app_names = Enum.map(apps, &elem(&1, 0)) assert :engine in app_names end test "the node is restarted when it goes down", %{project: project} do - node_name = ProjectNode.node_name(project) + node_name = EngineNode.node_name(project) old_pid = node_pid(project) - :ok = Engine.stop(project) + :ok = EngineApi.stop(project) assert_eventually Node.ping(node_name) == :pong, 1000 new_pid = node_pid(project) @@ -40,8 +42,8 @@ defmodule Expert.Project.NodeTest do end test "the node restarts when the supervisor pid is killed", %{project: project} do - node_name = ProjectNode.node_name(project) - supervisor_pid = Engine.call(project, Process, :whereis, [Engine.Supervisor]) + node_name = EngineNode.node_name(project) + supervisor_pid = EngineApi.call(project, Process, :whereis, [Engine.Supervisor]) assert is_pid(supervisor_pid) Process.exit(supervisor_pid, :kill) @@ -50,7 +52,7 @@ defmodule Expert.Project.NodeTest do defp node_pid(project) do project - |> Engine.ProjectNode.name() + |> Expert.EngineNode.name() |> Process.whereis() end end diff --git a/apps/expert/test/expert/project/progress/state_test.exs b/apps/expert/test/expert/project/progress/state_test.exs index 484a96a0..4c87d4cf 100644 --- a/apps/expert/test/expert/project/progress/state_test.exs +++ b/apps/expert/test/expert/project/progress/state_test.exs @@ -2,8 +2,8 @@ defmodule Expert.Project.Progress.StateTest do alias Expert.Project.Progress.State alias Expert.Project.Progress.Value - import Engine.Api.Messages - import Engine.Test.Fixtures + import Forge.EngineApi.Messages + import Forge.Test.Fixtures use ExUnit.Case, async: true diff --git a/apps/expert/test/expert/project/progress/support_test.exs b/apps/expert/test/expert/project/progress/support_test.exs index 37bc0e55..ef1eabd0 100644 --- a/apps/expert/test/expert/project/progress/support_test.exs +++ b/apps/expert/test/expert/project/progress/support_test.exs @@ -1,8 +1,8 @@ defmodule Expert.Project.Progress.SupportTest do alias Expert.Project.Progress - import Engine.Api.Messages - import Engine.Test.Fixtures + import Forge.EngineApi.Messages + import Forge.Test.Fixtures use ExUnit.Case use Patch diff --git a/apps/expert/test/expert/project/progress_test.exs b/apps/expert/test/expert/project/progress_test.exs index 3c370044..45725893 100644 --- a/apps/expert/test/expert/project/progress_test.exs +++ b/apps/expert/test/expert/project/progress_test.exs @@ -1,13 +1,14 @@ defmodule Expert.Project.ProgressTest do alias Expert.Configuration + alias Expert.EngineApi alias Expert.Project alias Expert.Test.DispatchFake alias GenLSP.Notifications alias GenLSP.Requests alias GenLSP.Structures - import Engine.Test.Fixtures - import Engine.Api.Messages + import Forge.Test.Fixtures + import Forge.EngineApi.Messages use ExUnit.Case use Patch @@ -26,17 +27,17 @@ defmodule Expert.Project.ProgressTest do def percent_begin(project, label, max) do message = percent_progress(stage: :begin, label: label, max: max) - Engine.Api.broadcast(project, message) + EngineApi.broadcast(project, message) end defp percent_report(project, label, delta, message \\ nil) do message = percent_progress(stage: :report, label: label, message: message, delta: delta) - Engine.Api.broadcast(project, message) + EngineApi.broadcast(project, message) end defp percent_complete(project, label, message) do message = percent_progress(stage: :complete, label: label, message: message) - Engine.Api.broadcast(project, message) + EngineApi.broadcast(project, message) end def progress(stage, label, message \\ "") do @@ -69,7 +70,7 @@ defmodule Expert.Project.ProgressTest do patch(Configuration, :client_supports?, fn :work_done_progress -> true end) begin_message = progress(:begin, "mix compile") - Engine.Api.broadcast(project, begin_message) + EngineApi.broadcast(project, begin_message) assert_receive {:transport, %Requests.WindowWorkDoneProgressCreate{ @@ -79,7 +80,7 @@ defmodule Expert.Project.ProgressTest do assert_receive {:transport, %Notifications.DollarProgress{}} report_message = progress(:report, "mix compile", "lib/file.ex") - Engine.Api.broadcast(project, report_message) + EngineApi.broadcast(project, report_message) assert_receive {:transport, %Notifications.DollarProgress{ @@ -96,7 +97,7 @@ defmodule Expert.Project.ProgressTest do patch(Configuration, :client_supports?, fn :work_done_progress -> false end) begin_message = progress(:begin, "mix compile") - Engine.Api.broadcast(project, begin_message) + EngineApi.broadcast(project, begin_message) refute_receive {:transport, %Requests.WindowWorkDoneProgressCreate{params: %{}}} end diff --git a/apps/expert/test/expert/provider/handlers/code_lens_test.exs b/apps/expert/test/expert/provider/handlers/code_lens_test.exs index 8d40cc34..3c71541a 100644 --- a/apps/expert/test/expert/provider/handlers/code_lens_test.exs +++ b/apps/expert/test/expert/provider/handlers/code_lens_test.exs @@ -1,4 +1,5 @@ defmodule Expert.Provider.Handlers.CodeLensTest do + alias Expert.EngineApi alias Expert.Provider.Handlers alias Forge.Document alias Forge.Project @@ -7,8 +8,8 @@ defmodule Expert.Provider.Handlers.CodeLensTest do alias GenLSP.Requests.TextDocumentCodeLens alias GenLSP.Structures - import Engine.Api.Messages - import Engine.Test.Fixtures + import Forge.EngineApi.Messages + import Forge.Test.Fixtures import Forge.Test.RangeSupport use ExUnit.Case, async: false @@ -18,11 +19,11 @@ defmodule Expert.Provider.Handlers.CodeLensTest do start_supervised(Document.Store) project = project(:umbrella) - start_supervised!({DynamicSupervisor, Expert.Project.Supervisor.options()}) + start_supervised!({DynamicSupervisor, Expert.Project.DynamicSupervisor.options()}) start_supervised!({Expert.Project.Supervisor, project}) - Engine.Api.register_listener(project, self(), [project_compiled()]) - Engine.Api.schedule_compile(project, true) + EngineApi.register_listener(project, self(), [project_compiled()]) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(), 5000 @@ -30,7 +31,7 @@ defmodule Expert.Provider.Handlers.CodeLensTest do end defp with_indexing_enabled(_) do - patch(Engine.Api, :index_running?, false) + patch(EngineApi, :index_running?, false) :ok end diff --git a/apps/expert/test/expert/provider/handlers/find_references_test.exs b/apps/expert/test/expert/provider/handlers/find_references_test.exs index cd31e3ad..254471ea 100644 --- a/apps/expert/test/expert/provider/handlers/find_references_test.exs +++ b/apps/expert/test/expert/provider/handlers/find_references_test.exs @@ -1,4 +1,5 @@ defmodule Expert.Provider.Handlers.FindReferencesTest do + alias Expert.EngineApi alias Expert.Provider.Handlers alias Forge.Ast.Analysis alias Forge.Document @@ -7,7 +8,7 @@ defmodule Expert.Provider.Handlers.FindReferencesTest do alias GenLSP.Requests.TextDocumentReferences alias GenLSP.Structures - import Engine.Test.Fixtures + import Forge.Test.Fixtures use ExUnit.Case, async: false use Patch @@ -50,7 +51,7 @@ defmodule Expert.Provider.Handlers.FindReferencesTest do describe "find references" do test "returns locations that the entity returns", %{project: project, uri: uri} do - patch(Engine.Api, :references, fn ^project, %Analysis{document: document}, _position, _ -> + patch(EngineApi, :references, fn ^project, %Analysis{document: document}, _position, _ -> locations = [ Location.new( Document.Range.new( @@ -71,7 +72,7 @@ defmodule Expert.Provider.Handlers.FindReferencesTest do end test "returns nothing if the entity can't resolve it", %{project: project, uri: uri} do - patch(Engine.Api, :references, nil) + patch(EngineApi, :references, nil) {:ok, request} = build_request(uri, 1, 5) diff --git a/apps/expert/test/expert/provider/handlers/formatting_test.exs b/apps/expert/test/expert/provider/handlers/formatting_test.exs new file mode 100644 index 00000000..9471c839 --- /dev/null +++ b/apps/expert/test/expert/provider/handlers/formatting_test.exs @@ -0,0 +1,42 @@ +defmodule Expert.Provider.Handlers.FormattingTest do + alias Expert.EngineApi + alias Expert.EngineNode + alias Forge.Document + alias Forge.EngineApi.Messages + + use Forge.Test.CodeMod.Case, enable_ast_conversion: false + import Messages + + def document(file_uri, text) do + Document.new(file_uri, text, 1) + end + + def with_real_project(%{project: project}) do + {:ok, _} = start_supervised({Expert.EngineSupervisor, project}) + {:ok, _, _} = EngineNode.start(project) + EngineApi.register_listener(project, self(), [:all]) + :ok + end + + setup do + project = project() + Engine.set_project(project) + {:ok, project: project} + end + + describe "emitting diagnostics" do + setup [:with_real_project] + + test "it should emit diagnostics when a syntax error occurs", %{project: project} do + text = ~q[ + def foo(a, ) do + end + ] + document = document("file:///file.ex", text) + EngineApi.format(project, document) + + assert_receive file_diagnostics(diagnostics: [diagnostic]), 500 + assert diagnostic.message =~ "syntax error" + end + end +end diff --git a/apps/expert/test/expert/provider/handlers/go_to_definition_test.exs b/apps/expert/test/expert/provider/handlers/go_to_definition_test.exs index 3d29bf04..499296b9 100644 --- a/apps/expert/test/expert/provider/handlers/go_to_definition_test.exs +++ b/apps/expert/test/expert/provider/handlers/go_to_definition_test.exs @@ -1,4 +1,5 @@ defmodule Expert.Provider.Handlers.GoToDefinitionTest do + alias Expert.EngineApi alias Expert.Provider.Handlers alias Forge.Document alias Forge.Document.Location @@ -6,8 +7,8 @@ defmodule Expert.Provider.Handlers.GoToDefinitionTest do alias GenLSP.Requests.TextDocumentDefinition alias GenLSP.Structures - import Engine.Api.Messages - import Engine.Test.Fixtures + import Forge.EngineApi.Messages + import Forge.Test.Fixtures use ExUnit.Case, async: false @@ -15,15 +16,15 @@ defmodule Expert.Provider.Handlers.GoToDefinitionTest do project = project(:navigations) start_supervised!(Expert.Application.document_store_child_spec()) - start_supervised!({DynamicSupervisor, Expert.Project.Supervisor.options()}) + start_supervised!({DynamicSupervisor, Expert.Project.DynamicSupervisor.options()}) start_supervised!({Expert.Project.Supervisor, project}) - Engine.Api.register_listener(project, self(), [ + EngineApi.register_listener(project, self(), [ project_compiled(), project_index_ready() ]) - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(), 5000 assert_receive project_index_ready(), 5000 diff --git a/apps/expert/test/expert/provider/handlers/hover_test.exs b/apps/expert/test/expert/provider/handlers/hover_test.exs index a25919f2..2142413b 100644 --- a/apps/expert/test/expert/provider/handlers/hover_test.exs +++ b/apps/expert/test/expert/provider/handlers/hover_test.exs @@ -1,10 +1,11 @@ defmodule Expert.Provider.Handlers.HoverTest do - alias Engine.Api.Messages - alias Engine.Test.Fixtures + alias Expert.EngineApi alias Expert.Provider.Handlers alias Forge.Document alias Forge.Document.Position + alias Forge.EngineApi.Messages alias Forge.Protocol.Convert + alias Forge.Test.Fixtures alias GenLSP.Requests alias GenLSP.Structures @@ -20,10 +21,10 @@ defmodule Expert.Provider.Handlers.HoverTest do project = Fixtures.project() start_supervised!(Expert.Application.document_store_child_spec()) - start_supervised!({DynamicSupervisor, Expert.Project.Supervisor.options()}) + start_supervised!({DynamicSupervisor, Expert.Project.DynamicSupervisor.options()}) start_supervised!({Expert.Project.Supervisor, project}) - :ok = Engine.Api.register_listener(project, self(), [Messages.project_compiled()]) + :ok = EngineApi.register_listener(project, self(), [Messages.project_compiled()]) assert_receive Messages.project_compiled(), 5000 {:ok, project: project} @@ -46,7 +47,7 @@ defmodule Expert.Provider.Handlers.HoverTest do end) {:ok, modules, _} = - Engine.call(project, Kernel.ParallelCompiler, :compile_to_path, [ + EngineApi.call(project, Kernel.ParallelCompiler, :compile_to_path, [ [tmp_path], compile_path ]) @@ -55,8 +56,8 @@ defmodule Expert.Provider.Handlers.HoverTest do fun.() after for module <- modules do - path = Engine.call(project, :code, :which, [module]) - Engine.call(project, :code, :delete, [module]) + path = EngineApi.call(project, :code, :which, [module]) + EngineApi.call(project, :code, :delete, [module]) File.rm!(path) end end diff --git a/apps/expert/test/support/test/completion_case.ex b/apps/expert/test/support/test/completion_case.ex index 5ad8f316..2b313f1f 100644 --- a/apps/expert/test/support/test/completion_case.ex +++ b/apps/expert/test/support/test/completion_case.ex @@ -1,5 +1,6 @@ defmodule Expert.Test.Expert.CompletionCase do alias Expert.CodeIntelligence.Completion + alias Expert.EngineApi alias Forge.Ast alias Forge.Document alias Forge.Project @@ -11,21 +12,21 @@ defmodule Expert.Test.Expert.CompletionCase do use ExUnit.CaseTemplate import Forge.Test.CursorSupport - import Engine.Test.Fixtures - import Engine.Api.Messages + import Forge.Test.Fixtures + import Forge.EngineApi.Messages setup_all do project = project() - start_supervised!({DynamicSupervisor, Expert.Project.Supervisor.options()}) + start_supervised!({DynamicSupervisor, Expert.Project.DynamicSupervisor.options()}) start_supervised!({Expert.Project.Supervisor, project}) - Engine.Api.register_listener(project, self(), [ + EngineApi.register_listener(project, self(), [ project_compiled(), project_index_ready() ]) - Engine.Api.schedule_compile(project, true) + EngineApi.schedule_compile(project, true) assert_receive project_compiled(), 5000 assert_receive project_index_ready(), 5000 {:ok, project: project} diff --git a/apps/expert/test/support/test/dispatch_fake.ex b/apps/expert/test/support/test/dispatch_fake.ex index e70aeb76..d77e40f8 100644 --- a/apps/expert/test/support/test/dispatch_fake.ex +++ b/apps/expert/test/support/test/dispatch_fake.ex @@ -12,11 +12,11 @@ defmodule Expert.Test.DispatchFake do # does that for us. defmacro start do quote do - patch(Engine.Api, :register_listener, fn _project, listener_pid, message_types -> + patch(Expert.EngineApi, :register_listener, fn _project, listener_pid, message_types -> Dispatch.register_listener(listener_pid, message_types) end) - patch(Engine.Api, :broadcast, fn _project, message -> + patch(Expert.EngineApi, :broadcast, fn _project, message -> Dispatch.broadcast(message) end) diff --git a/apps/expert/test/test_helper.exs b/apps/expert/test/test_helper.exs index 8e6e63c4..15d06e94 100644 --- a/apps/expert/test/test_helper.exs +++ b/apps/expert/test/test_helper.exs @@ -1,6 +1,17 @@ Application.ensure_all_started(:snowflake) -ExUnit.configure(timeout: :infinity) -ExUnit.start() +Application.ensure_all_started(:refactorex) +{"", 0} = System.cmd("epmd", ~w(-daemon)) +random_number = :rand.uniform(500) + +with :nonode@nohost <- Node.self() do + {:ok, _pid} = + :net_kernel.start(:"testing-#{random_number}@127.0.0.1", %{name_domain: :longnames}) +end + +Engine.Module.Loader.start_link(nil) +ExUnit.configure(timeout: :infinity, assert_receive_timeout: 1000) + +ExUnit.start(exclude: [:skip]) if Version.match?(System.version(), ">= 1.15.0") do Logger.configure(level: :none) diff --git a/apps/forge/.credo.exs b/apps/forge/.credo.exs index b65c86be..d489cea3 100644 --- a/apps/forge/.credo.exs +++ b/apps/forge/.credo.exs @@ -1,3 +1,5 @@ Code.require_file("../../mix_credo.exs") -Mix.Credo.config(excluded: ["lib/future/**/*.ex"]) +Mix.Credo.config( + excluded: ["lib/future/**/*.ex", "test/fixtures/**/*.ex", "test/fixtures/**/*.exs"] +) diff --git a/apps/forge/.formatter.exs b/apps/forge/.formatter.exs index a2d1d585..d7a78d80 100644 --- a/apps/forge/.formatter.exs +++ b/apps/forge/.formatter.exs @@ -15,13 +15,39 @@ detected_assertions = [ assertions = eventual_assertions ++ detected_assertions +current_directory = Path.dirname(__ENV__.file) + +impossible_to_format = [ + Path.join([ + current_directory, + "test", + "fixtures", + "compilation_errors", + "lib", + "compilation_errors.ex" + ]), + Path.join([current_directory, "test", "fixtures", "parse_errors", "lib", "parse_errors.ex"]) +] + +inputs = + Enum.flat_map( + [ + "{mix,.formatter}.exs", + "{config,test}/**/*.{ex,exs}", + "lib/forge/**/*.{ex,ex}", + "lib/mix/**/*.{ex,exs}" + ], + fn path -> + current_directory + |> Path.join(path) + |> Path.wildcard() + end + ) + +inputs = inputs -- impossible_to_format + [ - inputs: [ - "{mix,.formatter}.exs", - "{config,test}/**/*.{ex,exs}", - "lib/forge/**/*.{ex,ex}", - "lib/mix/**/*.{ex,exs}" - ], + inputs: inputs, locals_without_parens: assertions, export: [locals_without_parens: assertions] ] diff --git a/apps/forge/lib/forge/code_action.ex b/apps/forge/lib/forge/code_action.ex new file mode 100644 index 00000000..3a6fd50b --- /dev/null +++ b/apps/forge/lib/forge/code_action.ex @@ -0,0 +1,23 @@ +defmodule Forge.CodeAction do + alias Forge.Document.Changes + + require Logger + + defstruct [:title, :kind, :changes, :uri] + + @type code_action_kind :: GenLSP.Enumerations.CodeActionKind.t() + + @type trigger_kind :: GenLSP.Enumerations.CodeActionTriggerKind.t() + + @type t :: %__MODULE__{ + title: String.t(), + kind: code_action_kind, + changes: Changes.t(), + uri: Forge.uri() + } + + @spec new(Forge.uri(), String.t(), code_action_kind(), Changes.t()) :: t() + def new(uri, title, kind, changes) do + %__MODULE__{uri: uri, title: title, changes: changes, kind: kind} + end +end diff --git a/apps/engine/lib/engine/engine/code_action/diagnostic.ex b/apps/forge/lib/forge/code_action/diagnostic.ex similarity index 91% rename from apps/engine/lib/engine/engine/code_action/diagnostic.ex rename to apps/forge/lib/forge/code_action/diagnostic.ex index 8d4c3086..3a6a3d81 100644 --- a/apps/engine/lib/engine/engine/code_action/diagnostic.ex +++ b/apps/forge/lib/forge/code_action/diagnostic.ex @@ -1,4 +1,4 @@ -defmodule Engine.CodeAction.Diagnostic do +defmodule Forge.CodeAction.Diagnostic do alias Forge.Document.Range defstruct [:range, :message, :source] diff --git a/apps/forge/lib/forge/code_intelligence/docs.ex b/apps/forge/lib/forge/code_intelligence/docs.ex new file mode 100644 index 00000000..9d342593 --- /dev/null +++ b/apps/forge/lib/forge/code_intelligence/docs.ex @@ -0,0 +1,13 @@ +defmodule Forge.CodeIntelligence.Docs do + alias Forge.CodeIntelligence.Docs.Entry + + defstruct [:module, :doc, functions_and_macros: [], callbacks: [], types: []] + + @type t :: %__MODULE__{ + module: module(), + doc: Entry.content(), + functions_and_macros: %{optional(atom()) => [Entry.t(:function | :macro)]}, + callbacks: %{optional(atom()) => [Entry.t(:callback)]}, + types: %{optional(atom()) => [Entry.t(:type)]} + } +end diff --git a/apps/engine/lib/engine/engine/code_intelligence/docs/entry.ex b/apps/forge/lib/forge/code_intelligence/docs/entry.ex similarity index 96% rename from apps/engine/lib/engine/engine/code_intelligence/docs/entry.ex rename to apps/forge/lib/forge/code_intelligence/docs/entry.ex index 359ae0f2..420788dc 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/docs/entry.ex +++ b/apps/forge/lib/forge/code_intelligence/docs/entry.ex @@ -1,4 +1,4 @@ -defmodule Engine.CodeIntelligence.Docs.Entry do +defmodule Forge.CodeIntelligence.Docs.Entry do @moduledoc """ A documentation entry for a named entity within a module. """ diff --git a/apps/engine/lib/engine/engine/code_intelligence/symbols/document.ex b/apps/forge/lib/forge/code_intelligence/symbols/document.ex similarity index 96% rename from apps/engine/lib/engine/engine/code_intelligence/symbols/document.ex rename to apps/forge/lib/forge/code_intelligence/symbols/document.ex index 6aa680d8..5bf9b53f 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/symbols/document.ex +++ b/apps/forge/lib/forge/code_intelligence/symbols/document.ex @@ -1,7 +1,7 @@ -defmodule Engine.CodeIntelligence.Symbols.Document do - alias Engine.Search.Indexer.Entry +defmodule Forge.CodeIntelligence.Symbols.Document do alias Forge.Document alias Forge.Formats + alias Forge.Search.Indexer.Entry defstruct [:name, :type, :range, :detail_range, :detail, :original_type, :subject, children: []] diff --git a/apps/engine/lib/engine/engine/code_intelligence/symbols/workspace.ex b/apps/forge/lib/forge/code_intelligence/symbols/workspace.ex similarity index 92% rename from apps/engine/lib/engine/engine/code_intelligence/symbols/workspace.ex rename to apps/forge/lib/forge/code_intelligence/symbols/workspace.ex index 64dc0e94..ec86fdf5 100644 --- a/apps/engine/lib/engine/engine/code_intelligence/symbols/workspace.ex +++ b/apps/forge/lib/forge/code_intelligence/symbols/workspace.ex @@ -1,4 +1,4 @@ -defmodule Engine.CodeIntelligence.Symbols.Workspace do +defmodule Forge.CodeIntelligence.Symbols.Workspace do defmodule Link do defstruct [:uri, :range, :detail_range] @@ -13,9 +13,9 @@ defmodule Engine.CodeIntelligence.Symbols.Workspace do end end - alias Engine.Search.Indexer.Entry alias Forge.Document alias Forge.Formats + alias Forge.Search.Indexer.Entry defstruct [:name, :type, :link, container_name: nil] diff --git a/apps/engine/lib/engine/engine/completion/candidate.ex b/apps/forge/lib/forge/completion/candidate.ex similarity index 98% rename from apps/engine/lib/engine/engine/completion/candidate.ex rename to apps/forge/lib/forge/completion/candidate.ex index 00a5199a..d7cabc8b 100644 --- a/apps/engine/lib/engine/engine/completion/candidate.ex +++ b/apps/forge/lib/forge/completion/candidate.ex @@ -1,5 +1,5 @@ -defmodule Engine.Completion.Candidate do - alias Engine.Completion.Candidate.ArgumentNames +defmodule Forge.Completion.Candidate do + alias Forge.Completion.Candidate.ArgumentNames require Logger defmodule Function do diff --git a/apps/engine/lib/engine/engine/completion/candidate/argument_names.ex b/apps/forge/lib/forge/completion/candidate/argument_names.ex similarity index 98% rename from apps/engine/lib/engine/engine/completion/candidate/argument_names.ex rename to apps/forge/lib/forge/completion/candidate/argument_names.ex index d8d2e1b8..1fccfed5 100644 --- a/apps/engine/lib/engine/engine/completion/candidate/argument_names.ex +++ b/apps/forge/lib/forge/completion/candidate/argument_names.ex @@ -1,4 +1,4 @@ -defmodule Engine.Completion.Candidate.ArgumentNames do +defmodule Forge.Completion.Candidate.ArgumentNames do @moduledoc """ Elixir sense, for whatever reason returns all the argument names when asked to do a completion on a function. This means that the arity of the function might differ from the argument names returned. Furthermore, the diff --git a/apps/engine/lib/engine/engine/api/messages.ex b/apps/forge/lib/forge/engine_api/messages.ex similarity index 99% rename from apps/engine/lib/engine/engine/api/messages.ex rename to apps/forge/lib/forge/engine_api/messages.ex index 49afdada..f1d83b2d 100644 --- a/apps/engine/lib/engine/engine/api/messages.ex +++ b/apps/forge/lib/forge/engine_api/messages.ex @@ -1,4 +1,4 @@ -defmodule Engine.Api.Messages do +defmodule Forge.EngineApi.Messages do alias Forge.Project import Record diff --git a/apps/engine/lib/mix/tasks/namespace/abstract.ex b/apps/forge/lib/forge/namespace/abstract.ex similarity index 98% rename from apps/engine/lib/mix/tasks/namespace/abstract.ex rename to apps/forge/lib/forge/namespace/abstract.ex index b6139971..8a2fa074 100644 --- a/apps/engine/lib/mix/tasks/namespace/abstract.ex +++ b/apps/forge/lib/forge/namespace/abstract.ex @@ -1,4 +1,4 @@ -defmodule Mix.Tasks.Namespace.Abstract do +defmodule Forge.Namespace.Abstract do @moduledoc """ Transformations from erlang abstract syntax @@ -6,8 +6,6 @@ defmodule Mix.Tasks.Namespace.Abstract do https://www.erlang.org/doc/apps/erts/absform.html """ - alias Mix.Tasks.Namespace - def rewrite(abstract_format) when is_list(abstract_format) do Enum.map(abstract_format, &rewrite/1) end @@ -67,7 +65,7 @@ defmodule Mix.Tasks.Namespace.Abstract do {:for, rewrite(target)} end - defp do_rewrite({:protocol, protocol}) do + defp do_rewrite({:protocol, protocol}) when is_atom(protocol) do {:protocol, rewrite_module(protocol)} end @@ -296,6 +294,6 @@ defmodule Mix.Tasks.Namespace.Abstract do end defp rewrite_module(module) do - Namespace.Module.apply(module) + Forge.Namespace.Module.apply(module) end end diff --git a/apps/engine/lib/mix/tasks/namespace/code.ex b/apps/forge/lib/forge/namespace/code.ex similarity index 70% rename from apps/engine/lib/mix/tasks/namespace/code.ex rename to apps/forge/lib/forge/namespace/code.ex index 60523a3d..618c007f 100644 --- a/apps/engine/lib/mix/tasks/namespace/code.ex +++ b/apps/forge/lib/forge/namespace/code.ex @@ -1,4 +1,4 @@ -defmodule Mix.Tasks.Namespace.Code do +defmodule Forge.Namespace.Code do def compile(forms) do :compile.forms(forms, [:return_errors, :debug_info]) end diff --git a/apps/engine/lib/mix/tasks/namespace/transform/erlang.ex b/apps/forge/lib/forge/namespace/erlang.ex similarity index 93% rename from apps/engine/lib/mix/tasks/namespace/transform/erlang.ex rename to apps/forge/lib/forge/namespace/erlang.ex index 77fa59c5..f4b225bf 100644 --- a/apps/engine/lib/mix/tasks/namespace/transform/erlang.ex +++ b/apps/forge/lib/forge/namespace/erlang.ex @@ -1,4 +1,4 @@ -defmodule Mix.Tasks.Namespace.Transform.Erlang do +defmodule Forge.Namespace.Erlang do @moduledoc """ Utilities for reading and writing erlang terms from and to text """ diff --git a/apps/engine/lib/mix/tasks/namespace/module.ex b/apps/forge/lib/forge/namespace/module.ex similarity index 91% rename from apps/engine/lib/mix/tasks/namespace/module.ex rename to apps/forge/lib/forge/namespace/module.ex index 214bddf7..64ba6634 100644 --- a/apps/engine/lib/mix/tasks/namespace/module.ex +++ b/apps/forge/lib/forge/namespace/module.ex @@ -1,6 +1,4 @@ -defmodule Mix.Tasks.Namespace.Module do - alias Mix.Tasks.Namespace - +defmodule Forge.Namespace.Module do @namespace_prefix "XP" def apply(module_name) do @@ -8,7 +6,7 @@ defmodule Mix.Tasks.Namespace.Module do prefixed?(module_name) -> module_name - module_name in Namespace.app_names() -> + module_name in Mix.Tasks.Namespace.app_names() -> :"xp_#{module_name}" true -> @@ -41,7 +39,7 @@ defmodule Mix.Tasks.Namespace.Module do do: false defp apply_namespace("Elixir." <> rest) do - Namespace.root_modules() + Mix.Tasks.Namespace.root_modules() |> Enum.map(fn module -> module |> Module.split() |> List.first() end) |> Enum.reduce_while(rest, fn root_module, module -> if has_root_module?(root_module, module) do diff --git a/apps/forge/lib/forge/namespace/path.ex b/apps/forge/lib/forge/namespace/path.ex new file mode 100644 index 00000000..060feea8 --- /dev/null +++ b/apps/forge/lib/forge/namespace/path.ex @@ -0,0 +1,38 @@ +defmodule Forge.Namespace.Path do + def apply(path) when is_list(path) do + path + |> List.to_string() + |> apply() + |> String.to_charlist() + end + + def apply(path) when is_binary(path) do + path + |> Path.split() + |> Enum.map(&replace_namespaced_apps/1) + |> Path.join() + end + + defp replace_namespaced_apps(path_component) do + Enum.reduce(Mix.Tasks.Namespace.app_names(), path_component, fn app_name, path -> + [path | vsn] = String.split(path, "-") + + if path == Atom.to_string(app_name) do + new_path = + app_name + |> Forge.Namespace.Module.apply() + |> Atom.to_string() + + rebuild_path(new_path, vsn) + else + rebuild_path(path, vsn) + end + end) + end + + defp rebuild_path(path, []), do: path + + defp rebuild_path(path, rest) do + "#{path}-#{Enum.join(rest, "-")}" + end +end diff --git a/apps/engine/lib/mix/tasks/namespace/transform/app_directories.ex b/apps/forge/lib/forge/namespace/transform/app_directories.ex similarity index 50% rename from apps/engine/lib/mix/tasks/namespace/transform/app_directories.ex rename to apps/forge/lib/forge/namespace/transform/app_directories.ex index 0d26725a..fa477581 100644 --- a/apps/engine/lib/mix/tasks/namespace/transform/app_directories.ex +++ b/apps/forge/lib/forge/namespace/transform/app_directories.ex @@ -1,27 +1,30 @@ -defmodule Mix.Tasks.Namespace.Transform.AppDirectories do - alias Mix.Tasks.Namespace - +defmodule Forge.Namespace.Transform.AppDirectories do def apply_to_all(base_directory) do base_directory |> find_app_directories() |> Enum.each(&apply_transform(base_directory, &1)) end - def apply_transform(base_dirctory, app_path) do + def apply_transform(base_directory, app_path) do namespaced_relative_path = app_path - |> Path.relative_to(base_dirctory) - |> Namespace.Path.apply() + |> Path.relative_to(base_directory) + |> Forge.Namespace.Path.apply() - namespaced_app_path = Path.join(base_dirctory, namespaced_relative_path) + namespaced_app_path = Path.join(base_directory, namespaced_relative_path) with {:ok, _} <- File.rm_rf(namespaced_app_path) do File.rename!(app_path, namespaced_app_path) end + catch + e -> + Mix.Shell.IO.error("Failed to rename app directory") + reraise e, __STACKTRACE__ end defp find_app_directories(base_directory) do - app_globs = Enum.join(Namespace.app_names(), "*,") + app_names = Mix.Tasks.Namespace.app_names() + app_globs = Enum.join(app_names, "*,") [base_directory, "lib", "{" <> app_globs <> "*}"] |> Path.join() diff --git a/apps/engine/lib/mix/tasks/namespace/transform/apps.ex b/apps/forge/lib/forge/namespace/transform/apps.ex similarity index 66% rename from apps/engine/lib/mix/tasks/namespace/transform/apps.ex rename to apps/forge/lib/forge/namespace/transform/apps.ex index a3c1e938..28630a32 100644 --- a/apps/engine/lib/mix/tasks/namespace/transform/apps.ex +++ b/apps/forge/lib/forge/namespace/transform/apps.ex @@ -1,9 +1,7 @@ -defmodule Mix.Tasks.Namespace.Transform.Apps do +defmodule Forge.Namespace.Transform.Apps do @moduledoc """ Applies namespacing to all modules defined in .app files """ - alias Mix.Tasks.Namespace - alias Mix.Tasks.Namespace.Transform def apply_to_all(base_directory) do base_directory @@ -15,7 +13,7 @@ defmodule Mix.Tasks.Namespace.Transform.Apps do end def apply(file_path) do - with {:ok, app_definition} <- Transform.Erlang.path_to_term(file_path), + with {:ok, app_definition} <- Forge.Namespace.Erlang.path_to_term(file_path), {:ok, converted} <- convert(app_definition), :ok <- File.write(file_path, converted) do app_name = @@ -24,7 +22,7 @@ defmodule Mix.Tasks.Namespace.Transform.Apps do |> Path.rootname() |> String.to_atom() - namespaced_app_name = Namespace.Module.apply(app_name) + namespaced_app_name = Forge.Namespace.Module.apply(app_name) new_filename = "#{namespaced_app_name}.app" new_file_path = @@ -34,10 +32,14 @@ defmodule Mix.Tasks.Namespace.Transform.Apps do File.rename!(file_path, new_file_path) end + catch + e -> + Mix.Shell.IO.error("Failed to rename app file") + reraise e, __STACKTRACE__ end defp find_app_files(base_directory) do - app_files_glob = Enum.join(Namespace.app_names(), ",") + app_files_glob = Enum.join(Mix.Tasks.Namespace.app_names(), ",") [base_directory, "**", "{#{app_files_glob}}.app"] |> Path.join() @@ -48,21 +50,21 @@ defmodule Mix.Tasks.Namespace.Transform.Apps do erlang_terms = app_definition |> visit() - |> Transform.Erlang.term_to_string() + |> Forge.Namespace.Erlang.term_to_string() {:ok, erlang_terms} end defp visit({:application, app_name, keys}) do - {:application, Namespace.Module.apply(app_name), Enum.map(keys, &visit/1)} + {:application, Forge.Namespace.Module.apply(app_name), Enum.map(keys, &visit/1)} end defp visit({:applications, app_list}) do - {:applications, Enum.map(app_list, &Namespace.Module.apply/1)} + {:applications, Enum.map(app_list, &Forge.Namespace.Module.apply/1)} end defp visit({:modules, module_list}) do - {:modules, Enum.map(module_list, &Namespace.Module.apply/1)} + {:modules, Enum.map(module_list, &Forge.Namespace.Module.apply/1)} end defp visit({:description, desc}) do @@ -70,7 +72,7 @@ defmodule Mix.Tasks.Namespace.Transform.Apps do end defp visit({:mod, {module_name, args}}) do - {:mod, {Namespace.Module.apply(module_name), args}} + {:mod, {Forge.Namespace.Module.apply(module_name), args}} end defp visit(key_value) do diff --git a/apps/engine/lib/mix/tasks/namespace/transform/beams.ex b/apps/forge/lib/forge/namespace/transform/beams.ex similarity index 93% rename from apps/engine/lib/mix/tasks/namespace/transform/beams.ex rename to apps/forge/lib/forge/namespace/transform/beams.ex index 0dfe6452..ca44c363 100644 --- a/apps/engine/lib/mix/tasks/namespace/transform/beams.ex +++ b/apps/forge/lib/forge/namespace/transform/beams.ex @@ -1,11 +1,10 @@ -defmodule Mix.Tasks.Namespace.Transform.Beams do +defmodule Forge.Namespace.Transform.Beams do @moduledoc """ A transformer that finds and replaces any instance of a module in a .beam file """ - alias Mix.Tasks.Namespace - alias Mix.Tasks.Namespace.Abstract - alias Mix.Tasks.Namespace.Code + alias Forge.Namespace.Abstract + alias Forge.Namespace.Code def apply_to_all(base_directory) do Mix.Shell.IO.info("Rewriting .beam files") @@ -76,7 +75,7 @@ defmodule Mix.Tasks.Namespace.Transform.Beams do end defp find_app_beams(base_directory) do - namespaced_apps = Enum.join(Namespace.app_names(), ",") + namespaced_apps = Enum.join(Mix.Tasks.Namespace.app_names(), ",") apps_glob = "{#{namespaced_apps}}*" [base_directory, "lib", apps_glob, "**", "*.beam"] diff --git a/apps/engine/lib/mix/tasks/namespace/transform/boots.ex b/apps/forge/lib/forge/namespace/transform/boots.ex similarity index 92% rename from apps/engine/lib/mix/tasks/namespace/transform/boots.ex rename to apps/forge/lib/forge/namespace/transform/boots.ex index 0fcc0c6e..c66f5897 100644 --- a/apps/engine/lib/mix/tasks/namespace/transform/boots.ex +++ b/apps/forge/lib/forge/namespace/transform/boots.ex @@ -1,4 +1,4 @@ -defmodule Mix.Tasks.Namespace.Transform.Boots do +defmodule Forge.Namespace.Transform.Boots do @moduledoc """ A transformer that re-builds .boot files by converting a .script file """ diff --git a/apps/engine/lib/mix/tasks/namespace/transform/configs.ex b/apps/forge/lib/forge/namespace/transform/configs.ex similarity index 80% rename from apps/engine/lib/mix/tasks/namespace/transform/configs.ex rename to apps/forge/lib/forge/namespace/transform/configs.ex index 2c455a1f..aed519d2 100644 --- a/apps/engine/lib/mix/tasks/namespace/transform/configs.ex +++ b/apps/forge/lib/forge/namespace/transform/configs.ex @@ -1,9 +1,7 @@ -defmodule Mix.Tasks.Namespace.Transform.Configs do - alias Mix.Tasks.Namespace - +defmodule Forge.Namespace.Transform.Configs do def apply_to_all(base_directory) do base_directory - |> Path.join("**") + |> Path.join("**/releases/**/runtime.exs") |> Path.wildcard() |> Enum.map(&Path.absname/1) |> tap(fn paths -> @@ -22,14 +20,14 @@ defmodule Mix.Tasks.Namespace.Transform.Configs do namespaced_alias = alias |> Module.concat() - |> Namespace.Module.apply() + |> Forge.Namespace.Module.apply() |> Module.split() |> Enum.map(&String.to_atom/1) {:__aliases__, meta, namespaced_alias} atom when is_atom(atom) -> - Namespace.Module.apply(atom) + Forge.Namespace.Module.apply(atom) ast -> ast diff --git a/apps/engine/lib/mix/tasks/namespace/transform/scripts.ex b/apps/forge/lib/forge/namespace/transform/scripts.ex similarity index 67% rename from apps/engine/lib/mix/tasks/namespace/transform/scripts.ex rename to apps/forge/lib/forge/namespace/transform/scripts.ex index 37ea5271..95df751c 100644 --- a/apps/engine/lib/mix/tasks/namespace/transform/scripts.ex +++ b/apps/forge/lib/forge/namespace/transform/scripts.ex @@ -1,11 +1,8 @@ -defmodule Mix.Tasks.Namespace.Transform.Scripts do +defmodule Forge.Namespace.Transform.Scripts do @moduledoc """ A transform that updates any module in .script and .rel files with namespaced versions """ - alias Mix.Tasks.Namespace - alias Mix.Tasks.Namespace.Transform - def apply_to_all(base_directory) do base_directory |> find_scripts() @@ -16,7 +13,7 @@ defmodule Mix.Tasks.Namespace.Transform.Scripts do end def apply(file_path) do - with {:ok, app_definition} <- Transform.Erlang.path_to_term(file_path), + with {:ok, app_definition} <- Forge.Namespace.Erlang.path_to_term(file_path), {:ok, converted} <- convert(app_definition) do File.write(file_path, converted) end @@ -33,7 +30,7 @@ defmodule Mix.Tasks.Namespace.Transform.Scripts do defp convert(app_definition) do converted = visit(app_definition) - erlang_terms = Transform.Erlang.term_to_string(converted) + erlang_terms = Forge.Namespace.Erlang.term_to_string(converted) script = """ %% coding: utf-8 @@ -47,7 +44,7 @@ defmodule Mix.Tasks.Namespace.Transform.Scripts do defp visit({:release, release_vsn, erts_vsn, app_versions}) do fixed_apps = Enum.map(app_versions, fn {app_name, version, start_type} -> - {Namespace.Module.apply(app_name), version, start_type} + {Forge.Namespace.Module.apply(app_name), version, start_type} end) {:release, release_vsn, erts_vsn, fixed_apps} @@ -58,11 +55,11 @@ defmodule Mix.Tasks.Namespace.Transform.Scripts do end defp visit({:primLoad, app_list}) do - {:primLoad, Enum.map(app_list, &Namespace.Module.apply/1)} + {:primLoad, Enum.map(app_list, &Forge.Namespace.Module.apply/1)} end defp visit({:path, paths}) do - {:path, Enum.map(paths, &Namespace.Path.apply/1)} + {:path, Enum.map(paths, &Forge.Namespace.Path.apply/1)} end defp visit({:apply, {:application, :load, load_apps}}) do @@ -70,27 +67,28 @@ defmodule Mix.Tasks.Namespace.Transform.Scripts do end defp visit({:apply, {:application, :start_boot, apps_to_start}}) do - {:apply, {:application, :start_boot, Enum.map(apps_to_start, &Namespace.Module.apply/1)}} + {:apply, + {:application, :start_boot, Enum.map(apps_to_start, &Forge.Namespace.Module.apply/1)}} end defp visit({:application, app_name, app_keys}) do - {:application, Namespace.Module.apply(app_name), Enum.map(app_keys, &visit/1)} + {:application, Forge.Namespace.Module.apply(app_name), Enum.map(app_keys, &visit/1)} end defp visit({:application, app_name}) do - {:application, Namespace.Module.apply(app_name)} + {:application, Forge.Namespace.Module.apply(app_name)} end defp visit({:mod, {module_name, args}}) do - {:mod, {Namespace.Module.apply(module_name), Enum.map(args, &visit/1)}} + {:mod, {Forge.Namespace.Module.apply(module_name), Enum.map(args, &visit/1)}} end defp visit({:modules, module_list}) do - {:modules, Enum.map(module_list, &Namespace.Module.apply/1)} + {:modules, Enum.map(module_list, &Forge.Namespace.Module.apply/1)} end defp visit({:applications, app_names}) do - {:applications, Enum.map(app_names, &Namespace.Module.apply/1)} + {:applications, Enum.map(app_names, &Forge.Namespace.Module.apply/1)} end defp visit(key_value) do diff --git a/apps/forge/lib/forge/project.ex b/apps/forge/lib/forge/project.ex index 03d069b4..536bee8a 100644 --- a/apps/forge/lib/forge/project.ex +++ b/apps/forge/lib/forge/project.ex @@ -163,6 +163,10 @@ defmodule Forge.Project do set_env_vars(project, environment_variables) end + def manager_node_name(%__MODULE__{} = project) do + :"manager-#{name(project)}-#{entropy(project)}@127.0.0.1" + end + @doc """ Returns the full path to the project's expert workspace directory @@ -197,6 +201,27 @@ defmodule Forge.Project do |> Path.join("build") end + @doc """ + Returns the full path to the directory where expert puts versioned build artifacts + """ + def versioned_build_path(%__MODULE__{} = project) do + %{elixir: elixir, erlang: erlang} = Forge.VM.Versions.current() + erlang_major = erlang |> String.split(".") |> List.first() + elixir_version = Version.parse!(elixir) + elixir_major = "#{elixir_version.major}.#{elixir_version.minor}" + build_root = build_path(project) + Path.join([build_root, "erl-#{erlang_major}", "elixir-#{elixir_major}"]) + end + + @doc """ + Returns the full path to the directory where expert puts engine archives + """ + def engine_path(%__MODULE__{} = project) do + project + |> workspace_path() + |> Path.join("engine") + end + @doc """ Creates and initializes expert's workspace directory if it doesn't already exist """ diff --git a/apps/engine/lib/engine/engine/search/indexer/entry.ex b/apps/forge/lib/forge/search/indexer/entry.ex similarity index 98% rename from apps/engine/lib/engine/engine/search/indexer/entry.ex rename to apps/forge/lib/forge/search/indexer/entry.ex index 928c894c..2e4ff895 100644 --- a/apps/engine/lib/engine/engine/search/indexer/entry.ex +++ b/apps/forge/lib/forge/search/indexer/entry.ex @@ -1,4 +1,4 @@ -defmodule Engine.Search.Indexer.Entry do +defmodule Forge.Search.Indexer.Entry do @type function_type :: :public | :private | :delegated | :usage @type protocol_type :: :implementation | :definition @@ -50,8 +50,8 @@ defmodule Engine.Search.Indexer.Entry do @type datetime_format :: :erl | :unix | :datetime @type date_type :: :calendar.datetime() | integer() | DateTime.t() - alias Engine.Search.Indexer.Source.Block alias Forge.Identifier + alias Forge.Search.Indexer.Source.Block alias Forge.StructAccess use StructAccess diff --git a/apps/engine/lib/engine/engine/search/indexer/source/block.ex b/apps/forge/lib/forge/search/indexer/source/block.ex similarity index 87% rename from apps/engine/lib/engine/engine/search/indexer/source/block.ex rename to apps/forge/lib/forge/search/indexer/source/block.ex index b91f4a2d..e2ff9b13 100644 --- a/apps/engine/lib/engine/engine/search/indexer/source/block.ex +++ b/apps/forge/lib/forge/search/indexer/source/block.ex @@ -1,4 +1,4 @@ -defmodule Engine.Search.Indexer.Source.Block do +defmodule Forge.Search.Indexer.Source.Block do @moduledoc """ A struct that represents a block of source code """ diff --git a/apps/engine/lib/mix/tasks/namespace.ex b/apps/forge/lib/mix/tasks/namespace.ex similarity index 96% rename from apps/engine/lib/mix/tasks/namespace.ex rename to apps/forge/lib/mix/tasks/namespace.ex index c6fa611d..aeb5fa62 100644 --- a/apps/engine/lib/mix/tasks/namespace.ex +++ b/apps/forge/lib/mix/tasks/namespace.ex @@ -11,10 +11,10 @@ defmodule Mix.Tasks.Namespace do This task takes a single argument, which is the full path to the release. """ alias Forge.Ast - alias Mix.Tasks.Namespace.Transform + alias Forge.Namespace.Transform use Mix.Task - @dev_deps [:patch] + @dev_deps [:patch, :burrito] # Unless explicitly added, nimble_parsec won't show up as a loaded app # and will therefore not be namespaced. @no_app_deps [:nimble_parsec] @@ -23,8 +23,6 @@ defmodule Mix.Tasks.Namespace do # by this task. Plugin discovery uses this task, which happens after # namespacing. @extra_apps %{ - "proto" => "Expert", - "protocol" => "Expert", "engine" => "Engine", "expert" => "Expert", "forge" => "Forge" @@ -43,6 +41,7 @@ defmodule Mix.Tasks.Namespace do # The boot file transform just turns script files into boot files # so it must come after the script file transform Transform.Boots.apply_to_all(base_directory) + Transform.Configs.apply_to_all(base_directory) Transform.AppDirectories.apply_to_all(base_directory) end diff --git a/apps/forge/mix.exs b/apps/forge/mix.exs index 93e2be1c..791a85b8 100644 --- a/apps/forge/mix.exs +++ b/apps/forge/mix.exs @@ -17,7 +17,7 @@ defmodule Forge.MixProject do def application do [ - extra_applications: [:logger] + extra_applications: [:logger, :sasl, :eex] ] end diff --git a/apps/engine/test/fixtures/compilation_callback_errors/.formatter.exs b/apps/forge/test/fixtures/compilation_callback_errors/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/compilation_callback_errors/.formatter.exs rename to apps/forge/test/fixtures/compilation_callback_errors/.formatter.exs diff --git a/apps/engine/test/fixtures/compilation_callback_errors/.gitignore b/apps/forge/test/fixtures/compilation_callback_errors/.gitignore similarity index 100% rename from apps/engine/test/fixtures/compilation_callback_errors/.gitignore rename to apps/forge/test/fixtures/compilation_callback_errors/.gitignore diff --git a/apps/engine/test/fixtures/compilation_callback_errors/lib/compile_callback_error.ex b/apps/forge/test/fixtures/compilation_callback_errors/lib/compile_callback_error.ex similarity index 100% rename from apps/engine/test/fixtures/compilation_callback_errors/lib/compile_callback_error.ex rename to apps/forge/test/fixtures/compilation_callback_errors/lib/compile_callback_error.ex diff --git a/apps/engine/test/fixtures/compilation_callback_errors/mix.exs b/apps/forge/test/fixtures/compilation_callback_errors/mix.exs similarity index 100% rename from apps/engine/test/fixtures/compilation_callback_errors/mix.exs rename to apps/forge/test/fixtures/compilation_callback_errors/mix.exs diff --git a/apps/engine/test/fixtures/compilation_errors/.formatter.exs b/apps/forge/test/fixtures/compilation_errors/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/compilation_errors/.formatter.exs rename to apps/forge/test/fixtures/compilation_errors/.formatter.exs diff --git a/apps/engine/test/fixtures/compilation_errors/.gitignore b/apps/forge/test/fixtures/compilation_errors/.gitignore similarity index 100% rename from apps/engine/test/fixtures/compilation_errors/.gitignore rename to apps/forge/test/fixtures/compilation_errors/.gitignore diff --git a/apps/engine/test/fixtures/compilation_errors/README.md b/apps/forge/test/fixtures/compilation_errors/README.md similarity index 100% rename from apps/engine/test/fixtures/compilation_errors/README.md rename to apps/forge/test/fixtures/compilation_errors/README.md diff --git a/apps/engine/test/fixtures/compilation_errors/lib/compilation_errors.ex b/apps/forge/test/fixtures/compilation_errors/lib/compilation_errors.ex similarity index 100% rename from apps/engine/test/fixtures/compilation_errors/lib/compilation_errors.ex rename to apps/forge/test/fixtures/compilation_errors/lib/compilation_errors.ex diff --git a/apps/engine/test/fixtures/compilation_errors/mix.exs b/apps/forge/test/fixtures/compilation_errors/mix.exs similarity index 100% rename from apps/engine/test/fixtures/compilation_errors/mix.exs rename to apps/forge/test/fixtures/compilation_errors/mix.exs diff --git a/apps/engine/test/fixtures/compilation_warnings/.formatter.exs b/apps/forge/test/fixtures/compilation_warnings/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/compilation_warnings/.formatter.exs rename to apps/forge/test/fixtures/compilation_warnings/.formatter.exs diff --git a/apps/engine/test/fixtures/compilation_warnings/.gitignore b/apps/forge/test/fixtures/compilation_warnings/.gitignore similarity index 100% rename from apps/engine/test/fixtures/compilation_warnings/.gitignore rename to apps/forge/test/fixtures/compilation_warnings/.gitignore diff --git a/apps/engine/test/fixtures/compilation_warnings/README.md b/apps/forge/test/fixtures/compilation_warnings/README.md similarity index 100% rename from apps/engine/test/fixtures/compilation_warnings/README.md rename to apps/forge/test/fixtures/compilation_warnings/README.md diff --git a/apps/engine/test/fixtures/compilation_warnings/lib/unused_variable.ex b/apps/forge/test/fixtures/compilation_warnings/lib/unused_variable.ex similarity index 100% rename from apps/engine/test/fixtures/compilation_warnings/lib/unused_variable.ex rename to apps/forge/test/fixtures/compilation_warnings/lib/unused_variable.ex diff --git a/apps/engine/test/fixtures/compilation_warnings/mix.exs b/apps/forge/test/fixtures/compilation_warnings/mix.exs similarity index 100% rename from apps/engine/test/fixtures/compilation_warnings/mix.exs rename to apps/forge/test/fixtures/compilation_warnings/mix.exs diff --git a/apps/engine/test/fixtures/dependency/lib/dependency/structs.ex b/apps/forge/test/fixtures/dependency/lib/dependency/structs.ex similarity index 100% rename from apps/engine/test/fixtures/dependency/lib/dependency/structs.ex rename to apps/forge/test/fixtures/dependency/lib/dependency/structs.ex diff --git a/apps/engine/test/fixtures/navigations/lib/macro_struct.ex b/apps/forge/test/fixtures/navigations/lib/macro_struct.ex similarity index 100% rename from apps/engine/test/fixtures/navigations/lib/macro_struct.ex rename to apps/forge/test/fixtures/navigations/lib/macro_struct.ex diff --git a/apps/engine/test/fixtures/navigations/lib/multi_arity.ex b/apps/forge/test/fixtures/navigations/lib/multi_arity.ex similarity index 100% rename from apps/engine/test/fixtures/navigations/lib/multi_arity.ex rename to apps/forge/test/fixtures/navigations/lib/multi_arity.ex diff --git a/apps/engine/test/fixtures/navigations/lib/my_definition.ex b/apps/forge/test/fixtures/navigations/lib/my_definition.ex similarity index 100% rename from apps/engine/test/fixtures/navigations/lib/my_definition.ex rename to apps/forge/test/fixtures/navigations/lib/my_definition.ex diff --git a/apps/engine/test/fixtures/navigations/lib/struct.ex b/apps/forge/test/fixtures/navigations/lib/struct.ex similarity index 100% rename from apps/engine/test/fixtures/navigations/lib/struct.ex rename to apps/forge/test/fixtures/navigations/lib/struct.ex diff --git a/apps/engine/test/fixtures/navigations/lib/uses.ex b/apps/forge/test/fixtures/navigations/lib/uses.ex similarity index 100% rename from apps/engine/test/fixtures/navigations/lib/uses.ex rename to apps/forge/test/fixtures/navigations/lib/uses.ex diff --git a/apps/engine/test/fixtures/navigations/mix.exs b/apps/forge/test/fixtures/navigations/mix.exs similarity index 100% rename from apps/engine/test/fixtures/navigations/mix.exs rename to apps/forge/test/fixtures/navigations/mix.exs diff --git a/apps/engine/test/fixtures/parse_errors/lib/parse_errors.ex b/apps/forge/test/fixtures/parse_errors/lib/parse_errors.ex similarity index 100% rename from apps/engine/test/fixtures/parse_errors/lib/parse_errors.ex rename to apps/forge/test/fixtures/parse_errors/lib/parse_errors.ex diff --git a/apps/engine/test/fixtures/parse_errors/mix.exs b/apps/forge/test/fixtures/parse_errors/mix.exs similarity index 100% rename from apps/engine/test/fixtures/parse_errors/mix.exs rename to apps/forge/test/fixtures/parse_errors/mix.exs diff --git a/apps/engine/test/fixtures/project/.formatter.exs b/apps/forge/test/fixtures/project/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/project/.formatter.exs rename to apps/forge/test/fixtures/project/.formatter.exs diff --git a/apps/engine/test/fixtures/project/.gitignore b/apps/forge/test/fixtures/project/.gitignore similarity index 100% rename from apps/engine/test/fixtures/project/.gitignore rename to apps/forge/test/fixtures/project/.gitignore diff --git a/apps/engine/test/fixtures/project/README.md b/apps/forge/test/fixtures/project/README.md similarity index 100% rename from apps/engine/test/fixtures/project/README.md rename to apps/forge/test/fixtures/project/README.md diff --git a/apps/engine/test/fixtures/project/lib/behaviours.ex b/apps/forge/test/fixtures/project/lib/behaviours.ex similarity index 100% rename from apps/engine/test/fixtures/project/lib/behaviours.ex rename to apps/forge/test/fixtures/project/lib/behaviours.ex diff --git a/apps/engine/test/fixtures/project/lib/default_args.ex b/apps/forge/test/fixtures/project/lib/default_args.ex similarity index 100% rename from apps/engine/test/fixtures/project/lib/default_args.ex rename to apps/forge/test/fixtures/project/lib/default_args.ex diff --git a/apps/engine/test/fixtures/project/lib/functions.ex b/apps/forge/test/fixtures/project/lib/functions.ex similarity index 100% rename from apps/engine/test/fixtures/project/lib/functions.ex rename to apps/forge/test/fixtures/project/lib/functions.ex diff --git a/apps/engine/test/fixtures/project/lib/macros.ex b/apps/forge/test/fixtures/project/lib/macros.ex similarity index 100% rename from apps/engine/test/fixtures/project/lib/macros.ex rename to apps/forge/test/fixtures/project/lib/macros.ex diff --git a/apps/engine/test/fixtures/project/lib/other_modules.ex b/apps/forge/test/fixtures/project/lib/other_modules.ex similarity index 100% rename from apps/engine/test/fixtures/project/lib/other_modules.ex rename to apps/forge/test/fixtures/project/lib/other_modules.ex diff --git a/apps/engine/test/fixtures/project/lib/project.ex b/apps/forge/test/fixtures/project/lib/project.ex similarity index 100% rename from apps/engine/test/fixtures/project/lib/project.ex rename to apps/forge/test/fixtures/project/lib/project.ex diff --git a/apps/engine/test/fixtures/project/lib/structs.ex b/apps/forge/test/fixtures/project/lib/structs.ex similarity index 100% rename from apps/engine/test/fixtures/project/lib/structs.ex rename to apps/forge/test/fixtures/project/lib/structs.ex diff --git a/apps/engine/test/fixtures/project/mix.exs b/apps/forge/test/fixtures/project/mix.exs similarity index 100% rename from apps/engine/test/fixtures/project/mix.exs rename to apps/forge/test/fixtures/project/mix.exs diff --git a/apps/engine/test/fixtures/project_metadata/.formatter.exs b/apps/forge/test/fixtures/project_metadata/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/project_metadata/.formatter.exs rename to apps/forge/test/fixtures/project_metadata/.formatter.exs diff --git a/apps/engine/test/fixtures/project_metadata/.gitignore b/apps/forge/test/fixtures/project_metadata/.gitignore similarity index 100% rename from apps/engine/test/fixtures/project_metadata/.gitignore rename to apps/forge/test/fixtures/project_metadata/.gitignore diff --git a/apps/engine/test/fixtures/project_metadata/README.md b/apps/forge/test/fixtures/project_metadata/README.md similarity index 100% rename from apps/engine/test/fixtures/project_metadata/README.md rename to apps/forge/test/fixtures/project_metadata/README.md diff --git a/apps/engine/test/fixtures/project_metadata/config/config.exs b/apps/forge/test/fixtures/project_metadata/config/config.exs similarity index 100% rename from apps/engine/test/fixtures/project_metadata/config/config.exs rename to apps/forge/test/fixtures/project_metadata/config/config.exs diff --git a/apps/engine/test/fixtures/project_metadata/lib/project_metadata.ex b/apps/forge/test/fixtures/project_metadata/lib/project_metadata.ex similarity index 100% rename from apps/engine/test/fixtures/project_metadata/lib/project_metadata.ex rename to apps/forge/test/fixtures/project_metadata/lib/project_metadata.ex diff --git a/apps/engine/test/fixtures/project_metadata/mix.exs b/apps/forge/test/fixtures/project_metadata/mix.exs similarity index 100% rename from apps/engine/test/fixtures/project_metadata/mix.exs rename to apps/forge/test/fixtures/project_metadata/mix.exs diff --git a/apps/engine/test/fixtures/umbrella/.formatter.exs b/apps/forge/test/fixtures/umbrella/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/umbrella/.formatter.exs rename to apps/forge/test/fixtures/umbrella/.formatter.exs diff --git a/apps/engine/test/fixtures/umbrella/.gitignore b/apps/forge/test/fixtures/umbrella/.gitignore similarity index 100% rename from apps/engine/test/fixtures/umbrella/.gitignore rename to apps/forge/test/fixtures/umbrella/.gitignore diff --git a/apps/engine/test/fixtures/umbrella/README.md b/apps/forge/test/fixtures/umbrella/README.md similarity index 100% rename from apps/engine/test/fixtures/umbrella/README.md rename to apps/forge/test/fixtures/umbrella/README.md diff --git a/apps/engine/test/fixtures/umbrella/apps/first/.formatter.exs b/apps/forge/test/fixtures/umbrella/apps/first/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/first/.formatter.exs rename to apps/forge/test/fixtures/umbrella/apps/first/.formatter.exs diff --git a/apps/engine/test/fixtures/umbrella/apps/first/.gitignore b/apps/forge/test/fixtures/umbrella/apps/first/.gitignore similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/first/.gitignore rename to apps/forge/test/fixtures/umbrella/apps/first/.gitignore diff --git a/apps/engine/test/fixtures/umbrella/apps/first/README.md b/apps/forge/test/fixtures/umbrella/apps/first/README.md similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/first/README.md rename to apps/forge/test/fixtures/umbrella/apps/first/README.md diff --git a/apps/engine/test/fixtures/umbrella/apps/first/lib/umbrella/first.ex b/apps/forge/test/fixtures/umbrella/apps/first/lib/umbrella/first.ex similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/first/lib/umbrella/first.ex rename to apps/forge/test/fixtures/umbrella/apps/first/lib/umbrella/first.ex diff --git a/apps/engine/test/fixtures/umbrella/apps/first/mix.exs b/apps/forge/test/fixtures/umbrella/apps/first/mix.exs similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/first/mix.exs rename to apps/forge/test/fixtures/umbrella/apps/first/mix.exs diff --git a/apps/engine/test/fixtures/umbrella/apps/second/.formatter.exs b/apps/forge/test/fixtures/umbrella/apps/second/.formatter.exs similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/second/.formatter.exs rename to apps/forge/test/fixtures/umbrella/apps/second/.formatter.exs diff --git a/apps/engine/test/fixtures/umbrella/apps/second/.gitignore b/apps/forge/test/fixtures/umbrella/apps/second/.gitignore similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/second/.gitignore rename to apps/forge/test/fixtures/umbrella/apps/second/.gitignore diff --git a/apps/engine/test/fixtures/umbrella/apps/second/README.md b/apps/forge/test/fixtures/umbrella/apps/second/README.md similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/second/README.md rename to apps/forge/test/fixtures/umbrella/apps/second/README.md diff --git a/apps/engine/test/fixtures/umbrella/apps/second/lib/umbrella/second.ex b/apps/forge/test/fixtures/umbrella/apps/second/lib/umbrella/second.ex similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/second/lib/umbrella/second.ex rename to apps/forge/test/fixtures/umbrella/apps/second/lib/umbrella/second.ex diff --git a/apps/engine/test/fixtures/umbrella/apps/second/mix.exs b/apps/forge/test/fixtures/umbrella/apps/second/mix.exs similarity index 100% rename from apps/engine/test/fixtures/umbrella/apps/second/mix.exs rename to apps/forge/test/fixtures/umbrella/apps/second/mix.exs diff --git a/apps/engine/test/fixtures/umbrella/config/config.exs b/apps/forge/test/fixtures/umbrella/config/config.exs similarity index 100% rename from apps/engine/test/fixtures/umbrella/config/config.exs rename to apps/forge/test/fixtures/umbrella/config/config.exs diff --git a/apps/engine/test/fixtures/umbrella/mix.exs b/apps/forge/test/fixtures/umbrella/mix.exs similarity index 100% rename from apps/engine/test/fixtures/umbrella/mix.exs rename to apps/forge/test/fixtures/umbrella/mix.exs diff --git a/apps/engine/test/support/test/code_mod_case.ex b/apps/forge/test/support/test/code_mod_case.ex similarity index 95% rename from apps/engine/test/support/test/code_mod_case.ex rename to apps/forge/test/support/test/code_mod_case.ex index 9e2f49ff..1b5587bd 100644 --- a/apps/engine/test/support/test/code_mod_case.ex +++ b/apps/forge/test/support/test/code_mod_case.ex @@ -1,4 +1,4 @@ -defmodule Engine.Test.CodeMod.Case do +defmodule Forge.Test.CodeMod.Case do alias Forge.Document alias Forge.Test.CodeSigil @@ -8,7 +8,7 @@ defmodule Engine.Test.CodeMod.Case do convert_to_ast? = Keyword.get(opts, :enable_ast_conversion, true) quote do - import Engine.Test.Fixtures + import Forge.Test.Fixtures import unquote(CodeSigil), only: [sigil_q: 2] def apply_code_mod(_, _, _) do diff --git a/apps/engine/test/support/test/fixtures.ex b/apps/forge/test/support/test/fixtures.ex similarity index 95% rename from apps/engine/test/support/test/fixtures.ex rename to apps/forge/test/support/test/fixtures.ex index e16e284a..edc98e5c 100644 --- a/apps/engine/test/support/test/fixtures.ex +++ b/apps/forge/test/support/test/fixtures.ex @@ -1,4 +1,4 @@ -defmodule Engine.Test.Fixtures do +defmodule Forge.Test.Fixtures do alias Forge.Document alias Forge.Project