@@ -4844,7 +4844,7 @@ defmodule ElixirSense.Core.MetadataBuilderTest do
48444844 } ,
48454845 MyModule.Second => % StructInfo {
48464846 fields: [
4847- baz: { :% , [ ] , [ MyModule.First , { :%{} , [ ] , [ { :foo , :bar } ] } ] } ,
4847+ baz: { :% , [ { :line , 1 } ] , [ MyModule.First , { :%{} , [ { :line , 1 } ] , [ { :foo , :bar } ] } ] } ,
48484848 __struct__: MyModule.Second
48494849 ]
48504850 }
@@ -7519,7 +7519,74 @@ defmodule ElixirSense.Core.MetadataBuilderTest do
75197519 } == state . calls
75207520 end
75217521
7522- # TODO track Kernel.SpecialForms calls?
7522+ defmodule ModuleCallbacks do
7523+ defmacro __before_compile_macro__ ( _env ) do
7524+ quote do
7525+ def hello , do: "world"
7526+ end
7527+ end
7528+
7529+ def __before_compile__ ( env ) do
7530+ IO . inspect ( env )
7531+ end
7532+
7533+ def __after_compile__ ( env , _bytecode ) do
7534+ IO . inspect ( env )
7535+ end
7536+
7537+ def __after_verify__ ( module ) do
7538+ IO . inspect ( module )
7539+ :ok
7540+ end
7541+ end
7542+
7543+ test "registers module callback calls" do
7544+ state =
7545+ """
7546+ defmodule WithCallbacks do
7547+ @before_compile {ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks, :__before_compile_macro__}
7548+ @before_compile ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks
7549+ @after_compile ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks
7550+ @after_verify ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks
7551+ end
7552+ """
7553+ |> string_to_state
7554+
7555+ assert state . calls [ 1 ] |> Enum . any? ( fn info -> match? ( % ElixirSense.Core.State.CallInfo {
7556+ arity: 1 ,
7557+ position: { 1 , nil } ,
7558+ mod: ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks ,
7559+ func: :__before_compile_macro__ ,
7560+ kind: :remote_macro
7561+ } , info ) end )
7562+
7563+ assert state . calls [ 1 ] |> Enum . any? ( fn info -> match? ( % ElixirSense.Core.State.CallInfo {
7564+ arity: 1 ,
7565+ position: { 1 , nil } ,
7566+ mod: ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks ,
7567+ func: :__before_compile__ ,
7568+ kind: :remote_function
7569+ } , info ) end )
7570+
7571+ assert state . calls [ 1 ] |> Enum . any? ( fn info -> match? ( % ElixirSense.Core.State.CallInfo {
7572+ arity: 2 ,
7573+ position: { 1 , nil } ,
7574+ mod: ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks ,
7575+ func: :__after_compile__ ,
7576+ kind: :remote_function
7577+ } , info ) end )
7578+
7579+ assert state . calls [ 1 ] |> Enum . any? ( fn info -> match? ( % ElixirSense.Core.State.CallInfo {
7580+ arity: 1 ,
7581+ position: { 1 , nil } ,
7582+ mod: ElixirSense.Core.MetadataBuilderTest.ModuleCallbacks ,
7583+ func: :__after_verify__ ,
7584+ kind: :remote_function
7585+ } , info ) end )
7586+ # TODO: on_load and on_definition callbacks are not registered
7587+ # https://github.com/elixir-lang/elixir/issues/14427
7588+ # assert [] = state.calls[1]
7589+ end
75237590
75247591 test "registers typespec no parens calls" do
75257592 state =
0 commit comments