diff --git a/lib/credo/application.ex b/lib/credo/application.ex index eb12b9d55..9e841406a 100644 --- a/lib/credo/application.ex +++ b/lib/credo/application.ex @@ -8,6 +8,7 @@ defmodule Credo.Application do Credo.Service.SourceFileAST, Credo.Service.SourceFileLines, Credo.Service.SourceFileScopes, + Credo.Service.SourceFileScopePriorities, Credo.Service.SourceFileSource ] diff --git a/lib/credo/check.ex b/lib/credo/check.ex index 4c72d1310..64297f384 100644 --- a/lib/credo/check.ex +++ b/lib/credo/check.ex @@ -171,6 +171,7 @@ defmodule Credo.Check do warning: 16 } + alias Credo.Service.SourceFileScopePriorities alias Credo.Check alias Credo.Check.Params alias Credo.Code.Scope @@ -759,7 +760,18 @@ defmodule Credo.Check do end defp priority_for(source_file, scope) do - scope_prio_map = Priority.scope_priorities(source_file) + # Caching scope priorities, because these have to be computed only once per file. This + # significantly speeds up the execution time when a large number of issues are generated. + scope_prio_map = + case SourceFileScopePriorities.get(source_file) do + {:ok, value} -> + value + + :notfound -> + result = Priority.scope_priorities(source_file) + SourceFileScopePriorities.put(source_file, result) + result + end scope_prio_map[scope] || 0 end diff --git a/lib/credo/service/source_file_scope_priorities.ex b/lib/credo/service/source_file_scope_priorities.ex new file mode 100644 index 000000000..2f610e3d6 --- /dev/null +++ b/lib/credo/service/source_file_scope_priorities.ex @@ -0,0 +1,5 @@ +defmodule Credo.Service.SourceFileScopePriorities do + @moduledoc false + + use Credo.Service.ETSTableHelper +end