Skip to content

Commit 367d906

Browse files
committed
Assert current project is in the path before invoking compilers
Closes #12686.
1 parent df5bc5a commit 367d906

File tree

3 files changed

+39
-14
lines changed

3 files changed

+39
-14
lines changed

lib/mix/lib/mix/compilers/elixir.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ defmodule Mix.Compilers.Elixir do
205205
Code.purge_compiler_modules()
206206
end
207207
else
208+
# Prepend ourselves, even if we did no work, as we may have defined
209+
# future compilers.
210+
Code.prepend_path(dest)
211+
208212
# We need to return ok if deps_changed? or stale_modules changed,
209213
# even if no code was compiled, because we need to propagate the changed
210214
# status to compile.protocols. This will be the case whenever:

lib/mix/test/mix/tasks/compile.yecc_test.exs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ defmodule Mix.Tasks.Compile.YeccTest do
6363

6464
# Removing parse tools re-add it later even if only to show warnings
6565
:code.del_path(:parsetools)
66-
:code.delete(:yecc)
67-
:code.purge(:yecc)
66+
purge([:yecc])
6867
refute Code.ensure_loaded?(:yecc)
6968

7069
capture_io(fn ->

lib/mix/test/mix/tasks/compile_test.exs

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@ defmodule Mix.Tasks.CompileTest do
55

66
defmacro position(line, column), do: {line, column}
77

8-
defmodule CustomCompilers do
9-
def project do
10-
[compilers: [:elixir, :app, :custom]]
11-
end
12-
end
13-
148
defmodule DepsApp do
159
def project do
1610
[app: :deps_app, version: "0.1.0", deps: [{:ok, "0.1.0", path: "deps/ok"}]]
@@ -23,7 +17,8 @@ defmodule Mix.Tasks.CompileTest do
2317
end
2418
end
2519

26-
setup do
20+
setup tags do
21+
Mix.ProjectStack.post_config(Map.get(tags, :project, []))
2722
Mix.Project.push(MixTest.Case.Sample)
2823
:ok
2924
end
@@ -37,17 +32,16 @@ defmodule Mix.Tasks.CompileTest do
3732
assert_received {:mix_shell, :info, ["mix compile.elixir # " <> _]}
3833
end
3934

35+
@tag project: [compilers: [:elixir, :app, :custom]]
4036
test "compiles --list with custom mixfile" do
41-
Mix.Project.pop()
42-
Mix.Project.push(CustomCompilers)
4337
Mix.Task.run("compile", ["--list"])
4438
assert_received {:mix_shell, :info, ["\nEnabled compilers: elixir, app, custom, protocols"]}
4539
end
4640

41+
@tag project: [compilers: [:elixir, :app, :custom]]
4742
test "compiles does not require all compilers available on manifest" do
48-
Mix.Project.pop()
49-
Mix.Project.push(CustomCompilers)
50-
assert Mix.Tasks.Compile.manifests() |> Enum.map(&Path.basename/1) == ["compile.elixir"]
43+
assert Mix.Tasks.Compile.manifests() |> Enum.map(&Path.basename/1) ==
44+
["compile.yecc", "compile.leex", "compile.elixir"]
5145
end
5246

5347
test "compiles a project with mixfile" do
@@ -101,6 +95,34 @@ defmodule Mix.Tasks.CompileTest do
10195
end)
10296
end
10397

98+
@tag project: [compilers: Mix.compilers() ++ [:my_custom_compiler]]
99+
test "compiles a project with custom in-project compiler" do
100+
in_fixture("no_mixfile", fn ->
101+
File.mkdir_p!("lib")
102+
103+
File.write!("lib/a.ex", """
104+
defmodule Mix.Tasks.Compile.MyCustomCompiler do
105+
use Mix.Task.Compiler
106+
107+
@impl true
108+
def run(_args) do
109+
Mix.shell().info("Compiling...")
110+
:ok
111+
end
112+
end
113+
""")
114+
115+
assert Mix.Task.run("compile") == {:ok, []}
116+
assert_receive {:mix_shell, :info, ["Compiling..."]}
117+
Code.delete_path(Mix.Project.compile_path())
118+
purge([Mix.Tasks.Compile.MyCustomCompiler])
119+
false = Code.ensure_loaded?(Mix.Tasks.Compile.MyCustomCompiler)
120+
121+
Mix.Task.clear()
122+
assert Mix.Task.rerun("compile")
123+
end)
124+
end
125+
104126
test "recompiles app cache if manifest changes" do
105127
in_fixture("no_mixfile", fn ->
106128
Mix.Tasks.Compile.run(["--force"])

0 commit comments

Comments
 (0)