PragTob
Hello everyone,
dialyzer and I are fighting again
Ok so I’ve got the following code:
defimpl DeepMerge.Resolver, for: Any do
def resolve(original = %{__struct__: struct}, override = %{__struct__: struct}, resolver) do
implementors = get_implementors(DeepMerge.Resolver.__protocol__(:impls))
if Enum.member?(implementors, struct) do
Map.merge(original, override, resolver)
else
override
end
end
def resolve(_original, override, _fun), do: override
defp get_implementors({:consolidated, implementors}), do: implementors
defp get_implementors(:not_consolidated) do
IO.warn "Protocols not consolidated and trying to merge two structs of the same type. Not supported!"
# let the code work with override semantics without being intrusive
[]
end
end
This is for my deep_merge library, trying to provide a default derivable behaviour while keeping fallback_to_any in place (which I need). You can check out & play with the real code in this PR.
The warning dialyzer gives me is:
lib/deep_merge/resolver.ex:95:pattern_match
The pattern
{:consolidated, _implementors}
can never match the type
:not_consolidated
Which I don’t understand because unless I have been having a gross typo for the last 30+ minutes then I am matching on :not_consolidated.
I’m thinking dialyzer might be confused because the elixir definition is:
@spec __protocol__(:impls) :: :not_consolidated | {:consolidated, [module]}
Kernel.def(__protocol__(:impls), do: :not_consolidated)
Where it’s success typing might end up as “this is always :not_consolidated”
Removing the clause with {:consolidated, implementors} funnily enough removes the dialyzer error but makes my tests fail ![]()
Is there anything I can do in my setup/code that isn’t just configuring dialyxir to ignore the error? ![]()
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #ai
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #elixirconf-eu
- #metaprogramming
- #hex










Showing Posts 1 to 4- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
NobbZ
Yes.
No.
PragTob
That is… Somewhat disappointing but not entirely unexpected. Thanks for the help!
opsb
You can configure dialyzer with an ignore warnings list.
Then you should be able to tell dialyzer to ignore the warning by adding it to
/dialyzer.ignore-warningsSee Google Search for some examples
sasajuric
Yes, the dialyzer concludes that in the context where it’s invoked the result of
__protocol__/1will always be:not_consolidated, and so the{:consolidated, _}pattern can never match.Providing a
@dialyzerattribute would be one way. Another is to useapply/3:apply(DeepMerge.Resolver, :__protocol__, [:impls]).