🔀

[Elixir] PropCheck を使っていると VSCode の ElixirLS 拡張がクラッシュする問題の対処

2024/02/23に公開

テストにPropCheckを使っているとElixirLSがクラッシュする。
どうやらElixirLSがテストコードを読んだとき、コードに PropCheck.Properties.property/2 があると GenServer.call/3を実行してしまってエラーになるせいでクラッシュするらしい。

これを回避するため、ElixirLS実行時のみ PropCheck.Properties.property を差し替えるようにする。

.vscode/settings.json

{
  "elixirLS.envVariables": {
    "RUNNING_IN_ELIXIR_LS": "1"
  }
}

test/test1_test.exs

defmodule Els.PropCheck do
  @doc """
  Stub for PropCheck.Properties.property/2
  """
  def property(_, _, _ \\ nil, _ \\ nil) do
  end

  defmacro __using__(opts) do
    if System.get_env("RUNNING_IN_ELIXIR_LS") == nil do
      quote do
        use PropCheck, unquote(opts)
      end
    else
      quote do
        # Copied from PropCheck.__using__/1
        # PropCheck.Properties.property/2 crash the Elixir Language Server

        import PropCheck
        import PropCheck.Properties, except: [property: 1, property: 2, property: 3, property: 4]
        # import :proper_types, except: [lazy: 1, to_binary: 1, function: 2]
        import PropCheck.BasicTypes
        import PropCheck.TargetedPBT

        import Els.PropCheck
      end
    end
  end
end

defmodule Els.Test1 do
  use ExUnit.Case
  use Els.PropCheck

  property "int-str round-trip" do
    forall v <- integer() do
      decoded =
        v
        |> to_string()
        |> String.to_integer()

      decoded == v
    end
  end
end

環境

  • ElixirLS: v0.20.0
  • PropCheck: 1.4.1
GitHubで編集を提案

Discussion