@@ -180,6 +180,12 @@ defmodule Module.DispatchTracker do
180180 :gen_server . cast ( pid , { :add_definition , kind , tuple } )
181181 end
182182
183+ # Adds and tracks defaults for a definition into the tracker.
184+ @ doc false
185+ def add_defaults ( pid , kind , tuple , defaults ) when kind in [ :def , :defp , :defmacro , :defmacrop ] do
186+ :gen_server . cast ( pid , { :add_defaults , kind , tuple , defaults } )
187+ end
188+
183189 # Adds a local dispatch to the given target.
184190 def add_local ( pid , to ) when is_tuple ( to ) do
185191 :gen_server . cast ( pid , { :add_local , :local , to } )
@@ -327,18 +333,17 @@ defmodule Module.DispatchTracker do
327333 end
328334
329335 def handle_cast ( { :add_local , from , to } , d ) do
330- :digraph . add_vertex ( d , to )
331- replace_edge! ( d , from , to )
336+ handle_add_local ( d , from , to )
332337 { :noreply , d }
333338 end
334339
335340 def handle_cast ( { :add_remote , function , module , { name , arity } } , d ) do
336- record_import_or_remote ( d , :remote , function , module , name , arity )
341+ handle_import_or_remote ( d , :remote , function , module , name , arity )
337342 { :noreply , d }
338343 end
339344
340345 def handle_cast ( { :add_import , function , module , { name , arity } } , d ) do
341- record_import_or_remote ( d , :import , function , module , name , arity )
346+ handle_import_or_remote ( d , :import , function , module , name , arity )
342347 { :noreply , d }
343348 end
344349
@@ -355,14 +360,16 @@ defmodule Module.DispatchTracker do
355360 { :noreply , d }
356361 end
357362
358- def handle_cast ( { :add_definition , public , tuple } , d ) when public in [ :def , :defmacro ] do
359- :digraph . add_vertex ( d , tuple )
360- replace_edge! ( d , :local , tuple )
363+ def handle_cast ( { :add_definition , kind , tuple } , d ) do
364+ handle_add_definition ( d , kind , tuple )
361365 { :noreply , d }
362366 end
363367
364- def handle_cast ( { :add_definition , private , tuple } , d ) when private in [ :defp , :defmacrop ] do
365- :digraph . add_vertex ( d , tuple )
368+ def handle_cast ( { :add_defaults , kind , { name , arity } , defaults } , d ) do
369+ lc i inlist :lists . seq ( arity - defaults , arity - 1 ) do
370+ handle_add_definition ( d , kind , { name , i } )
371+ handle_add_local ( d , { name , i } , { name , i + 1 } )
372+ end
366373 { :noreply , d }
367374 end
368375
@@ -388,7 +395,7 @@ defmodule Module.DispatchTracker do
388395 { :ok , d }
389396 end
390397
391- defp record_import_or_remote ( d , kind , function , module , name , arity ) do
398+ defp handle_import_or_remote ( d , kind , function , module , name , arity ) do
392399 :digraph . add_vertex ( d , module )
393400 replace_edge! ( d , kind , module )
394401
@@ -401,6 +408,20 @@ defmodule Module.DispatchTracker do
401408 end
402409 end
403410
411+ defp handle_add_local ( d , from , to ) do
412+ :digraph . add_vertex ( d , to )
413+ replace_edge! ( d , from , to )
414+ end
415+
416+ defp handle_add_definition ( d , public , tuple ) when public in [ :def , :defmacro ] do
417+ :digraph . add_vertex ( d , tuple )
418+ replace_edge! ( d , :local , tuple )
419+ end
420+
421+ defp handle_add_definition ( d , private , tuple ) when private in [ :defp , :defmacrop ] do
422+ :digraph . add_vertex ( d , tuple )
423+ end
424+
404425 defp replace_edge! ( d , from , to ) do
405426 unless :lists . member ( to , :digraph . out_neighbours ( d , from ) ) do
406427 [ :"$e" | _ ] = :digraph . add_edge ( d , from , to )
0 commit comments