Elixir编译器警告忽略的函数返回值

时间:2020-01-15 18:01:05

标签: elixir static-analysis

当我无意中忽略了函数的返回值时,是否可以通过elixirc编译器,Credo或其他一些linting工具来获得警告?

也就是说,我想在此示例中给出警告,它忽略increment_state()的结果:

defmodule CountingServer do
  use GenServer

  def init(_) do
    :timer.send_interval(1000, :tick)
    {:ok, 1}
  end

  def handle_info(:tick, count_state) do
    IO.puts count_state
    increment_state(count_state)
    {:noreply, count_state}
  end

  def increment_state(prev_count) do
    prev_count + 1
  end
end

在上面的示例中,我们“打算”从handle_info/2调用返回 incremented 状态,而不是“ old”状态;也就是说,我们打算让服务器打印1,2,3,...,而不是重复打印1。

如果示例代码故意 忽略了increment_state/1调用的结果(例如,将其分配给_),则不需要警告。

我已经浏览了Credo的配置选项,找不到符合要求的内容...

1 个答案:

答案 0 :(得分:0)

我继续根据Credo的默认a Credo checkUnusedOperation制作了UnusedFunctionReturnHelper

这些检查几乎支持我想按原样进行的工作,但是它们本质上需要一个“黑名单”来确切说明哪些函数的返回值不能被忽略;我只需要反转逻辑以支持对白名单中没有的任何功能(Logger.infoEnum.each等)提供警告。

该检查支持通过.credo.exs配置向白名单中添加其他功能(可能是项目特定的)。

有关在您自己的项目中使用它的说明,请参见the first comment。 (TL; DR:将文件拖放到项目中,将其添加到requires的{​​{1}}和checks列表中。)