Make dialyzer use -callback types in behaviour module

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Make dialyzer use -callback types in behaviour module

Bach Le-2
Currently, `-callback` declaration only affects how dialyzer works on the callback module. Those info are ignored in the behaviour module when a dynamic call is made: `HandlerMod:callback_fun()`. Right now, I am rewriting some behaviour specs and having dialyzer check the types would be great.

I can think of two ways to do this:

* Make dialyzer consider all dynamic calls in a module that declare `-callback` to be calls to the matching callback functions. I have no idea about dialyzer's internal though.
* Create a parse transform that is only called when using dialyzer. Each `-callback` will have a matching wrapper function e.g: `-callback foo(number()) -> ok` will generate `
`'$call_foo'(module(), number()) -> ok`. All dynamic calls (e.g: `HandlerMod:foo(42)`) will be rewritten to use those wrappers (`'$call_foo'(HandlerMod, 42)`). IIRC, there are ways to pass compiler options into dialyzer.

What are your thoughts?

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|

Re: Make dialyzer use -callback types in behaviour module

Sölvi Páll Ásgeirsson
Hi

I think that the way I'd prefer is to type the record field(or
whatever) that are used to store HandlerMod, just like we do when
typing other things.

i.e., you should be able to define your state as something like:
-record(state, { handler_mod :: some_behaviour_type()
}).

And dialyzer would figure out that handler_mod should infer to a
module that implements that behaviour type.
That way, no unexpected magic is going on and the typing of the
callback will be no different from the typing of other things that you
might have in your state.

Cheers
Sölvi Páll Á.
On Mon, Aug 20, 2018 at 7:30 AM Bach Le <[hidden email]> wrote:

>
> Currently, `-callback` declaration only affects how dialyzer works on the callback module. Those info are ignored in the behaviour module when a dynamic call is made: `HandlerMod:callback_fun()`. Right now, I am rewriting some behaviour specs and having dialyzer check the types would be great.
>
> I can think of two ways to do this:
>
> * Make dialyzer consider all dynamic calls in a module that declare `-callback` to be calls to the matching callback functions. I have no idea about dialyzer's internal though.
> * Create a parse transform that is only called when using dialyzer. Each `-callback` will have a matching wrapper function e.g: `-callback foo(number()) -> ok` will generate `
> `'$call_foo'(module(), number()) -> ok`. All dynamic calls (e.g: `HandlerMod:foo(42)`) will be rewritten to use those wrappers (`'$call_foo'(HandlerMod, 42)`). IIRC, there are ways to pass compiler options into dialyzer.
>
> What are your thoughts?
> _______________________________________________
> erlang-questions mailing list
> [hidden email]
> http://erlang.org/mailman/listinfo/erlang-questions
_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions