diff --git a/apps/engine/lib/engine/engine/bootstrap.ex b/apps/engine/lib/engine/engine/bootstrap.ex index bd005ca6..06a685a8 100644 --- a/apps/engine/lib/engine/engine/bootstrap.ex +++ b/apps/engine/lib/engine/engine/bootstrap.ex @@ -6,6 +6,7 @@ defmodule Engine.Bootstrap do the project's code paths, which are then added to the code paths from the language server. At this point, it's safe to start the project, as we should have all the code present to compile the system. """ + alias Forge.LogFilter alias Forge.Project require Logger @@ -66,6 +67,7 @@ defmodule Engine.Bootstrap do } :logger.add_handler(handler_name, :logger_std_h, config) + LogFilter.hook_into_logger() end defp maybe_change_directory(%Project{} = project) do diff --git a/apps/expert/lib/expert/application.ex b/apps/expert/lib/expert/application.ex index 1cb44732..94f639dc 100644 --- a/apps/expert/lib/expert/application.ex +++ b/apps/expert/lib/expert/application.ex @@ -4,6 +4,7 @@ defmodule Expert.Application do @moduledoc false alias Forge.Document + alias Forge.LogFilter use Application @@ -26,6 +27,8 @@ defmodule Expert.Application do assigns: Expert.Assigns} ] + LogFilter.hook_into_logger() + opts = [strategy: :one_for_one, name: Expert.Supervisor] Supervisor.start_link(children, opts) end diff --git a/apps/forge/lib/forge/log_filter.ex b/apps/forge/lib/forge/log_filter.ex new file mode 100644 index 00000000..1ad75b57 --- /dev/null +++ b/apps/forge/lib/forge/log_filter.ex @@ -0,0 +1,42 @@ +defmodule Forge.LogFilter do + def hook_into_logger() do + :logger.add_primary_filter(:ignore_module_warnings, {&reject_module_warnings/2, []}) + end + + def reject_module_warnings(log_event, _) do + case log_event do + %{msg: {:report, _}} -> + :ignore + + %{msg: {:string, message}} -> + message + |> ensure_binary() + |> action() + + %{msg: {format_string, format_data}} -> + format_string + |> :io.format(format_data) + |> ensure_binary() + |> action() + + _ -> + :ignore + end + end + + defp action(message) do + if message =~ "is already compiled." do + :stop + else + :ignore + end + end + + defp ensure_binary(charlist) when is_list(charlist) do + List.to_string(charlist) + end + + defp ensure_binary(s) when is_binary(s) do + s + end +end