Skip to content

Commit

Permalink
Add credo check to assert a supervisor is named
Browse files Browse the repository at this point in the history
  • Loading branch information
samuelmanzanera authored and Neylix committed Apr 20, 2023
1 parent 5705973 commit 5d92dff
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
1 change: 1 addition & 0 deletions .credo.exs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
checks: [
# Custom checks
{Archethic.Checks.AtVsn, []},
{Archethic.Checks.NamedSupervisor, []},

# Consistency Checks
{Credo.Check.Consistency.LineEndings, []},
Expand Down
57 changes: 57 additions & 0 deletions lib/checks/named_supervisor.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
defmodule Archethic.Checks.NamedSupervisor do
@moduledoc """
Check that supervisor has a name
"""

use Credo.Check, category: :warning

defstruct supervisor?: false, named?: false

def run(source_file = %SourceFile{}, params = []) do
# IssueMeta helps keeping track of the source file and the check's params
# (technically, it's just a custom tagged tuple)
issue_meta = IssueMeta.for(source_file, params)

case Credo.Code.prewalk(source_file, &traverse(&1, &2), %__MODULE__{}) do
%__MODULE__{supervisor?: true, named?: false} ->
[format_issue(issue_meta, message: "Supervisor must be named")]

_ ->
[]
end
end

defp traverse(ast = {:use, _, [{:__aliases__, _, [:Supervisor]} | _]}, acc) do
{ast, %__MODULE__{acc | supervisor?: true}}
end

defp traverse(
ast =
{{:., _,
[
{:__aliases__, _, [:Supervisor]},
:start_link
]}, _, sup_ast},
acc = %__MODULE__{supervisor?: true}
) do
case sup_ast do
[
{:__MODULE__, _, nil},
_,
[name: _]
] ->
{ast, %__MODULE__{acc | named?: true}}

[
{:__MODULE__, _, nil},
[name: _]
] ->
{ast, %__MODULE__{acc | named?: true}}

_ ->
{ast, acc}
end
end

defp traverse(ast, acc), do: {ast, acc}
end

0 comments on commit 5d92dff

Please sign in to comment.