Skip to content

Compile-time dependencies #162

@marcandre

Description

@marcandre

The error in #160 made me suspect that type_check might introduce compile-time dependencies just about everywhere.

To double check this:

# empty_mix/example.ex
defmodule EmptyMix.Example do
  use TypeCheck, enable_runtime_checks: Mix.env() != :prod
  @type! t :: :ok
end

# empty_mix.ex
defmodule EmptyMix do
  defstruct [:name]
  use TypeCheck, enable_runtime_checks: Mix.env() != :prod

  @spec! hello(%{String.t() => any}) :: EmptyMix.Example.t()
  def hello(_struct), do: :ok
end

This compiles, but also introduces a compile-time dependency that should not be there:

$ mix xref graph
lib/empty_mix.ex
└── lib/empty_mix/example.ex (compile)
lib/empty_mix/example.ex

I understand that type_check needs to generate code at compile time to check that inputs and outputs corresponds to the specified specs, but hopefully there's way for that generation to not rely on the actual spec in EmptyMix.Example and only generate calls to that module. This would only introduce a runtime dependency on Example and not a compile-time one.

Compile-time dependencies can easily lead to many transitive dependencies and make it necessary to recompile most of a project whenever just about anything changes (see e.g. https://dashbit.co/blog/speeding-up-re-compilation-of-elixir-projects)

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is neededperformance (too slow)Usage of TypeCheck leading to unusably slow compile times or running time

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions