defmodule Mix.Tasks.Compile.Ethyl do use Mix.Task.Compiler @recursive true @manifest "compile.ethyl" @moduledoc """ A task to compile Ethyl expressions into BEAM bytecode Compiling Ethyl expressions may be valuable so that one can measure code coverage with a test suite. The design of this compiler is loosly based on the [1.12 Elixir compiler](https://github.com/elixir-lang/elixir/blob/a64d42f5d3cb6c32752af9d3312897e8cd5bb7ec/lib/mix/lib/mix/tasks/compile.elixir.ex#L1), but it is adapted for Ethyl's unique structures. Namely, This compiler wraps expressions in superfluous modules. This is necessary to measure coverage with the built-in `:cover` module. """ @impl Mix.Task.Compiler def run(args) do {opts, _, _} = OptionParser.parse(args, switches: [force: :boolean]) project = Mix.Project.config() dest = Mix.Project.compile_path(project) srcs = (project[:ethylc_globs] || ["lib/**/*.exs"]) |> Enum.flat_map(&Path.wildcard/1) |> Enum.map(&Path.expand/1) Ethyl.Compiler.compile(manifest(), srcs, dest, opts[:force] || false) end @impl Mix.Task.Compiler # chaps-ignore-start def manifests, do: [manifest()] # chaps-ignore-stop defp manifest, do: Path.join(Mix.Project.manifest_path(), @manifest) end