Skip to content

Commit d92b7a3

Browse files
author
José Valim
committed
Traverse dependnecies when consolidate umbrella protocols, closes #4842
Signed-off-by: José Valim <[email protected]>
1 parent 8930ea7 commit d92b7a3

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

lib/mix/lib/mix/tasks/compile.protocols.ex

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ defmodule Mix.Tasks.Compile.Protocols do
4444
output = Mix.Project.consolidation_path(config)
4545
manifest = Path.join(output, @manifest)
4646

47-
protocols_and_impls =
48-
unless Mix.Project.umbrella?(config) do
49-
protocols_and_impls(config)
50-
end
47+
protocols_and_impls = protocols_and_impls(config)
5148

5249
cond do
5350
opts[:force] || Mix.Utils.stale?(Mix.Project.config_files(), [manifest]) ->
@@ -79,10 +76,15 @@ defmodule Mix.Tasks.Compile.Protocols do
7976
not scm.fetchable?,
8077
do: opts[:build])
8178

82-
app = Mix.Project.app_path(config)
79+
app =
80+
if Mix.Project.umbrella?(config) do
81+
[]
82+
else
83+
[Mix.Project.app_path(config)]
84+
end
8385

8486
protocols_and_impls =
85-
for path <- [app | deps] do
87+
for path <- app ++ deps do
8688
manifest_path = Path.join(path, ".compile.elixir")
8789
compile_path = Path.join(path, "ebin")
8890
Mix.Compilers.Elixir.protocols_and_impls(manifest_path, compile_path)

lib/mix/test/mix/umbrella_test.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,30 @@ defmodule Mix.UmbrellaTest do
364364
end)
365365
end
366366

367+
test "reconsolidates using umbrella information even on shared _build" do
368+
in_fixture("umbrella_dep/deps/umbrella", fn ->
369+
File.write!("apps/bar/lib/bar.ex", """
370+
defprotocol Bar do
371+
def bar(arg)
372+
end
373+
defimpl Bar, for: List do
374+
def bar(list), do: list
375+
end
376+
""")
377+
378+
Mix.Project.in_project(:foo, "apps/foo", [build_path: "../../_build"], fn _ ->
379+
Mix.Task.run("compile.protocols")
380+
refute Code.ensure_loaded?(Bar)
381+
end)
382+
383+
Mix.Project.in_project(:umbrella, ".", fn _ ->
384+
Mix.Task.run("compile.protocols")
385+
Mix.Task.run("app.start")
386+
assert Protocol.consolidated?(Bar)
387+
end)
388+
end)
389+
end
390+
367391
defmodule Selective do
368392
def project do
369393
[apps_path: "apps",

0 commit comments

Comments
 (0)