@@ -1197,20 +1197,27 @@ defmodule Mix.Tasks.Xref do
11971197 defp cycle_filter_fn ( filter ) , do: fn { _node , type } -> type == filter end
11981198
11991199 defp add_labels ( vertices , graph ) do
1200+ set = MapSet . new ( vertices )
1201+
12001202 vertices
1201- |> Enum . map ( fn v -> { v , cycle_label ( vertices , graph , v , false ) } end )
1203+ |> Enum . map ( fn v ->
1204+ { v ,
1205+ graph
1206+ |> :digraph . out_neighbours ( v )
1207+ |> cycle_label ( set , graph , v , false ) }
1208+ end )
12021209 |> Enum . sort ( )
12031210 end
12041211
1205- defp cycle_label ( [ out | outs ] , graph , v , export? ) do
1206- case :digraph . edge ( graph , { v , out } ) do
1212+ defp cycle_label ( [ out | outs ] , set , graph , v , export? ) do
1213+ case out in set && :digraph . edge ( graph , { v , out } ) do
12071214 { _ , _ , _ , :compile } -> :compile
1208- { _ , _ , _ , :export } -> cycle_label ( outs , graph , v , true )
1209- _ -> cycle_label ( outs , graph , v , export? )
1215+ { _ , _ , _ , :export } -> cycle_label ( outs , set , graph , v , true )
1216+ _ -> cycle_label ( outs , set , graph , v , export? )
12101217 end
12111218 end
12121219
1213- defp cycle_label ( [ ] , _graph , _v , export? ) do
1220+ defp cycle_label ( [ ] , _set , _graph , _v , export? ) do
12141221 if export? , do: :export , else: nil
12151222 end
12161223
0 commit comments