filter_map.ex (1718B)
1 defmodule Dialyxir.FilterMap do 2 @moduledoc """ 3 A counters holding warnings to be skipped. 4 5 `:counters` points to a `Map` where the keys are warnings to be skipped and the value indicates 6 how often the warning was skipped. 7 """ 8 defstruct list_unused_filters?: false, unused_filters_as_errors?: false, counters: %{} 9 10 @doc """ 11 Fill a `FilterMap` from an ignore file. 12 """ 13 def from_file(ignore_file, list_unused_filters?, ignore_exit_status?) do 14 filter_map = %__MODULE__{ 15 list_unused_filters?: list_unused_filters?, 16 unused_filters_as_errors?: list_unused_filters? && !ignore_exit_status? 17 } 18 19 {ignore, _} = 20 ignore_file 21 |> File.read!() 22 |> Code.eval_string() 23 24 Enum.reduce(ignore, filter_map, fn skip, filter_map -> 25 put_in(filter_map.counters[skip], 0) 26 end) 27 end 28 29 @doc """ 30 Remove all non-allowed arguments from `args`. 31 """ 32 def to_args(args) do 33 Keyword.take(args, [:list_unused_filters, :ignore_exit_status]) 34 end 35 36 @doc """ 37 Retrieve the filters from a `FilterMap`. 38 """ 39 def filters(filter_map) do 40 Map.keys(filter_map.counters) 41 end 42 43 @doc """ 44 Increase usage count of a filter in `FilterMap`. 45 """ 46 def inc(filter_map, filter) do 47 update_in(filter_map.counters[filter], &(&1 + 1)) 48 end 49 50 @doc """ 51 List unused filters. 52 """ 53 def unused_filters(filter_map) do 54 filter_map.counters 55 |> Enum.filter(&unused?/1) 56 |> Enum.unzip() 57 |> elem(0) 58 end 59 60 @doc """ 61 Determine if any filters were not used. 62 """ 63 def unused_filters?(filter_map) do 64 Enum.any?(filter_map.counters, &unused?/1) 65 end 66 67 @doc """ 68 Check if a `FilterMap` entry is unused. 69 """ 70 def unused?({_filter, count}), do: count < 1 71 end