<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="6577" data-post-id="6577">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jeremyjh" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jeremyjh/120/5995_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jeremyjh
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Is it possible to share an example?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6577" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-6577" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6577"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="6580" data-post-id="6580">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="OvermindDL1" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/OvermindDL1/120/2677_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  OvermindDL1
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>The stock PhoenixFramework Presence example should do it as that is mostly all that mine is:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyServer.HelpPresence do
  use Phoenix.Presence, otp_app: :my_server,
                        pubsub_server: MyServer.PubSub

  def fetch(_topic, entries) do
    entries
  end
end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6580" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-6580" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6580"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="6598" data-post-id="6598">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="fishcakez" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/120/12081_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  fishcakez
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Ecto Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I wrote <code>dialyze</code> because I wanted a <code>dialyzer</code> task to make very different decisions to <code>dialyxir</code>. I would have liked to have contributed these changes but I wanted to change nearly everything.</p>
<p><code>dialyze</code> is designed for zero/minimal configuration, repeatable/accurate warnings, smart PLT creation, sane defaults and to automatically make decisions it knows should be done without manual user commands.</p>
<p>Zero/minimal configuration:</p>
<p>In the majority of cases all the information required to build a PLT already exists if an application adheres to OTP principles. The PLT should contain the dependencies of the project and on application should have all it dependent applications listed in its <code>applications</code>. This means <code>dialyze</code> won’t work if not creating OTP compliant applications. I think a lot of people don’t. For example I think phoenix users can’t use this task very well because phoenix does not generate the correct applications list.</p>
<p>Therefore <code>dialyxir</code> will likely be more appropriate if you are a new user because it will show unknown warnings when run and then the relevant application(s) can be manually added to the configuration. I am probably more anal than average about OTP principles so I was confident for my own use that <code>dialyze</code> wouldn’t be a problem here. However if you need the configuration then <code>dialyxir</code> is your only option.</p>
<p>Repeatable/accurate warnings:</p>
<p>Since the modules added to the PLT are completely controlled by the <code>dialyze</code> task it can change the PLT to reflect changes in dependencies. It does this by adding 2 extra phases to <code>--check-plt</code> that <code>dialyxir</code> doesn’t do. It builds the application dependency tree (by using the zero configuration PLT approach above) and works out which files should be in the PLT. Then it removes any modules that shouldn’t be there, then it checks the modules in the PLT are up to date with the latest versions of the modules and then it adds any missing modules. The 3 stage “check plt” is run every time by default (and only takes about a second if no changes to be made) so the PLT should always be the correct one. This feature might crash for a number of reasons prior to OTP 18.3 due to bugs in <code>dialyzer</code> itself.</p>
<p>Even though <code>dialyxir</code> works at the application level it will only perform the middle change using modules that are already in the PLT. Therefore if deps change adds/removes modules the PLT is out of sync which can cause false positives and negatives. I think the only way to avoid this with <code>dialyxir</code> is to completely rebuild the PLT when a dep changes but please correct me if this is wrong.</p>
<p>I could be wrong but I imagine the very vast majority of <code>dialyxir</code> users aren’t doing this and are missing warnings and getting invalid warnings.</p>
<p>Smart PLT creation:</p>
<p><code>dialyze</code> will create 1 PLT per project per Elixir version per OTP version. The reason for this is that different projects may use different dependencies and different versions of dependencies. This may sound like it would be very slow but <code>dialyze</code> does smart caching of PLTs so if another project has already created a PLT for that version of Elixir and OTP, or just for OTP, all or part of the PLT can be reused. This means a project that doesn’t have any dependencies except for Elixir (and dependencies of Elixir like <code>:kernel</code> and <code>:stdlib</code>) it will build in a matter of seconds. Without this caching it will probably take a long time, maybe more than 10 minutes. This means getting started using dialyzer on a new project is fast. Because of the smart “check-plt” for repeatable warnings feature (above) the minimal changes are done to a PLT automatically when a dependency is added and the PLT does not need to rebuilt.</p>
<p>On the other hand <code>dialyxir</code> uses a global PLT per OTP version, which means you would can only use one global version of elixir and deps. Otherwise you will need to rebuild the PLT or end up using the incorrect PLT! It is configurable to avoid this but it is not the default. This default could mean using another project could break the PLT usage for different project.</p>
<p>I could be wrong but I imagine for many <code>dialyxir</code> users they don’t realise that PLTs from one project can interact with another. And for all <code>dialyxir</code> users that have realised this and set local PLTs they will have had to spend a lot of extra time waiting for PLTs to build.</p>
<p>Sane defaults:</p>
<p>As well as the (forced) defaults above <code>dialyze</code> does not add any extra warnings that <code>dialyzer</code> does not run. Apart from opting out of checking the PLT or opting out of running analysis this is the only part of <code>dialyze</code> that can be configured and requires command line arguments to turn warnings on and off.</p>
<p>However <code>dialyxir</code> adds extra default warnings: <code> "-Wunmatched_returns", "-Werror_handling", "-Wrace_conditions", "-Wunderspecs"</code>. These warnings are not on by default because success typing should not produce false positives. All of these except <code>-Wrace_conditions</code> can cause them. These warnings are extra features that <code>dialyzer</code> is able to produce.</p>
<p>The first <code>"-Wunmatched_returns"</code> is a useful warning but perhaps a little to strict for a beginner, in most cases of this warning it is fine to ignore the return of a function - false positive. Requiring <code>_ = call()</code> in these cases is of questionable style. I like it but some don’t.</p>
<p>The second <code>"-Werror_handling"</code> can lead to false positive because it might be intentional that a function will always raise. I am unsure of a case where dialyzer won’t producer other warnings when this is not intentional.</p>
<p>The third <code>"-Wrace_conditions"</code> tries to find race conditions in the code. I am unsure what the warnings are because it has never found any in my code. Please let me know if it has found any for you. However it can add a lot of extra time to running <code>dialyzer</code>, I think it tries brute force. Some people have even reported it get stuck in an apparent infinite loop on the erlang mailing list. Therefore I would advise against running this warning. If you need race condition testing try concuerror it is much better at this job.</p>
<p>The fourth <code>"-Wunderspecs"</code> shows when specifications are too allowing. It may not be practical or helpful to use the more specific specification, i.e. false positives. For example a macro may return a subset of <code>Macro.t</code> and this warning will appear if dialyzer a subset that it can produce. However to a user of the macro it should only be applicable that the macro returns <code>Macro.t</code>. Enforcing such a strict spec often leads to requiring a backwards incompatible change in spec for what would otherwise be a backwards compatible change.</p>
<p>Automatically run commands that need to be run:</p>
<p>If a computer can work out that something needs to run then it should run it for the user without being prompted. <code>dialyze</code> will automatically do everything required: ensure the PLT is using the current deps and is up to date unless explicitly told not.</p>
<p><code>dialyxir</code> requires manually building and checking the PLT. Even if checking was automatic the check would not be enough to ensure the PLT is up to date with deps.</p>
<p>Another difference is that <code>dialyzer</code> runs <code>dialyzer</code> inside the same VM. Whereas <code>dialyxir</code> starts another VM. I am unsure if there are bugs here like getting the wrong version of Erlang but if <code>dialyer</code> is slow and the user decides to kill mix, the extra VM will keep running and wont exit until the analysis finishes. You will need to look up the processes and kill it manually. There is a benefit to using the CLI though, unknown warnings are shown by default, whereas for the erlang API there are not and have to be turned on. Therefore <code>dialyze</code> does not show unknown warnings by default but <code>dialyxir</code> does.</p>
<p>Importantly <code>dialyze</code> is no longer maintained because no one was contributing and only people complaining. Instead I maintain the <code>rebar3</code> provider which has all the features of <code>dialyze</code> (but is faster) plus the same (and more) configuration that <code>dialyxir</code> has. The <code>rebar3</code> provider also adds various colours to different parts of the warnings to make them easier to understand and groups warnings by module.</p>
<p>I would suggest that any one interested in using <code>dialyzer</code> in elixir gets behind <code>dialyxir</code> and resolves the issues I have mentioned above. Otherwise the experience of using <code>dialyzer</code> will remain poor (and IMO broken) in elixir: Wasting ~10 minutes per PLT build (after the first global) that is not going to be managed properly and generate false positives and false negatives. Once that has been handled people may want to look at formatting the errors in a clearer style.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6598" data-batch-url="/posts/batch_likers">
                        6
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-6598" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6598"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="6604" data-post-id="6604">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="fishcakez" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/120/12081_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  fishcakez
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Ecto Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Also it is not enough to just add the direct dependencies to the PLT (as I think both <code>dialyze</code> and <code>dialyxir</code>), you will likely need to add deps of deps. <code>dialyzer</code> won’t know about the types of deps of deps and may not be able to infer the spec of dependency functions without the deps of deps if they dont have <code>@spec</code>. A previous version of <code>dialyze</code> handled this but some people had memory issues.</p>
<p>Edit: Ah <code>dialyxir</code> can handle this situation I think if it gets all transitive deps by walking the whole deps tree. This should probably be the default otherwise false negatives due to <code>dialyzer</code> being unable to infer type information.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6604" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-6604" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6604"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="6606" data-post-id="6606">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jeremyjh" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jeremyjh/120/5995_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jeremyjh
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for the reply, the thinking behind dialyze is really fascinating, glad you shared it.</p>
<aside class="quote no-group" data-username="fishcakez" data-post="14" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Even though dialyxir works at the application level it will only perform the middle change using modules that are already in the PLT. Therefore if deps change adds/removes modules the PLT is out of sync which can cause false positives and negatives. I think the only way to avoid this with dialyxir is to completely rebuild the PLT when a dep changes but please correct me if this is wrong.</p>
</blockquote>
</aside>
<p>This is partially correct; <code>dialyxir</code> has always had functionality to check for missing deps and add them if necessary, but the user has to run the <code>mix dialyzer.plt</code> task after they make dependency changes. Until recently there was an ommission where it did not check for updates in dependencies that were added to the PLT, but it does do that now. For a medium sized project this whole process takes several seconds, at least the way I’m doing it - so I’ve kept it as a separate task.</p>
<aside class="quote no-group" data-username="fishcakez" data-post="14" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Automatically run commands that need to be run:</p>
<p>If a computer can work out that something needs to run then it should run it for the user without being prompted. dialyze will automatically do everything required: ensure the PLT is using the current deps and is up to date unless explicitly told not.</p>
</blockquote>
</aside>
<p>I agree, if I can do it quickly enough, and presently I haven’t been able to - just checking if there are missing apps takes a couple of seconds. Perhaps there could be a quick way to see if any dependencies of the project has changed, like a hash of the mix.lock file, that should trigger a recheck.</p>
<aside class="quote no-group quote-modified" data-username="fishcakez" data-post="14" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Also it is not enough to just add the direct dependencies to the PLT (as I think both dialyze and dialyxir), you will likely need to add deps of deps. dialyzer won’t know about the types of deps of deps and may not be able to infer the spec of dependency functions without the deps of deps if they dont have <a class="mention" href="/u/spec" rel="nofollow">@spec</a>. A previous version of dialyze handled this but some people had memory issues.</p>
</blockquote>
</aside>
<p>I just added support for doing this, and actually this is the reason I opened the thread is to solicit feedback on if it should be the default or not, I’m presently inclined towards making it so.</p>
<p>I do plan to adopt the <code>dialyze</code> method of PLT management, as I mentioned in the original post.</p>
<p>I’m open to changes in the default warnings, particularly removing -Wrace_conditions. The genesis of the default warnings used is an elixir-lang-core email from April 2013 which was my introduction to Dialyzer and one PR which added -Wunderspecs. I never made any changes as I didn’t think it was right to silently stop checking something that I used to check, even if it happened to be listed in a changelog. But my intention with the 0.4 release is clean-up some of these mistakes that have been left in the name of “compatibility”.</p>
<p>This whole experience has given me a very different perspective on worse-is-better. I wrote Dialyxir before I knew hardly anything about Dialyzer, and despite never mentioning it to anyone (until this OP) it sort of took on a life of its own and started getting PRs to fix some of the most glaring issues and to maintain compatibility with the evolving Elixir that I had lost touch with for a couple of years. Now for better (and often worse) a lot of people are trying to use it so I’ve taken a new interest in fixing it. Thanks for your feedback, it really does help.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6606" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-6606" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6606"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #15"></div>
  </section>
</div>
    <div class="postbit" id="6607" data-post-id="6607">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="fishcakez" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/120/12081_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  fishcakez
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Ecto Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>[quote="jeremyjh, post:16, topic:1003]</p>
<aside class="quote no-group" data-username="fishcakez" data-post="14" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Even though dialyxir works at the application level it will only perform the middle change using modules that are already in the PLT. Therefore if deps change adds/removes modules the PLT is out of sync which can cause false positives and negatives. I think the only way to avoid this with dialyxir is to completely rebuild the PLT when a dep changes but please correct me if this is wrong.</p>
</blockquote>
</aside>
<p>This is partially correct; <code>dialyxir</code> has always had functionality to check for missing deps and add them if necessary, but the user has to run the <code>mix dialyzer.plt</code> task after they make dependency changes. Until recently there was an ommission where it did not check for updates in dependencies that were added to the PLT, but it does do that now. For a medium sized project this whole process takes several seconds, at least the way I’m doing it - so I’ve kept it as a separate task.<br>
[/quote]</p>
<p>Unfortunately I think this is fully correct but perhaps there is a miscommunication. If a dep is updated and this changes that dep so that modules are added or removed dialyxir does not add/remove these modules. Not that if a dep application is added. Dialyxir also never handles removal of removed deps. I think this will cause dialyxir to crash and require a rebuild of the PLT from scratch.</p>
<p>[quote="jeremyjh, post:16, topic:1003]</p>
<aside class="quote no-group quote-modified" data-username="fishcakez" data-post="14" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Also it is not enough to just add the direct dependencies to the PLT (as I think both dialyze and dialyxir), you will likely need to add deps of deps. dialyzer won’t know about the types of deps of deps and may not be able to infer the spec of dependency functions without the deps of deps if they dont have <a class="mention" href="/u/spec" rel="nofollow">@spec</a>. A previous version of dialyze handled this but some people had memory issues.</p>
</blockquote>
</aside>
<p>I just added support for doing this, and actually this is the reason I opened the thread is to solicit feedback on if it should be the default or not, I’m presently inclined towards making it so.</p>
<p>[/quote]</p>
<p>I did edit before your reply but you probably missed it, please see the edit, <code>dialyxir</code> is not adding transitive deps as I described in the edit.</p>
<p>[quote="jeremyjh, post:16, topic:1003]<br>
I do plan to adopt the <code>dialyze</code> method of PLT management, as I mentioned in the original post.<br>
[/quote]</p>
<p>Yes but I was trying to explain that the current PLT usage needs a lot of work and that is going to generate false negatives and false positives in the hope people will contribute. I decided to officially declare <code>dialyze</code> as not maintained in response to this post in the hope that you will stand up and produce a good task that I believe neither of us have been able to do so far.</p>
<p>[quote="jeremyjh, post:16, topic:1003]<br>
I’m open to changes in the default warnings, particularly removing -Wrace_conditions. The genesis of the default warnings used is an elixir-lang-core email from April 2013 which was my introduction to Dialyzer and one PR which added -Wunderspecs. I never made any changes as I didn’t think it was right to silently stop checking something that I used to check, even if it happened to be listed in a changelog. But my intention with the 0.4 release is clean-up some of these mistakes that have been left in the name of “compatibility”.<br>
[/quote]</p>
<p>The current defaults have beginner users wasting a lot of time. I have seen a lot of people struggling to deal with these warnings which shouldn’t be displayed and they get put off using dialyzer. Elixir can maintain the <code>-Wunderspecs</code> and other advance warnings because it has the contributors to hold itself to a higher standard than most other libraries, and it is not expected for beginners to use that, maybe not even more advanced users.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6607" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-6607" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6607"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="6608" data-post-id="6608">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jeremyjh" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jeremyjh/120/5995_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jeremyjh
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="fishcakez" data-post="17" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Unfortunately I think this is fully correct but perhaps there is a miscommunication. If a dep is updated and this changes that dep so that modules are added or removed dialyxir does not add/remove these modules. Not that if a dep application is added. Dialyxir also never handles removal of removed deps. I think this will cause dialyxir to crash and require a rebuild of the PLT from scratch.</p>
</blockquote>
</aside>
<p>Dialyxir will now (as of latest release) invoke the dialyzer --check_plt task which should handle updating apps modules when dependencies have had code changes. It is correct it does not remove apps, this is a liability of the global PLT and should definitely be fixed when I move to the <code>dialyze</code> style PLT management.</p>
<aside class="quote no-group" data-username="fishcakez" data-post="17" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>I did edit before your reply but you probably missed it, please see the edit, <code>dialyxir</code> is not adding transitive deps as I described in the edit.</p>
</blockquote>
</aside>
<p><code>dialyxir</code> gets transitive dependencies using <code>Mix.Project.deps_paths</code> - basically the same contents as the mix.lock file. I am not pulling in OTP applications from dependencies applications list and perhaps I should - is that what you see is missing?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6608" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-6608" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6608"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="6609" data-post-id="6609">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="fishcakez" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/120/12081_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  fishcakez
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Ecto Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group quote-modified" data-username="jeremyjh" data-post="18" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jeremyjh/48/5995_2.png" class="avatar"> jeremyjh:</div>
<blockquote>
<aside class="quote no-group" data-username="fishcakez" data-post="17" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Unfortunately I think this is fully correct but perhaps there is a miscommunication. If a dep is updated and this changes that dep so that modules are added or removed dialyxir does not add/remove these modules. Not that if a dep application is added. Dialyxir also never handles removal of removed deps. I think this will cause dialyxir to crash and require a rebuild of the PLT from scratch.</p>
</blockquote>
</aside>
<p>Dialyxir will now (as of latest release) invoke the dialyzer --check_plt task which should handle updating apps modules when dependencies have had code changes. It is correct it does not remove apps, this is a liability of the global PLT and should definitely be fixed when I move to the <code>dialyze</code> style PLT management.</p>
</blockquote>
</aside>
<p>Yes but I think we are talking passed each other as I was only talking about when a dep adds or removes modules.</p>
<aside class="quote no-group quote-modified" data-username="jeremyjh" data-post="18" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jeremyjh/48/5995_2.png" class="avatar"> jeremyjh:</div>
<blockquote>
<aside class="quote no-group" data-username="fishcakez" data-post="17" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>I did edit before your reply but you probably missed it, please see the edit, <code>dialyxir</code> is not adding transitive deps as I described in the edit.</p>
</blockquote>
</aside>
<p><code>dialyxir</code> gets transitive dependencies using <code>Mix.Project.deps_paths</code> - basically the same contents as the mix.lock file. I am not pulling in OTP applications from dependencies applications list and perhaps I should - is that what you see is missing?</p>
</blockquote>
</aside>
<p>Right! You may also had deps that aren’t needed using this method. <code>dialyze</code> uses .app files to do this. I am unsure if <code>dialyze</code> and <code>dialyxir</code> use the same license, if not I can provide a copy of <code>dialyze</code> under a matching license sans contributions from others, so you can re use what you’d like to.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6609" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-6609" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6609"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #18"></div>
  </section>
</div>
    <div class="postbit" id="6610" data-post-id="6610">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="fishcakez" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/120/12081_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  fishcakez
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Ecto Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="fishcakez" data-post="19" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>I am unsure if dialyze and dialyxir use the same license,</p>
</blockquote>
</aside>
<p>The license is the same, apache 2.0, so there is no issue there.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6610" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-6610" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6610"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #19"></div>
  </section>
</div>
    <div class="postbit" id="6612" data-post-id="6612">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jeremyjh" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jeremyjh/120/5995_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jeremyjh
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="fishcakez" data-post="19" data-topic="1003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fishcakez/48/12081_2.png" class="avatar"> fishcakez:</div>
<blockquote>
<p>Yes but I think we are talking passed each other as I was only talking about when a dep adds or removes modules.</p>
</blockquote>
</aside>
<p>You are right, I reread your original post and see that I missed you pointed out this is in addition to what --check_plt already does. I guess I’m not surprised --check_plt does not remove modules, but I am surprised it doesn’t add them - that would also cause problems for CLI users of dialyzer. I agree then I should also use this approach and your code for it in <code>dialyxir</code>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="6612" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/dialyxir-recent-updates-and-request-for-feedback/1003/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-6612" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="6612"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #20"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/1003/load_more?page=3">Load more posts (23 remaining)</a>
</div></template></turbo-stream>