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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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">
								<h1><a name="p-200628-version-1191-1" class="anchor" href="#p-200628-version-1191-1" aria-label="Heading link" rel="nofollow"></a>Version 11.9.1</h1>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=Kronic%2eDeth%40gmail%2ecom&amp;lc=US&amp;item_name=Elixir%20plugin%20for%20IntelliJ%20IDEA&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted" rel="noopener nofollow ugc">Donate</a> (Lowest/Median/Mean/Record is $1/14.19/26.34/200.00 USD.)</p>
<h1><a name="p-200628-thanks-2" class="anchor" href="#p-200628-thanks-2" aria-label="Heading link" rel="nofollow"></a>Thanks</h1>
<ul>
<li>For reporting that the JPS (external builder) subproject was built with Java &gt; 1.8, which is incompatible with JPS.
<ul>
<li><a href="https://github.com/petermant" rel="noopener nofollow ugc">@petermant</a></li>
<li>Robb Wright (<a href="https://github.com/audaxion" rel="noopener nofollow ugc">@audaxion</a>)</li>
<li>Deni Helizar (<a href="https://github.com/Deni7777" rel="noopener nofollow ugc">@Deni7777</a>)</li>
</ul>
</li>
<li>For reporting NPE caused by old code referring to DepsWatcher as a Project <em>Component</em> instead of a Project <em>Listener</em>.
<ul>
<li>Vladimir Carballo (<a href="https://github.com/venriq" rel="noopener nofollow ugc">@venriq</a>)</li>
</ul>
</li>
<li>For reporting that syntax highlighting was broke due to broken decompilation of <code>Kernel</code> and <code>Kernel.SpecialForms</code> due to bugs in <span class="hashtag-raw">#1834</span>.
<ul>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">@odk211</a>)</li>
<li>Jonathan Stiansen (<a href="https://github.com/jonathanstiansen" rel="noopener nofollow ugc">@jonathanstiansen</a>)</li>
<li>Josh Taylor (<a href="https://github.com/joshuataylor" rel="noopener nofollow ugc">@joshuataylor</a>)</li>
<li>Alex Yip (<a href="https://github.com/alexttyip" rel="noopener nofollow ugc">@alexttyip</a>)</li>
<li>Tres Wong-Godfrey (<a href="https://github.com/tres" rel="noopener nofollow ugc">@tres</a>)</li>
<li>Andre Cloutier (<a href="https://github.com/andrecloutier-pd" rel="noopener nofollow ugc">@andrecloutier-pd</a>)</li>
<li>Andrew Shu (<a href="https://github.com/montooner" rel="noopener nofollow ugc">@montooner</a>)</li>
<li>Kilian Gärtner (<a href="https://github.com/Meldanor" rel="noopener nofollow ugc">@Meldanor</a>)</li>
<li>Aditya Suman Maharana (<a href="https://github.com/adityamaharana7" rel="noopener nofollow ugc">@adityamaharana7</a>)</li>
<li>Erik Hanson (<a href="https://github.com/eahanson" rel="noopener nofollow ugc">@eahanson</a>)</li>
<li>Oliver Switzer (<a href="https://github.com/oliverswitzer" rel="noopener nofollow ugc">@oliverswitzer</a>)</li>
<li>Matt Pinkston (<a href="https://github.com/mpinkston" rel="noopener nofollow ugc">@mpinkston</a>)</li>
<li>Michael Maier (<a href="https://github.com/zookzook" rel="noopener nofollow ugc">@zookzook</a>)</li>
</ul>
</li>
<li>For testing fixes broken highlighting.
<ul>
<li>Josh Taylor ((<span class="mention">@joshuataylor</span>)[<a href="https://github.com/joshuataylor" class="inline-onebox" rel="noopener nofollow ugc">joshuataylor (Josh Taylor) · GitHub</a>])</li>
</ul>
</li>
</ul>
<h1><a name="p-200628-changelog-3" class="anchor" href="#p-200628-changelog-3" aria-label="Heading link" rel="nofollow"></a>Changelog</h1>
<h2><a name="p-200628-v1191-4" class="anchor" href="#p-200628-v1191-4" aria-label="Heading link" rel="nofollow"></a>v11.9.1</h2>
<h3><a name="p-200628-bug-fixes-5" class="anchor" href="#p-200628-bug-fixes-5" aria-label="Heading link" rel="nofollow"></a>Bug Fixes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1877" rel="noopener nofollow ugc">#1877</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>
<p>Fix syntax highlighting stopping due to decompiling of <code>Kernel</code> failing caused by bugs introduced in <span class="hashtag-raw">#1834</span>.<br>
Syntax highlighting could fail part way through a file when <code>Kernel</code> needed to be decompiled to resolve parts of the syntax.  This would lead to the file to be colored above a certain point, but then the default gray after that point.</p>
<ul>
<li>Connect compiled stubs to decompiled source by name/arity.<br>
Previously, when the decompiler didn’t use the <code>Docs</code>, it was guaranteed that the <code>PsiCompiled</code> stubs would correlate, in-order, with the decompiled source call definitions, and so mirrors could be set by matching up the list of them in order.  Since the <code>Docs</code> doesn’t have to correspond to and doesn’t correspond to the binary precisely for some BEAMs, most importantly, <code>Elixir.Kernel.beam</code>, the PsiCompiled stub and decompiled source is now matched by name and arity.   This means some mirrors are missed, but no errors are produced.</li>
<li>Allow decompile source to map to entire arity range<br>
Since the decompile source from <code>Docs</code> can have default arguments the call definition clauses can have an arity range and not just a fixed arity, so all arities in the range need to be mappable to <code>PsiCompiled</code> functions.</li>
<li>Use correct macro for signature from <code>Docs</code>.<br>
Ensures that defmacro is used for macros instead of hard-coding <code>def</code> as in <span class="hashtag-raw">#1834</span>.</li>
<li>Use <code>~S"""</code> for docs from <code>Docs</code> chunk.<br>
The docs from the <code>Docs</code> chunk may contain interpolation in the code samples or <code>#{</code> in regex examples, but these should not be treated as an interpolation start as the <code>Docs</code> format does not support interpolation.  Anything that looks like interpolation in the docs text was actually escaped in the original docs, so also escape it here by using <code>S"""</code>, which turns off interpolation.</li>
<li>Log an error if <code>Code</code> function can’t be matched to decompiled source.<br>
Unlike the old <code>InvalidMirrorException</code>, this won’t be an exception and the binary ↔ decompile will still work for the other functions/macros in the file, so it will be a more graceful degradation.</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1878" rel="noopener nofollow ugc">1878</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Fix missed references to <code>DepsWatcher</code> as project component<br>
<code>DepsWatcher</code> was converted to a Project Listener in <span class="hashtag-raw">#1844</span> to support installing the plugin from the Marketplace without reloading, but some references to <code>DepsWatcher</code> were still trying to get its instance for project using <code>project.getComponent()</code>, which would now return <code>null</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1879" rel="noopener nofollow ugc">#1879</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Target Java 1.8 for JPS compatibility.<br>
JPS (JetBrains Project System) is the API used to allow External Builders, like <code>mix</code> to build projects.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1880" rel="noopener nofollow ugc">#1880</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Fix matching <code>unquote(ATOM)</code> call definitions to compiled function by using the argument to<code>unquote</code> when calculating the name of the call definition clause if possible.<br>
Needed to match anonymous function names that are <code>unquote</code>d because they contain <code>/</code> to separate the outer function name from the anonymous function naming convention.</li>
<li>Don’t use <code>Docs</code> signature for <code>MacroNameArity</code> that is an operator or <code>unquote</code>d<br>
The signatures for operators and <code>unquote</code>d don’t produce valid code that can be parsed.</li>
<li>Don’t use signatures for <code>__struct__</code> functions.<br>
The signatures for the <code>__struct__</code> functions are like <code>%Module{}</code>, but that’s not parseable, so bypass the signatures with a specialized <code>SignatureOverride</code> decompiler that matches the actual code in <code>defstruct</code>.</li>
<li>Don’t indent empty lines from <code>Docs</code> for <code>@moduledoc</code> and <code>@doc</code> to match the formatter output.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1881" rel="noopener nofollow ugc">#1881</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Fix capitalization of <code>Docs</code> <code>@moduledoc</code><br>
<code>@moduleDoc</code> → <code>@moduledoc</code></li>
</ul>
</li>
</ul>
<p><a href="https://github.com/KronicDeth/intellij-elixir/blob/v11.9.1/README.md#installation" rel="noopener nofollow ugc">Installation Instructions</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="200628" data-batch-url="/posts/batch_likers">
                        3
                      </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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/83">Post #82</a>
	                </div>
	            </div>
              <div id="likers-container-200628" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="200628"
                     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 #82"></div>
  </section>
</div>
    <div class="postbit" id="200679" data-post-id="200679">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/kronicdeth" rel="nofollow">@KronicDeth</a> do you think it likely that you will support wsl running any time soon? The issue has been up a while now. I would be surprised if even 30% of elixir devs on windows remain outside wsl now (number sponsored by pulling it out of my reat, but I think I can’t be far off).</p>
<p>I wanted to give this a swirl again, but windows based elixir dev is pretty lackluster experience.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="200679" 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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/84">Post #83</a>
	                </div>
	            </div>
              <div id="likers-container-200679" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="200679"
                     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 #83"></div>
  </section>
</div>
    <div class="postbit" id="201238" data-post-id="201238">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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">
								<h1><a name="p-201238-version-1192-1" class="anchor" href="#p-201238-version-1192-1" aria-label="Heading link" rel="nofollow"></a>Version 11.9.2</h1>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=Kronic%2eDeth%40gmail%2ecom&amp;lc=US&amp;item_name=Elixir%20plugin%20for%20IntelliJ%20IDEA&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted" rel="noopener nofollow ugc">Donate</a> (Lowest/Median/Mean/Record is $1/14.19/26.34/200.00 USD.)</p>
<h1><a name="p-201238-thanks-2" class="anchor" href="#p-201238-thanks-2" aria-label="Heading link" rel="nofollow"></a>Thanks</h1>
<ul>
<li>For reporting syntax highlighting stopping in 11.9.1
<ul>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">odk211</a>)</li>
<li>Joshua Taylor (<a href="https://github.com/joshuataylor" rel="noopener nofollow ugc">@joshuataylor</a>)</li>
<li><a href="https://github.com/tsedge" rel="noopener nofollow ugc">@tsedge</a></li>
<li>Matt Pinkston (<a href="https://github.com/mpinkston" rel="noopener nofollow ugc">@mpinkston</a>)</li>
<li>Mikhail (<a href="https://github.com/mikanoz" rel="noopener nofollow ugc">@mikanoz</a>)</li>
<li>Kilian Gärtner (<a href="https://github.com/Meldanor" rel="noopener nofollow ugc">@Meldanor</a></li>
<li>Angelika Tyborska (<a href="https://github.com/angelikatyborska" rel="noopener nofollow ugc">@angelikatyborska</a>)</li>
</ul>
</li>
<li>For reporting no decompiled source functions with names
<ul>
<li>Joshua Taylor (<a href="https://github.com/joshuataylor" rel="noopener nofollow ugc">@joshuataylor</a>)</li>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">odk211</a>)</li>
<li>Vincent (<a href="https://github.com/depeiwang" rel="noopener nofollow ugc">@depeiwang</a>)</li>
<li>Angelika Tyborska (<a href="https://github.com/angelikatyborska" rel="noopener nofollow ugc">@angelikatyborska</a>)</li>
<li>Masoud Motallebipour (<a href="https://github.com/peprog" rel="noopener nofollow ugc">@peprog</a>)</li>
</ul>
</li>
<li>For testing 11.9.2 pre-releases
<ul>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">odk211</a>)</li>
<li>Matt Pinkston (<a href="https://github.com/mpinkston" rel="noopener nofollow ugc">@mpinkston</a>)</li>
</ul>
</li>
<li>For posting videos (!) of the highlighting not working in 11.9.2 pre-releases
<ul>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">odk211</a>)</li>
</ul>
</li>
<li>For working through the <code>LexerEditorHighlighter</code> code with me on JetBrains Platform Slack
<ul>
<li>Joachim Ansorg <a href="https://github.com/jansorg" rel="noopener nofollow ugc">jansorg</a></li>
</ul>
</li>
</ul>
<h1><a name="p-201238-changelog-3" class="anchor" href="#p-201238-changelog-3" aria-label="Heading link" rel="nofollow"></a>Changelog</h1>
<h2><a name="p-201238-v1192-4" class="anchor" href="#p-201238-v1192-4" aria-label="Heading link" rel="nofollow"></a>v11.9.2</h2>
<h3><a name="p-201238-bug-fixes-5" class="anchor" href="#p-201238-bug-fixes-5" aria-label="Heading link" rel="nofollow"></a>Bug Fixes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1887" rel="noopener nofollow ugc">#1887</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Protect from nested heredocs in documentation from stopping documentation’s heredoc as happens in <code>Module</code> and <code>Ecto.Query</code>.
<ul>
<li>Use <code>~S</code> for <code>@moduledoc</code> too, in addition to <code>@doc</code>.</li>
<li>Check if the documentation contains <code>"""</code> or <code>'''</code> and use the opposite one as the promoter/terminator.
<ul>
<li>If neither is used, use <code>"""</code>.</li>
<li>If both are used, use <code>"""</code>, but then escape <code>"""</code> as <code>\"\"\"</code>.</li>
</ul>
</li>
<li>Trim trailing whitespace from documentation lines to match formatter output.</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1890" rel="noopener nofollow ugc">#1890</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Set <code>runIde</code> <code>maxHeapSize</code> to <code>7g</code>
<ul>
<li>Set to the same I run my own IDE at, so the debugged instance isn’t any slower than the normal IDE when I need to do extended all day testing to trigger bugs.</li>
</ul>
</li>
<li>Test that all <code>FormattingTest</code> files can be parsed.</li>
<li><code>YYINITIAL</code> is special - wrappers of the lexer assume that if in <code>YYINITIAL</code>, it is safe to shift the lexer over when there is an error, having <a href="https://github.com/KronicDeth/intellij-elixir/blob/36b53331967950453906c3bde9c7f79dc3f9cd2f/src/org/elixir_lang/Elixir.flex#L812" rel="noopener nofollow ugc"><code>{OPENING_CURLY}</code> <code>pushAndBegin(YYINITIAL)</code> when it was either in <code>YYINITIAL</code> or <code>INTERPOLATION</code></a> means that the lexer looked like it was restartable when it really wasn’t.  This code has been in the lexer for <a href="https://github.com/KronicDeth/intellij-elixir/blame/36b53331967950453906c3bde9c7f79dc3f9cd2f/src/org/elixir_lang/Elixir.flex#L812" rel="noopener nofollow ugc">6 years</a>.
<ul>
<li>When in <code>YYINITIAL</code>, <code>{</code> no longer recurses into <code>YYINITIAL</code> as <code>}</code> does not need to be counted to determine if it is closing an interpolation.</li>
<li>When in <code>INTERPOLATION</code>, <code>{</code> enters <code>INTERPOLATION_CURLY</code> to allow counting and matching of <code>}</code> until it can exit and go back to <code>INTERPOLATION</code>, where <code>}</code> will exit the interpolation.</li>
<li>When in <code>INTERPOLATION_CURLY</code>, <code>{</code> enters another level of <code>INTERPOLATION_CURLY</code> to allow counting and matching of <code>}</code> until it can exit and go up a level.</li>
</ul>
</li>
<li>The <code>}</code> in <code>YYINITIAL</code> did <code>yybegin(ADDITION_OR_SUBTRACTION_MAYBE)</code>, but it should have been <code>pushAndBegin(ADDITION_OR_SUBTRACTION)</code> as <code>ADDITION_OR_SUBTRACTION_MAYBE</code> or its following states all exit with <code>handleInLastState()</code> or <code>popAndBegin()</code>.  This was not caught in <span class="hashtag-raw">#1859</span> because the extra <code>YYINITIAL</code> from <code>pushAndBegin(YYINTIAL)</code> hid the bug.</li>
<li>Prevent nested <code>YYINITIAL</code> bugs in the future by erroring
<ul>
<li>If trying to <code>pushAndBegin(YYINITIAL)</code>.</li>
<li>If trying to <code>push(YYINITIAL)</code> and the state stack is not empty</li>
</ul>
</li>
<li>Clear the state Stack when <code>ElixirFlexLexer#reset</code> is called, as at the level of typing and pasting, the <code>ElixirFlexLexer</code> is wrapped in many layers of lexers including <code>LexerEditorHighlighter</code> where the <code>ElixirFlexLexer</code> is no longer re-instantiated when there is no text, but instead, <code>ElixirFlexLexer#reset</code> is only called.  This has always been an invariant violation since the stack state was <a href="https://github.com/KronicDeth/intellij-elixir/commit/52cb2fbf6368ba551a4784bd1de49e1fc21c969a" rel="noopener nofollow ugc">added 7 years ago</a>.  It likely only became more apparent with the changes to +/- parsing in <span class="hashtag-raw">#1859</span> that made return-to-<code>YYINITIAL</code> less likely.
<ul>
<li>Since this <code>stack.clear()</code> has to be manually added to <code>ElixirFlexLexer.java</code>, which is generated from <code>Elixir.flex</code>, <code>ResetTest</code> is added to check that the code is still there.</li>
</ul>
</li>
<li>For a reason I haven’t been able to explain, the <code>LexerEditorHighlighter</code> stops working after <code>:</code> is typed at the start of an atom in certain situations, such as before <code>)</code> inside a function call, like when adding an argument.  In this case, the old version of the lexer would mark <code>)</code> as a <code>BAD_CHARACTER</code> and continue to do so until an expected atom start of [a-zA-Z_], <code>'</code>, <code>"</code>, or an operator occurred.  Now, if an invalid atom start is matched, the <code>ATOM_START</code> state ends and the previous state handles the text, which in the function case mean <code>)</code> is parsed as <code>CLOSING_PARENTHESIS</code>.  This change allows the highlighting to continue.   I do not know if returning <code>BAD_CHARACTER</code> will always break the <code>LexerEditorHighlighter</code>, but I don’t think, so since <a href="https://github.com/JetBrains/intellij-community/blob/f66e9644fa683fba22f4ce9e30c037720f745989/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex#L538" rel="noopener nofollow ugc">the <code>GroovyLexer</code> in <code>intellij-community</code> returns it</a>, but it may be the case that it isn’t actually returned ever when users are typing and only handled by the lexer for completeness.</li>
</ul>
</li>
</ul>
<p><a href="https://github.com/KronicDeth/intellij-elixir/blob/v11.9.2/README.md#installation" rel="noopener nofollow ugc">Installation Instructions</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="201238" 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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/85">Post #84</a>
	                </div>
	            </div>
              <div id="likers-container-201238" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="201238"
                     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 #84"></div>
  </section>
</div>
    <div class="postbit" id="201239" data-post-id="201239">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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>I don’t really use my Windows desktops anymore and getting Windows to run on my laptop always run into problems, so I don’t test out Windows all that often.  I’ll likely fix <code>asdf</code> on macOS before then since I’m using <code>asdf</code> (as opposed to homebrew) for a client project currently.</p>
<p>I might be doing a revamp of the SDK/Library system in general soon though.  I want to not have to run the the SDK to get the version (I likely can get the versiot from the <code>.beam</code>) and someone from the intellij-rust team said there’s a way to do Libraries where I can use the name of the library instead of the <code>ebin</code>, so it is easier to look through External Libraries.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="201239" 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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/86">Post #85</a>
	                </div>
	            </div>
              <div id="likers-container-201239" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="201239"
                     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 #85"></div>
  </section>
</div>
    <div class="postbit" id="203283" data-post-id="203283">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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">
								<h1><a name="p-203283-version-11100-1" class="anchor" href="#p-203283-version-11100-1" aria-label="Heading link" rel="nofollow"></a>Version 11.10.0</h1>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=Kronic%2eDeth%40gmail%2ecom&amp;lc=US&amp;item_name=Elixir%20plugin%20for%20IntelliJ%20IDEA&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted" rel="noopener nofollow ugc">Donate</a> (Lowest/Median/Mean/Record is $1/14.19/26.34/200.00 USD.)</p>
<h1><a name="p-203283-thanks-2" class="anchor" href="#p-203283-thanks-2" aria-label="Heading link" rel="nofollow"></a>Thanks</h1>
<ul>
<li>For reporting problems with ASDF SDKs
<ul>
<li>River (<a href="https://github.com/locopati" rel="noopener nofollow ugc">@locopati</a>)</li>
<li>Ivan Shpotenko (<a href="https://github.com/IvanShpotenko" rel="noopener nofollow ugc">@IvanShpotenko</a>)</li>
<li>Pedro Assunção (<a href="https://github.com/noozo" rel="noopener nofollow ugc">@noozo</a>)</li>
<li><a href="https://github.com/x984a" rel="noopener nofollow ugc">@x984a</a></li>
<li>Andrew Glassman (<a href="https://github.com/aglassman" rel="noopener nofollow ugc">@aglassman</a>)</li>
<li>Don Lettrich (<a href="https://github.com/drl123" rel="noopener nofollow ugc">@drl123</a>)</li>
<li>João Evangelista (<a href="https://github.com/sleepiejohn" rel="noopener nofollow ugc">@sleepiejohn</a>)</li>
<li>O. F. K. (<a href="https://github.com/OmanF" rel="noopener nofollow ugc">@OmanF</a>)</li>
<li>Maqbool (<a href="https://github.com/m13m" rel="noopener nofollow ugc">@m13m</a>)</li>
<li>Elton Lima (<a href="https://github.com/eltonplima" rel="noopener nofollow ugc">@eltonplima</a>)</li>
<li>Ilya Zabludovskiy (<a href="https://github.com/MrLalatg" rel="noopener nofollow ugc">@MrLalatg</a>)</li>
<li>Douglas Correa (<a href="https://github.com/douglascorrea" rel="noopener nofollow ugc">@douglascorrea</a>)</li>
<li>Mathieu Gautier (<a href="https://github.com/MattGo" rel="noopener nofollow ugc">@MattGo</a>)</li>
<li>Jon (<a href="https://github.com/jonthulu" rel="noopener nofollow ugc">@jonthulu</a>)</li>
<li>Johannes (<a href="https://github.com/johannesE" rel="noopener nofollow ugc">@johannesE</a>)</li>
<li><a href="https://github.com/guruarumugam" rel="noopener nofollow ugc">@guruarumugam</a></li>
<li>Daya Sharma (<a href="https://github.com/daya" rel="noopener nofollow ugc">@daya</a>)</li>
<li>Beatrix Klebe (<a href="https://github.com/bklebe" rel="noopener nofollow ugc">@bklebe</a>)</li>
</ul>
</li>
<li>For reporting the NPE in <code>Call.finalArguments</code>
<ul>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">@odk211</a>)</li>
<li>Heitor Polidoro  (<a href="https://github.com/heitorpolidoro" rel="noopener nofollow ugc">@heitorpolidoro</a>)</li>
<li>Donald Wilson (<a href="https://github.com/donaldww" rel="noopener nofollow ugc">@donaldww</a>)</li>
</ul>
</li>
<li>For reporting that <code>html.leex</code> was not being being parsed as HTML for the template data language.
<ul>
<li>Wasi Ur Rahman (<a href="https://github.com/DevWasi" rel="noopener nofollow ugc">@DevWasi</a>)</li>
<li>Ruud Kamphuis (<a href="https://github.com/ruudk" rel="noopener nofollow ugc">@ruudk</a>)</li>
</ul>
</li>
</ul>
<h1><a name="p-203283-changelog-3" class="anchor" href="#p-203283-changelog-3" aria-label="Heading link" rel="nofollow"></a>Changelog</h1>
<h2><a name="p-203283-v11100-4" class="anchor" href="#p-203283-v11100-4" aria-label="Heading link" rel="nofollow"></a>v11.10.0</h2>
<h3><a name="p-203283-enhancements-5" class="anchor" href="#p-203283-enhancements-5" aria-label="Heading link" rel="nofollow"></a>Enhancements</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1893" rel="noopener nofollow ugc">#1893</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Simplify <code>onlyTemplateDateFileType</code></li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1897" rel="noopener nofollow ugc">#1897</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Add missing opcodes to <code>Code</code> disassembler
<ul>
<li>OTP 23 opcode <code>bs_start_match4</code></li>
<li>Current (in-development) OTP 24 opcodes
<ul>
<li><code>make_fun3</code></li>
<li><code>init_yregs</code></li>
<li><code>recv_marker_bind</code></li>
<li><code>recv_marker_clear</code></li>
<li><code>recv_marker_clear</code></li>
<li><code>recv_marker_user </code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1899" rel="noopener nofollow ugc">#1899</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Log <code>PsiElement</code> if <code>Call#finalArguments</code> contain a <code>null</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1902" rel="noopener nofollow ugc">#1902</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Suggest ASDF directories as <code>homepath</code>s for both Elixir and Erlang for Elixir SDKs.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1821" rel="noopener nofollow ugc">#1821</a> - <a href="https://github.com/jacekgajek" rel="noopener nofollow ugc">@jacekgajek</a>
<ul>
<li>Run ‘Dialyzer based inspections (Elixir)’ using Elixir SDK running <code>mix dialyzer</code> or any customized <code>mix</code> command.</li>
</ul>
</li>
</ul>
<h3><a name="p-203283-bug-fixes-6" class="anchor" href="#p-203283-bug-fixes-6" aria-label="Heading link" rel="nofollow"></a>Bug Fixes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1893" rel="noopener nofollow ugc">#1893</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Use <code>VirtualFile#fileType</code> instead of EEx Type::INSTANCE when looking up extensions.<br>
Since LEEx file <code>Type</code> is a subclass of EEx’s file <code>Type</code>, it calls <code>templateDataFileTypeSet</code> in EEx’s <code>Type</code>, but <code>templateDataFileTypeSet</code> uses <code>INSTANCE</code> from EEx.  By using the <code>VirtualFile#fileType</code> instead, it will properly be EEx or LEEx based on the actual file extension and then it can be used to strip that off and find the DataTemplateLanguage, such as <code>HTMLLanguage</code> for <code>.html.leex</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1897" rel="noopener nofollow ugc">#1897</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Compare max opcode in to file to max opcode number, not ordinal.<br>
Opcodes are 1-based, but the ordinal of the Kotlin <code>Enum</code>s are 0-based, so the comparison was off-by-1 when a file had the max opcode and would be incorrectly marked as too new.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1899" rel="noopener nofollow ugc">#1899</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Don’t return null left or right infix operands in <code>primaryArguments</code><br>
<code>operation.infix.Normalized.leftOperand</code> and <code>.rightOperand</code> ensures that <code>PsiErrorElement</code> is not returned: they can return <code>null</code> when there is no left or right operand.  <code>Infix.primaryArguments</code> was not taking this into account and so could return a <code>null</code> as one of the <code>primaryArguments</code>, which broke <code>Call.finalArguments</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1902" rel="noopener nofollow ugc">#1902</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Don’t attempt to execute <code>elixir -e "System.version |&gt; IO.puts"</code> to get the version number as it requires too much of a full SDK to be built and from the Erlang paths to be correct too, which was rarely the case for ASDF.  Since for Homebrew and ASDF, the directory name is the version name, this shouldn’t be a loss in naming ability.  If the directory name is not a parseable version it will be of the format <code>Elixir at &lt;path&gt;</code>.  This is probably more correct for installs directories that aren’t versioned as SDK versions aren’t updated if the version installed at the path changes, such as <code>/usr/local/elixir</code> or <code>/opt/elixir</code>, etc.</li>
</ul>
</li>
</ul>
<h1><a name="p-203283-readme-updates-7" class="anchor" href="#p-203283-readme-updates-7" aria-label="Heading link" rel="nofollow"></a>README updates</h1>
<h3><a name="p-203283-dialyzer-8" class="anchor" href="#p-203283-dialyzer-8" aria-label="Heading link" rel="nofollow"></a>Dialyzer</h3>
<h4><a name="p-203283-inspection-9" class="anchor" href="#p-203283-inspection-9" aria-label="Heading link" rel="nofollow"></a>Inspection</h4>
<h5><a name="p-203283-batch-mode-10" class="anchor" href="#p-203283-batch-mode-10" aria-label="Heading link" rel="nofollow"></a>Batch Mode</h5>
<ol>
<li>Analyze &gt; Run Inspection by Name… (⌥⇧⌘I)</li>
<li>Type “Dialyzer”</li>
<li>Select “Dialyzer based inspections (Elixir)” from the shortened list</li>
<li>Hit Enter.</li>
</ol>
<p>You’ll be presented with a “Run ‘Dialyzer based inspections (Elixir)’” dialog</p>
<p><img src="https://github.com/KronicDeth/intellij-elixir/raw/v11.10.0/screenshots/features/dialyzer/inspection/batch_mode/Run%20Dialyzer%20based%20inspections%20(Elixir)%20Whole%20Project.png?raw=true" alt="Run 'Dialyzer based inspections (Elixir)'" width="500" height="269"></p>
<ol>
<li>Change the scope if you want.</li>
<li>Click “OK”</li>
</ol>
<p>The Inspections Result Tool Pane will open and show results as each file is processed.</p>
<ol>
<li>
<p>Click the <img src="https://forum.elixirforum.com/images/emoji/apple/play_button.png?v=15" title=":play_button:" class="emoji" alt=":play_button:" loading="lazy" width="20" height="20"> to expand the Credo section to show all warnings</p>
<p><img src="https://github.com/KronicDeth/intellij-elixir/raw/v11.10.0/screenshots/features/dialyzer/inspection/batch_mode/Individual%20Entry.png?raw=true" alt="Individual Entry" width="690" height="47"></p>
</li>
<li>
<p>Click an entry for the details of an individual warning with a code highlighting.<br>
<img src="https://github.com/KronicDeth/intellij-elixir/raw/v11.10.0/screenshots/features/dialyzer/inspection/batch_mode/Code%20Highlighting.png?raw=true" alt="Code Highlighting" width="225" height="52"></p>
</li>
</ol>
<p><a href="https://github.com/KronicDeth/intellij-elixir/blob/v11.10.0/README.md#installation" rel="noopener nofollow ugc">Installation Instructions</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="203283" 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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/87">Post #86</a>
	                </div>
	            </div>
              <div id="likers-container-203283" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="203283"
                     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 #86"></div>
  </section>
</div>
    <div class="postbit" id="210962" data-post-id="210962">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Wsl2 support officially out, have you given any thoughts to if you will support it? <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="210962" 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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/88">Post #87</a>
	                </div>
	            </div>
              <div id="likers-container-210962" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="210962"
                     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 #87"></div>
  </section>
</div>
    <div class="postbit" id="217971" data-post-id="217971">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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">
								<h1><a name="p-217971-version-11110-1" class="anchor" href="#p-217971-version-11110-1" aria-label="Heading link" rel="nofollow"></a>Version 11.11.0</h1>
<p><a href="https://github.com/sponsors/KronicDeth" rel="noopener nofollow ugc"><img src="https://forum.elixirforum.com/images/emoji/apple/heart.png?v=15" title=":heart:" class="emoji" alt=":heart:" loading="lazy" width="20" height="20"> Sponsor</a></p>
<p>Historical One-time/Monthly Donations:</p>
<div class="md-table">
<table>
<thead>
<tr>
<th style="text-align:left">Stat</th>
<th style="text-align:right">Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Minimum</td>
<td style="text-align:right">$1.00</td>
</tr>
<tr>
<td style="text-align:left">Median</td>
<td style="text-align:right">$6.25</td>
</tr>
<tr>
<td style="text-align:left">Mean</td>
<td style="text-align:right">$12.52</td>
</tr>
<tr>
<td style="text-align:left">Maximum</td>
<td style="text-align:right">$200.00</td>
</tr>
</tbody>
</table>
</div><h1><a name="p-217971-thanks-2" class="anchor" href="#p-217971-thanks-2" aria-label="Heading link" rel="nofollow"></a>Thanks</h1>
<ul>
<li>For reporting that Ctrl+Click / Go To Declaration did not work anymore in newer version of IntellIJ
<ul>
<li>Joshua Taylor (<a href="https://github.com/joshuataylor" rel="noopener nofollow ugc">@joshuataylor</a>)</li>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">@odk211</a>)</li>
<li>Ivan Shpotenko (<a href="https://github.com/IvanShpotenko" rel="noopener nofollow ugc">@IvanShpotenko</a>)</li>
<li>Sergey Kislyakov (<a href="https://github.com/Defman21" rel="noopener nofollow ugc">@Defman21</a>)</li>
<li>Raffael Krebs (<a href="https://github.com/kreba" rel="noopener nofollow ugc">@kreba</a>)</li>
<li>Dmitry Arkhipenko (<a href="https://github.com/dkgitdev" rel="noopener nofollow ugc">@dkgitdev</a>)</li>
<li>Christopher Bach (<a href="https://github.com/muspellpete" rel="noopener nofollow ugc">@muspellpete</a>)</li>
<li>Chris Martin (<a href="https://github.com/trbngr" rel="noopener nofollow ugc">@ trbngr</a>)</li>
</ul>
</li>
<li>For helping me on JetBrains Platform slack and pointing out that <a href="https://youtrack.jetbrains.com/issue/IDEA-243212" rel="noopener nofollow ugc">the 2020 series of IDEs broke their plugins</a> too.
<ul>
<li>Colin Fleming (<a href="https://github.com/cmf" rel="noopener nofollow ugc">@cmf</a>)</li>
<li>Joachim Ansorg (<a href="https://github.com/jansorg" rel="noopener nofollow ugc">@jansorg</a>)</li>
</ul>
</li>
<li>For confirming that <a href="https://youtrack.jetbrains.com/issue/IDEA-243212#focus=Comments-27-4196159.0-0" rel="noopener nofollow ugc">JetBrains changed the API in 2020 to favor declaration instead of references</a> and because of Elixir macros everything could be a declaration, which broke macro heavy languages like Clojure and Elixir
<ul>
<li>Daniil Ovchinnikov (<a href="https://github.com/dovchinnikov" rel="noopener nofollow ugc">@dovchinnikov</a>)</li>
</ul>
</li>
</ul>
<h1><a name="p-217971-changelog-3" class="anchor" href="#p-217971-changelog-3" aria-label="Heading link" rel="nofollow"></a>Changelog</h1>
<h2><a name="p-217971-v11110-4" class="anchor" href="#p-217971-v11110-4" aria-label="Heading link" rel="nofollow"></a>v11.11.0</h2>
<h3><a name="p-217971-enhancements-5" class="anchor" href="#p-217971-enhancements-5" aria-label="Heading link" rel="nofollow"></a>Enhancements</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1948" rel="noopener nofollow ugc">#1948</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>
<p>Reference Resolution</p>
<ul>
<li>
<p>Allow any Alias in a chain to have references.<br>
This allows going to the declaration of <code>Phoenix</code>, <code>Phoenix.LiveView</code>, or <code>Phoenix.LiveView.Socket</code> depending on whether you’re on the <code>Phoenix</code>, <code>LiveView</code>, or <code>Socket</code> Alias, respectively, in the chain.</p>
<ul>
<li>
<p>Allow any Alias in Qualified Alias to be resolved<br>
This allows going to the declaration of Phoenix, Phoenix.LiveView, or Phoenix.LiveView.Socket depending on whether you’re<br>
on the Phoenix, LiveView, or Socket Alias, respectively, in the chain.</p>
</li>
<li>
<p>Update DocumentationProvider to work with improved Alias resolution</p>
<p>Without these changes the DocumentationProvider double-resolves and so ends up showing the docs for <code>def</code> and <code>defmodule</code>, instead of the call definition clause or module, respectively.</p>
</li>
</ul>
</li>
<li>
<p>Reimplement Module references<br>
Instead of references for only the outermost QualifiableAlias, there is a reference for each right-most Alias at a given position, so instead of there only be a reference to <code>App.Context.Schema</code> in <code>App.Context.Schema</code>, there is now a reference to <code>App</code> in the <code>App</code> prefix, a reference to <code>App.Context</code> in <code>Context</code> in <code>App.Context</code>, and a reference to <code>App.Context.Schema</code> in <code>Schema</code> in <code>App.Context.Schema</code>.  Not only is this more useful, being able to jump to parent namespaces, but it fixed some of the capability issues with Go To Definition in the 2020 line of IDEs.  This approach of using <code>getRangeInElement</code> to target the range of the right-most Alias, while the element was still the parent that contained, but did not go beyond the Alias, was tried after having references only on <code>Alias</code>es and not <code>QualifiedAlias</code>es did not fix completion issues.  It was the while debugging Go To Declaration actions and noticing they were sensitive to the range in element AND the <a href="https://github.com/JetBrains/intellij-community/blob/f66e9644fa683fba22f4ce9e30c037720f745989/platform/core-api/src/com/intellij/psi/PsiReference.java#L49-L62" rel="noopener nofollow ugc">docs for PsiReference#getRangeInElement</a> that I realized that the Go To Declaration and Completion has a hidden requirement that References for things that behave like namespaces have to work this way.</p>
<ul>
<li>Use <code>ModularName</code> index for Module Variants<br>
Have a smaller index to iterate and remove need for the <code>isAlias</code> check.</li>
</ul>
</li>
<li>
<p>Limit Elixir Module resolution to same JetBrains Project Module</p>
<ul>
<li>Change the <code>GlobalSearchScope</code> from <code>allProject</code> to <code>moduleWithDependenciesAndLibrariesScope</code> for faster searching on multi-module projects.
<ul>
<li>Set <code>includeTests</code> based whether the referring element is in a test directory.</li>
</ul>
</li>
<li>Use <code>StubIndex#processElements</code> instead of home grown <code>forEachNavigationElement</code> as <code>processElements</code> is more efficient.</li>
</ul>
</li>
<li>
<p>Favor Module <code>ResolveResults</code> under same <code>Module</code> content roots<br>
This should favor deps sources in the same module.</p>
</li>
<li>
<p>Iterate <code>function</code> body in <code>unquote(function())</code> when iterating call definition clauses in <code>quote</code><br>
Treats it <code>function</code> body the same as a <code>__using__</code> body.</p>
</li>
<li>
<p>Standardized preferred <code>ResolveResult</code> filters between Callables and Modules</p>
<ol>
<li>Prefer valid results as long as it doesn’t leave no results.</li>
<li>Prefer results in the same module as long as it doesn’t leave no results.</li>
</ol>
<p>In Go To Declaration also:</p>
<ol start="3">
<li>Prefer results in source (that aren’t decompiled) as long as it doesn’t leave no results.</li>
</ol>
</li>
<li>
<p>Use the second argument to <code>use</code> to determine which function is called with apply/3</p>
<p>This pattern is used in Phoenix <code>__using__</code>, so this lets to differentiate whether <code>Plug.Conn.assign/3</code> or <code>Phoenix.LiveSocket.assign/3</code> is resolved in a Controller, LiveComponent, or LiveView.</p>
</li>
<li>
<p>In LEEx Templates</p>
<ul>
<li>Resolve function calls in <code>*.html.leex</code> templates to functions defined in the corresponding LiveComponent/View module.</li>
<li>Assigns
<ul>
<li>Resolve assigns in LEEx templates to the keyword key in <code>assign/3</code> calls in <code>update/2</code> in the LiveComponent or LiveView<br>
Had to add back in a <code>TargetElementEvaluator</code>, so that the <code>UnqualifiedNoArgumentCall</code> (<code>name</code>) that is the identifier in an assign (<code>@name</code>) was not counted as valid target for Find Usages / Go To Declaration by itself.</li>
<li>Search for assigns in all call definitions in view module<br>
Expand from just <code>update</code> to any call definition to cover helper functions and other callbacks. Don’t stop on the first valid match because with helper functions and multiple callbacks, the last write isn’t obvious.</li>
<li>Resolve assigns set with <code>assign/3</code></li>
<li>Look for <code>assign</code> calls in <code>|&gt;</code> pipelines</li>
<li>Resolve assigns set with <code>assign_new/3</code></li>
<li>Resolve <span class="mention">@live_action</span> to where it is assigned Phoenix.LiveView.Channel.assign_action/2</li>
<li>Find assigns in maps for assign/2<br>
Since assign/2 accepts either a keyword list or a map, check in both types.</li>
<li>Resolve <span class="mention">@myself</span> to where it is set in <code>render_pending_components</code></li>
<li>Resolve assigns in macros with do blocks like <code>case</code> and <code>if</code></li>
<li>Find assigns in <code>live_component</code> calls<br>
If an assign can’t be found in the body of a LiveComponent module, then it maybe passed through from the <code>live_component</code> call itself, so look for any references to the view module (the LiveComponent) and if it is a <code>live_component</code> call, then look at those assigns to try to resolve the assign name.</li>
<li>Resolve assigns to <code>live_modal</code> calls<br>
<code>live_modal</code> is not built into <code>phoenix_live_view</code>, but it is generated by <code>phx.gen.live</code>, so most projects will have it.  This allows <code>return_to</code>, which is used use in <code>live_modal</code>, to be resolved.</li>
<li>Resolve <code>@socket</code> to last socket variable or call in view module.</li>
<li>Resolve <code>@flash</code> to <code>put_flash/3</code> calls.</li>
<li>Resolve <code>@inner_content</code> to <code>Phoenix.LiveView.Utils.to_rendered/2</code> setting the assign with <code>put_in</code></li>
</ul>
</li>
<li>Resolve aliases in <code>.leex</code> templates<br>
Generalize the <code>.leex</code> and <code>use</code> walking from call definition clauses to any scope processor lambda, so it can be used to resolve uses of <code>Routes</code> in <code>.leex</code> templates.</li>
</ul>
</li>
<li>
<p>Resolve Types</p>
<ul>
<li>Have separate references specifically for Types.</li>
<li>Resolve to both types declared with <code>@type</code>, <code>@typep</code>, or <code>@opaque</code>; and named type parameters.</li>
<li>Process declarations for <code>@type</code>, <code>@typep</code>, and <code>@opaque</code>.</li>
<li>Count <code>@callback</code> as declaring a Type</li>
<li>Resolve type <code>t</code> for <code>defprotocol</code> to where it is defined in <code>Protocol.__protocol__</code><br>
Unfortunately, this ties all protocol’s <code>t</code> to the same element, so Find Usage finds all protocol’s types instead of just a specific module’s type, but this works for projects that have source, but not yet compiled.
<ul>
<li>Favor protocol-specific decompiled <code>@type t</code> when available.</li>
</ul>
</li>
<li>Resolve type variable to the keyword key in guards.</li>
<li><code>__MODULE__</code></li>
</ul>
</li>
<li>
<p>Favor source over decompiled per name instead of overall for <code>ResolveResultOrderedSet</code><br>
This allows the <code>Routes</code> alias to be resolved to the both the <code>MyAppWeb.Router.Helpers</code> in <code>alias MyAppWeb.Router.Helpers, as: Routes</code> in the source of <code>MyAppWeb</code>, but also the decompiled <code>MyAppWeb.Router.Helpers</code>, which is necessary as <code>MyAppWeb.Router.Helpers</code> is produced on compile from <code>router.ex</code>.</p>
</li>
<li>
<p>Resolve references through <code>defdelegate</code> calls.</p>
</li>
<li>
<p>Resolve <code>code_reloading?</code> in MyApp.Endpoint</p>
<p>The generated <code>MyApp.Endpoint</code> for <code>mix phx.new</code> has a section to enable code-reloading at compile time:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir"># Code reloading can be explicitly enabled under the
# :code_reloader configuration of your endpoint.
if code_reloading? do
  socket("/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket)
  plug(Phoenix.LiveReloader)
  plug(Phoenix.CodeReloader)
end
</code></pre>
<p>Previously, <code>code_reloading?</code> variable would not resolve because psi.scope.Variable ignored <code>use</code> calls, not <code>use</code> calls are entered and the <code>var!(code_reloading?)</code> is found in <code>Phoenix.Endpoint.config/1</code> by way of the <code>unquote(config(opts))</code> call in the <code>quote</code> block in <code>__using__(opts)</code>.</p>
</li>
<li>
<p>Resolve qualified calls with unknown resolvable qualifier using only relative identifier and arity.</p>
</li>
<li>
<p><code>@spec</code></p>
<ul>
<li>Resolve <code>@spec</code> to <code>defdelegate</code> calls.</li>
<li>Resolve <span class="mention">@specs</span> to the definitions if the definitions are in a for comprehension</li>
</ul>
</li>
<li>
<p><code>Ecto</code></p>
<ul>
<li><code>Query</code>
<ul>
<li>
<p>Resolve reference variables in <code>Ecto.Query</code></p>
<ul>
<li>Reference variables are introduced in as the left operand of <code>in</code> passed to <code>from/2</code> and the <code>join:</code> keyword in <code>from/2</code>.</li>
<li><code>join/3-5</code></li>
<li>Resolve bindings in <code>select/2-3</code>.</li>
<li>Resolve reference variables in <code>where/2,3</code> binding.<br>
Also add support for resolving <code>a</code> in <code>[{^assoc, a}]</code> binding.</li>
<li>Resolve <code>bindings</code> in <code>group_by/2-3</code>.</li>
<li>Resolve <code>bindings</code> and <code>expressions</code> in <code>order_by/2-3</code>.</li>
<li>Resolve <code>bindings</code> in <code>having/2-3</code>.</li>
<li>Add <code>select_merge</code> to declaring <code>Ecto.Query</code> macros.</li>
<li>Add <code>distinct/2-3</code> as a declaring <code>Ecto.Query</code> macro.</li>
</ul>
</li>
<li>
<p>Resolve <code>field</code> calls in Ecto <code>schema</code> blocks</p>
<p>How <code>field</code> works in <code>schema</code> for <code>Ecto.Schema</code></p>
<ol>
<li><code>use Ecto.Schema</code></li>
<li><code>Ecto.Schema.__using__</code></li>
<li>`import Ecto.Schema, only: [schema: 2, embedded_schema: 1]``</li>
</ol>
<p>Note that only the outer DSLs, schema and embedded_schema are available even though field/2 is defined in Ecto.Schema.</p>
<p>So when you call <code>schema ... do</code></p>
<ol>
<li><code>defmacro schema(source, [do: block])</code></li>
<li><code>schema(__CALLER__, source, true, :id, block)</code></li>
<li><code>defp schema(caller, source, meta?, type, block)</code></li>
<li>There’s a big <code>prelude = quote do</code> quote block</li>
</ol>
<p>At the end of prelude there is</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">try do
  import Ecto.Schema
  unquote(block)
after
  :ok
end
</code></pre>
<p>Hey! An <code>import Ecto.Schema</code>, but <code>prelude</code> is just floating as a variable.  At the end of  <code>defp schema(caller, source, meta?, type, block)</code> is</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">quote do
  unquote(prelude)
  unquote(postlude)
end
</code></pre>
<p>So to statically analyze an <code>Ecto.Schema</code> module.</p>
<ol>
<li>Resolve <code>schema/2</code> to <code>defmacro schema</code> by walking the <code>use</code>, <code>__using__</code>, <code>quote</code>, and <code>import</code>.</li>
<li>Inside the <code>schema/2</code> (or macros in general if you want to get fancy <img src="https://forum.elixirforum.com/images/emoji/apple/nail_polish.png?v=15" title=":nail_polish:" class="emoji" alt=":nail_polish:" loading="lazy" width="20" height="20"> and support more DSLs),</li>
<li>Go into the body of the macro.  If there’s a call, resolve it</li>
<li>Go into the called function</li>
<li>Look for a <code>quote</code> block at the end (the same as my current <code>__using__</code> support)</li>
<li>If there’s a <code>Call</code> inside an <code>unquote</code> see if you can resolve it to a variable in addition to a call definition (which is already supported for Phoenix).</li>
<li>If it’s a variable, check it’s value.  If it’s a <code>quote</code>, use the quote block handling</li>
<li>In the quote block handling add support for <code>try</code></li>
<li>Walk the <code>try</code> and see the <code>import</code>, walk the <code>import</code> to find <code>Ecto.Schema.field/2</code></li>
</ol>
</li>
<li>
<p><code>API</code></p>
<ul>
<li>Resolve <code>Ecto.Query.API</code> functions in <code>Ecto.Query</code></li>
<li><code>from(order_by: ...)</code></li>
<li><code>from(select: ...)</code>
<ul>
<li><code>from(select: tuple())</code></li>
</ul>
</li>
<li><code>from(where: ...)</code></li>
<li><code>group_by/2-3</code></li>
<li><code>having/2-3</code></li>
<li><code>select/2-3</code> <code>expr</code> argument</li>
<li><code>where</code></li>
<li>Resolve <code>Ecto.Query.API.fragment</code> to arity interval <code>0..</code>.</li>
<li>Resolve <code>fragment</code> nested in other <code>Ecto.Query.API</code> call like <code>type</code>.</li>
<li>Walk <code>rightOperand</code> of <code>join(..., ... in ..., ...)</code> for <code>Ecto.Query.API</code> usages like <code>fragment</code>.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Resolve module attributes defined in <code>use</code> <code>__using__</code> <code>quote</code> block</p>
<ul>
<li>Change <code>org.elixir_lang.reference.resolver.ModuleAttribute</code> to use <code>PsiScopeProcessor</code> for non-<code>@for</code> and non-<code>@protocol</code> instead of custom logic.</li>
<li>Don’t descend into a <code>use</code> if the <code>ENTRANCE</code> is an ancestor since that means the <code>Alias</code> on the <code>use</code> is probably being resolved.</li>
<li><code>AtUnqualifiedNoParenthesesCall.processDeclarations</code> will call <code>processor.execute</code> when it isn’t a type spec.</li>
<li>The <code>UseScopeSelector</code> for <code>AtUnqualifiedNoParenthesesCallImpl</code> has been changed to <code>SELF_AND_FOLLOWING_SIBLINGS</code> since the module attribute is used that way.  The previous <code>SELF</code> value was when the <code>UseScopeSelector</code> only applied to variables.</li>
</ul>
</li>
</ul>
</li>
<li>
<p>“Elixir References” inspection for finding unresolved or invalid references.</p>
<ul>
<li><code>visitAtNonNumericOperation</code><br>
Helps “Elixir References” find unresolved assigns.</li>
</ul>
</li>
<li>
<p>Strip <code>AccessExpression</code>s from <code>Qualified</code> qualifiers automatically</p>
</li>
<li>
<p>Documentation</p>
<ul>
<li>Show <code>deprecated</code>, <code>impl</code>, and <code>spec</code>, and actual heads in documentation for source functions</li>
<li>Merge <code>Documentation</code> across multiple arities when arity of lookup is ambiguous.</li>
</ul>
</li>
<li>
<p>Find variables defined in EEx element<br>
Finds variables defined in EEx PsiElement by creating them the same as a StabBody, which means that the siblings are checked backwards from the last parent.  This fixes resolving the <code>f</code> from <code>f = form_for ...</code> in <code>*input f ...</code> in LiveView FormComponent templates.</p>
</li>
<li>
<p>Highlight named parameters in types.</p>
</li>
<li>
<p>Decompilation</p>
<ul>
<li>Fake built-in types by decompiling in <code>:erlang.beam</code><br>
For type reference resolution of built-in types to work, they need to be defined somewhere.  IntelliJ Erlang does this by looping usages back on themselves, but this leads to Find Usages not working for built-in types since each usage is a distinct declaration.  By instead defining the types in decompiled <code>:erlang.beam</code> (even though they aren’t actually defined there), there is a shared location for all reference to point to and then check for Find Usages.</li>
<li>Decompile types from EEP-48 documentation.</li>
</ul>
</li>
<li>
<p>Descend into body of <code>unless</code> in <code>quote</code> for <code>treeWalkUp</code>.</p>
</li>
<li>
<p>Descend into <code>for</code> when looking for call definition clauses.</p>
</li>
<li>
<p><code>QuoteMacro.treeWalkUp</code> into <code>if</code><br>
<code>unless</code> was already walked, but not <code>if</code>.  Fixes resolving <code>Repo.preload/2</code>, which is defined inside an <code>if</code> in <code>use Ecto.Repo</code>’s <code>__using__</code>.</p>
</li>
<li>
<p>Add <code>defguard</code> and <code>defguardp</code> to CallDefinitionClause.<code>is</code>.</p>
</li>
<li>
<p>Don’t generate a reference for <code>Elixir</code><br>
<code>Elixir</code> is not declared anywhere. It is the namespace of all Aliases.</p>
</li>
<li>
<p>Refactor how sibling sequences are walked<br>
Port filtering out comments, white space and end of expressions from <code>siblingExpression</code>.</p>
</li>
<li>
<p>Reimplement <code>fullyQualifiedName</code></p>
<p>Eliminate the specialization for <code>ElixirAlias</code> AND <code>QualifiableAlias</code> as which was picked as based on the static casted type. <code>fullyQualifiedName</code> will include the following:</p>
<ul>
<li>Convert <code>__MODULE__</code> to the enclosing modular canonical name</li>
<li>Combine an ElixirAlias with its qualifier
<ul>
<li>If in a <code>ElixirMultipleAliases</code> will combine the qualifier (<code>qualifier.{...}</code>) outside the <code>{}</code> with the relative name inside <code>...{relative, ...}</code>.</li>
</ul>
</li>
</ul>
</li>
<li>
<p>EEx</p>
<ul>
<li><code>viewFile</code> for <code>.eex</code> files used in same directory as <code>.ex</code> using <code>EEx.function_from_file</code>.</li>
<li>Resolve function calls to those defined by <code>EEx.function_from_file/3-5</code>.</li>
<li>Find view modules for templates under the <code>templates</code> directory.</li>
</ul>
</li>
<li>
<p>Walk <code>quote</code> macros for sibling call definitions</p>
</li>
<li>
<p>Always fallback to name/arity in any module if callable not resolved in scope</p>
</li>
<li>
<p>Resolve uses of aliased name produced by <code>alias __MODULE__</code></p>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1967" rel="noopener nofollow ugc">#1967</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Updates
<ul>
<li>IntelliJ IDEA build version to 2021.1.2
<ul>
<li>Update <code>ParsingTestCase</code> to latest APIs.</li>
</ul>
</li>
<li>Gradle plugins
<ul>
<li>intellij 1.0</li>
<li>kotlin.jvm 1.5.10</li>
</ul>
</li>
</ul>
</li>
<li>Configure <code>runPluginVerifier</code></li>
</ul>
</li>
</ul>
<h3><a name="p-217971-bug-fixes-6" class="anchor" href="#p-217971-bug-fixes-6" aria-label="Heading link" rel="nofollow"></a>Bug Fixes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1948" rel="noopener nofollow ugc">#1948</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>
<p>Fix Ctrl+Click/Cmd+B/Go To Declaration for Aliases.</p>
</li>
<li>
<p>Don’t index non-canonical names.<br>
The non-canonical name for a nested <code>defmodule</code> is the Alias given to that <code>defmodule</code> call.  While that name should be resolvable within the parent modular, it should not be indexed because the index is for the global scope.</p>
<p>Prevents <code>defmodule Enum</code> in</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule ExJsonSchema.Validator.Error do
  ...
  defmodule Enum do
    ...
  end
  ...
end
</code></pre>
<p>from being indexed as <code>Enum</code>, which hides the decompiled version from the standard library because source references are favored over decompiled versions when resolving references.</p>
</li>
<li>
<p>Reference Resolution</p>
<ul>
<li>
<p>Only favor same file Module resolutions if they are valid<br>
Invalid same file results can occur for prefix matches, but if only prefix matches are available, then a whole project search should occur instead of only when there are no same file <code>ResolveResult</code> of either validity.</p>
</li>
<li>
<p>Include library sources in <code>Module#multiResolveProject</code> <code>GlobalSearchScope</code><br>
Ensures that library sources can be returned, which are favored over decompiled libraries, so that <code>__using__</code> macros can be followed.</p>
</li>
<li>
<p>Protect from <code>Module</code> reference element not having a <code>VirtualFile</code> when checking if a test file.</p>
</li>
<li>
<p>Fix <code>QualifiableAliasImpl#fullyQualifiedName</code></p>
<ul>
<li>Include qualifier of <code>MultipleAliases</code><br>
In an <code>alias</code> line like <code>alias Myapp.MyContext.{Schema1, Schema2}</code>, <code>Schema1</code> would think its <code>fullyQualifiedName</code> was only <code>Schema1</code>, when it should included the <code>fullyQualifiedName</code> of the qualifier, <code>MyApp.MyContext</code> too. This leads to the correct <code>Schema1</code> fully-qualified name of <code>MyApp.MyContext.Schema1</code>.  This fix makes references to <code>Schema1</code> resolve to both the <code>alias</code> and the <code>defmodule</code>.</li>
<li>Include qualifier of <code>MultipleAliases</code> for deep aliases<br>
In an <code>alias</code> line like <code>alias Myapp.MyContext.{NestedContext1.Schema1, NestedContext2.Schema2}</code>, <code>Schema1</code> would think its <code>fullyQualifiedName</code> was only <code>NestedContext1.Schema1</code>, when it should included the <code>fullyQualifiedName</code> of the qualifier, <code>MyApp.MyContext</code> too.  This leads to the correct <code>Schema1</code> fully-qualified name of <code>MyApp.MyContext.NestedContext.Schema1</code>.  This fix makes references to <code>Schema1</code> resolve to both the <code>alias</code> and the <code>defmodule</code>.</li>
</ul>
</li>
<li>
<p>In LEEx Templates</p>
<ul>
<li>Don’t check for implicit imports at top of template file if there is a view file<br>
The implicit imports should come last, after the view file has been processed.</li>
<li>Ignore call definition clauses expressions that can’t contain an assign
<ul>
<li>Atom keywords (<code>false</code>, <code>true</code>, <code>nil</code>)</li>
<li>Maps</li>
<li>Structs</li>
<li>Keyword lists</li>
<li>Strings and charlists</li>
</ul>
</li>
<li>Don’t follow variables for assigns<br>
For now, don’t follow variables to look for assigns.</li>
<li>Fix finding assigns in <code>|&gt; case do ... end</code><br>
<code>None</code> calls were ignored, but when <code>case</code> is used in a pipeline it is a <code>None</code> since it has no literal arguments and only resolved arguments, so it was being ignored.</li>
<li>Ignore Lists and Aliases when resolving assigns</li>
<li>Fix resolve assigns in <code>if</code>s<br>
Only looked in <code>stab</code> of the <code>doBlock</code>, but the <code>else</code> is in the <code>blockList</code>.</li>
</ul>
</li>
<li>
<p>Don’t use the same path for actual aliases and defmodules when resolving aliases<br>
Prevents a case of an exact match and its namespace both being marked as valid (exact matches).</p>
</li>
<li>
<p>Types</p>
<ul>
<li>Don’t generate references for map key optionality (<code>required/1</code> and <code>optional/1</code>)</li>
<li>Don’t create a reference to <code>...</code> in lists in type specs.</li>
<li>Look above <code>ElixirStabBody</code> for <code>ancestorTypeSpec</code>.</li>
<li>Generate <code>Callable</code> reference for <code>unquote</code> in typespec instead of <code>Type</code> reference.</li>
</ul>
</li>
<li>
<p>Allow modular names to resolve to multiple modulars<br>
Fix <code>:systemd.ready()</code> not resolving because <code>:systemd</code> only exists as a decompiled file from source because it is Erlang and there is no preference given to different MIX_ENVs.  All MIX_ENV <code>defmodule :systemd</code> are returned for the <code>:systemd</code> and all of them are checked for <code>ready/0</code>.</p>
</li>
<li>
<p>Fix resolving qualified calls that are defined through use</p>
<p>Resolving qualified calls only used <code>Modular.callDefinitionClauseCallFoldWhile</code>, which ignores all non call definition, which means it ignored the <code>use</code>, but switching to use <code>org.elixir_lang.psi.scope.call_definition_clause.MultiResolve</code> <code>PsiScopeProcessor</code> used for unqualified calls, but starting on the modular call of the qualifier, all the <code>use</code> handling that works for unqualified calls also works for qualified calls now.</p>
<p>This fixes resolving <code>MyAppWeb.Endpoint.config_change(changed, removed)</code> in <code>MyApp.Application.config_change/3</code> because <code>use Phoenix.Endpoint, otp_app: :my_app</code> in <code>MyAppWeb.Endpoint</code> is now walked for qualified calls.</p>
</li>
<li>
<p>Fix resolving variables to parameters that are both pattern matched and defaulted</p>
<p>In functions like</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">def f(%Struct{} = s \\ %Struct{}) do
  s
end
</code></pre>
<p><code>s</code> in the body would not resolve to the <code>s</code> parameter because the default parameter had to be <code>PsiNamedElement</code>, that is a variable directly. Instead, recurse on any operand before the <code>\\</code> to support pattern matching too.</p>
</li>
<li>
<p>Use <code>keepProcessing()</code> in <code>MultiResolve.addToResolveResults</code> instead of specific return values</p>
<p>Fixes <code>def</code> in <code>def default_host_flag, do: "--host</code> resolving as an invalid match to <code>default_host_flag</code> instead of search the implicit imports for <code>defmacro def</code>.</p>
</li>
<li>
<p>The <code>nameIdentifier</code> for a <code>defdelegate</code> is the first argument, not the <code>as:</code><br>
The <code>as:</code> is the name in the <code>to:</code> module only.</p>
</li>
<li>
<p>Fix <code>defdelegate</code> <code>MultiResolve</code></p>
<ol>
<li>I had flipped the head name and <code>as</code> name for checking for a name match</li>
<li>I only counted the <code>defdelegate</code> as matching if the <code>as</code> name as found in <code>to</code> module, but if the head alone is prefixed by the name then the head should be a ResolveResult element even if the <code>to</code> or <code>as</code> can’t be found</li>
<li>Inside the <code>to</code>, I only checked if the children were call definition clauses, but this meant that all the <code>for</code> handling was ignored, so start a new <code>resolveResults()</code> for each modular.</li>
</ol>
</li>
<li>
<p>Fix <code>toModulars</code> not returning all modulars<br>
<code>fullyResolve</code> only touched the first modular.</p>
</li>
<li>
<p>Favor complete valid results over incomplete invalid earlier bindings for variables.</p>
</li>
<li>
<p>Ecto</p>
<ul>
<li>Don’t generate reference for <code>assoc/2</code> pseudo-function in <code>join(..., _ in assoc(_, _))</code></li>
</ul>
</li>
<li>
<p>Fix unaliasing multiple aliases<br>
<code>UnaliasName</code> still assumed that <code>fullyQualifiedName</code> included the qualifier, but it is just the lexical qualifier now.</p>
</li>
<li>
<p>Check for <code>MULTIPLE_ALIASES_QUALIFIER</code> in <code>ResolveState</code> for prefix matches.<br>
Fixes resolving <code>SSH.Key</code> to <code>Foo.SSH.Key</code> when the alias is <code>alias Foo.{SSH, ...}</code>.</p>
</li>
<li>
<p>Ignore type variables in type restrictions when resolving normal variables.</p>
</li>
<li>
<p>Fix <code>withSelf</code> for <code>childExpressions</code> <code>siblingExpressions</code> call<br>
While refactoring the walk, I copied the call for siblings, which shouldn’t included self.  Children should include self, or the first expression is missed which showed up as <code>Repo.transaction</code> not being found because <code>transaction</code> is the first <code>def</code> inside an <code>if</code> in <code>Ecto.Repo.__using__</code>'s <code>quote</code> block.</p>
</li>
<li>
<p>Don’t try to resolve keys/fields of a capture.</p>
</li>
<li>
<p>Don’t generate reference for <code>assoc</code> in <code>*join*: .. in assoc(..., ...)</code>.<br>
Already worked for <code>join/3</code> calls, extend to keyword syntax too.</p>
</li>
<li>
<p>Fix resolving references to <code>Modulars</code> when resolved is in BEAM file<br>
The check to see if the resolved was a modular only worked for source elements because it checked if it was a <code>Call</code>, but decompiled modules in BEAM files are <code>ModuleImpls</code>.</p>
</li>
<li>
<p>Fix logic error when ignored pinned variables as declaration sites</p>
<p>The logic was supposed to be that</p>
<ul>
<li>If it is pinned, keep searching</li>
<li>If it is not pinned, check the operation as a Call</li>
</ul>
<p>… but, the code was <code>operatorText != "^" &amp;&amp; execute(match as Call, state)</code> which meant that if the <code>operatorText</code> was <code>"^"</code>, then the whole expression was <code>false</code>, which meant <code>keepProcessing</code> was <code>false</code>, so any pin stopped the processing for other unpinned parameters after the pin in addition to processing in the outer scope of the pin.</p>
</li>
<li>
<p>Prefer source only for target candidates for Go To Declaration and not all ResolveResults.<br>
Ensures that functions only defined in decompiled Modules can be found because the Module’s ResolveResults include the decompiled Module in addition to the source ones.</p>
</li>
<li>
<p>Don’t prefer source over decompiled in <code>ResolveResultOrderedSet</code><br>
Preference is now handled in <code>Resolver</code>, so that source preference only happens on Go To Declaration and not for <code>multiResolve</code> because that needs decompiled Modulars for compile-time <code>for</code> loops that are too complex to infer.</p>
</li>
<li>
<p>Use primary arity instead of final for resolving Callables</p>
<p>Fixes <code>unquote</code> in <code>def unquote(...)() do</code> not resolving.</p>
</li>
</ul>
</li>
<li>
<p>Filter out decompiled private functions from completions<br>
If they are only available as decompiled functions, it is unlikely we have the source available to make them public, which was the reasoning to allow private functions at all.</p>
</li>
<li>
<p>Decompiling</p>
<ul>
<li>Include module name for “No decompiled source function” errors</li>
<li>Unquote <code>and</code> when not and/2<br>
Fixes decompiling <code>:hipe_arm_encode</code>.</li>
<li><code>unquote</code> <code>false</code> when decompiling.<br>
Fixes decompiling <code>:thrift_json_parser</code>. Add <code>true</code> to the <code>Unquote</code> list too since it would have the same issue.</li>
<li>Unquote <code>in</code> when not <code>in/2</code><br>
Fix decompiling <code>:digraph_utils</code></li>
<li>Use <code>containingFile.originalFile</code> for <code>resolve.Module.multiResolveProject</code><br>
Ensures <code>VirtualFile</code> is available for decompiled files.</li>
</ul>
</li>
<li>
<p>Performance</p>
<ul>
<li>
<p>Don’t use <code>.navigationElement</code> for <code>Variants</code></p>
<p>Using <code>navigationElement</code> forces parsing of the decompiled source, which isn’t necessary whe only showing the lookup string.</p>
</li>
<li>
<p>Remove <code>ModuleOwner</code> interface</p>
<ul>
<li><code>BeamFileImpl</code> is known to have only 1 module in it, so it makes the code more complicated to make it act like source files.</li>
<li>Don’t use <code>getChildrenByType</code>, as it causes the decompiled source to be parsed, which is slow and unnecessary since all the metadata for modules is available from the binary format.</li>
</ul>
</li>
<li>
<p>Get project from parent in decompiled Module and CallDefinition<br>
Not doing this causes an unnecessary parsing of the decompiled source.</p>
</li>
</ul>
</li>
<li>
<p>Fix infinite recursion in <code>ElixirVisitor#visitLiteralSigilLine</code></p>
</li>
<li>
<p>Show more scope for keyword key Go To Definition</p>
<ul>
<li>Always show the keyword pair, instead of just the keyword key, so that the value being assigned to the key can be seen before Go To.</li>
<li>Show the location at the path relative to the content root and the line number as <code>live_modal</code> may be used more than once in the same file.</li>
</ul>
</li>
<li>
<p>Put <code>entrance</code> as initial visited in <code>module.Variants</code>.</p>
</li>
<li>
<p>Check if <code>PsiElement</code> has been visited before walking <code>quote</code> and <code>__using__</code></p>
</li>
<li>
<p>Don’t mark qualified calls as unresolved in “Elixir References” inspection<br>
I don’t have a good approach for resolving struct fields or map keys for now, don’t mark them as unresolved as it clutters finding unresolved calls I expect to work.</p>
</li>
<li>
<p>Don’t assume <code>PsiFile#virtualFile</code> is <code>NotNull</code> in <code>PsiElement.moduleWithDependentsScope</code>.</p>
</li>
<li>
<p>Don’t assume <code>PsiFile#virtualFile</code> is <code>NotNull</code> in <code>AtNonNumericOperation.computeReference()</code>.</p>
</li>
<li>
<p><code>putInitialVisitedElement</code> in <code>variable.MultiResolve</code><br>
Fixes resolving variables through <code>use</code> statements for variables in the body of <code>defmodule</code> blocks.</p>
</li>
<li>
<p>Log when <code>VISITED_ELEMENT_SET</code> is <code>null</code> instead of erroring.</p>
</li>
<li>
<p>Fix <code>resolvePrimaryArity</code> for <code>|&gt; case do</code><br>
<code>resolvedPrimaryArity</code> did not add both the doBlock’s arity and the arity from the <code>|&gt;</code> at the same time.  If the pipe was there, the <code>do</code> was ignored because the pre-existing <code>resolvePrimaryArity</code> was not used if the normal primary arity of the call was zero, which is the case for <code>|&gt; case do</code>.</p>
</li>
<li>
<p>Find module for elements in libraries<br>
Elements in libraries don’t have a <code>Module</code> from <code>ModuleUtil.findModuleForPsiElement</code>, so scan the element’s project’s module’s content roots for the closest <code>Module</code> for libraries.</p>
</li>
<li>
<p><code>prependQualifiers</code> when typing an alias on a new line in the body of a function.</p>
</li>
<li>
<p>Don’t descend into <code>quote</code> blocks if the call being resolved is given to an <code>unquote</code> in the <code>quote</code> block.</p>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1967" rel="noopener nofollow ugc">#1967</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li><code>updateSinceUntilBuild</code> to prevent breaking in future IDEs.</li>
<li>Check if modules loaded before using <code>findModuleForPsiElement</code>.</li>
<li>Use <code>BasePlatformTestCase</code> instead of <code>LightCodeInsightTestCase</code> because <code>LightCodeInsightTestCase</code> is deprecated.</li>
</ul>
</li>
</ul>
<p><a href="https://github.com/KronicDeth/intellij-elixir/blob/v11.11.0/README.md#installation" rel="noopener nofollow ugc">Installation Instructions</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="217971" data-batch-url="/posts/batch_likers">
                        5
                      </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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/89">Post #88</a>
	                </div>
	            </div>
              <div id="likers-container-217971" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="217971"
                     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 #88"></div>
  </section>
</div>
    <div class="postbit" id="218741" data-post-id="218741">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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">
								<h1><a name="p-218741-version-11120-1" class="anchor" href="#p-218741-version-11120-1" aria-label="Heading link" rel="nofollow"></a>Version 11.12.0</h1>
<p><a href="https://github.com/sponsors/KronicDeth" rel="noopener nofollow ugc"><img src="https://forum.elixirforum.com/images/emoji/apple/heart.png?v=15" title=":heart:" class="emoji" alt=":heart:" loading="lazy" width="20" height="20"> Sponsor</a><br>
Historical One-time/Monthly Donations:</p>
<div class="md-table">
<table>
<thead>
<tr>
<th style="text-align:left">Stat</th>
<th style="text-align:right">Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Minimum</td>
<td style="text-align:right">$1.00</td>
</tr>
<tr>
<td style="text-align:left">Median</td>
<td style="text-align:right">$6.25</td>
</tr>
<tr>
<td style="text-align:left">Mean</td>
<td style="text-align:right">$12.52</td>
</tr>
<tr>
<td style="text-align:left">Maximum</td>
<td style="text-align:right">$200.00</td>
</tr>
</tbody>
</table>
</div><h1><a name="p-218741-thanks-2" class="anchor" href="#p-218741-thanks-2" aria-label="Heading link" rel="nofollow"></a>Thanks</h1>
<ul>
<li>For reporting that <code>CallDefinitionHead</code> could not be checked if it was decompiled.
<ul>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">@odk211</a>)</li>
</ul>
</li>
<li>For reporting that BEAM Chunks tab labels did not render.
<ul>
<li>Robin Hilliard (<a href="https://github.com/robinhilliard" rel="noopener nofollow ugc">@robinhilliard</a>)</li>
</ul>
</li>
<li>For reporting <code>EOFException</code> while reading chunks from <code>.beam</code> files that were incomplete.
<ul>
<li>Yordis Prieto (<a href="https://github.com/yordis" rel="noopener nofollow ugc">@yordis</a>)</li>
<li>Pradeep Kumar (<a href="https://github.com/pkgodara" rel="noopener nofollow ugc">@pkgodara</a>)</li>
<li>Ali Makki (<a href="https://github.com/alimakki" rel="noopener nofollow ugc">@alimakki</a>)</li>
<li>Clifton McIntosh (<a href="https://github.com/cliftonmcintosh" rel="noopener nofollow ugc">@cliftonmcintosh</a>)</li>
<li><a href="https://github.com/mudphilo" rel="noopener nofollow ugc">@mudphilo</a></li>
<li>Олег Дулецкий  (<a href="https://github.com/dog-64" rel="noopener nofollow ugc">@dog-64</a>)</li>
<li>Mithen Ji (<a href="https://github.com/mithenji" rel="noopener nofollow ugc">@mithenji</a>)</li>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">@odk211</a>)</li>
</ul>
</li>
<li>For posting a patch to fix an EEx bug
<ul>
<li>Alexandr Evstigneev (<a href="https://github.com/hurricup" rel="noopener nofollow ugc">@hurricup</a>)</li>
</ul>
</li>
<li>For posting missing <code>mix deps</code> options for determining dependency paths on disk.
<ul>
<li>Ian Mikhailov (<a href="https://github.com/yanmhlv" rel="noopener nofollow ugc">@yanmhlv</a>)</li>
<li>Simon McConnell  (<a href="https://github.com/simonmcconnell" rel="noopener nofollow ugc">@simonmcconnell</a>)</li>
</ul>
</li>
<li>For reporting that there was unhandled element types in <code>Type</code> scope processor and better error handling was necessary.
<ul>
<li>Donald Wilson (<a href="https://github.com/donaldww" rel="noopener nofollow ugc">@donaldww</a>)</li>
</ul>
</li>
<li>For reporting that MIssing SDK error was not helpful in Dialyzer Service.
<ul>
<li>Walter Weinmann (<a href="https://github.com/walter-weinmann" rel="noopener nofollow ugc">@walter-weinmann</a>)</li>
<li>Klaus Ferreira  (<a href="https://github.com/KlausEverWalkingDev" rel="noopener nofollow ugc">@KlausEverWalkingDev</a>)</li>
<li>Changyu Geng (<a href="https://github.com/KingMario" rel="noopener nofollow ugc">@KingMario</a>)</li>
<li><a href="https://github.com/snow-dev" rel="noopener nofollow ugc">@snow-dev</a></li>
<li><a href="https://github.com/marcel862" rel="noopener nofollow ugc">@marcel862</a></li>
<li>Ram Kumar (<a href="https://github.com/ramka001" rel="noopener nofollow ugc">@ramka001</a>)</li>
</ul>
</li>
<li>For reporting Stack Overflows in <code>Callable.annotate</code> due to improper tracking of modular children leading to looping when there is more than one <code>use</code>.
<ul>
<li><a href="https://github.com/ehayun" rel="noopener nofollow ugc">@ehayun</a></li>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">@odk211</a>)</li>
<li>Matt Pinkstron (<a href="https://github.com/mpinkston" rel="noopener nofollow ugc">@mpinkston</a>)</li>
<li>Sergey Snozyk (<a href="https://github.com/nmbrone" rel="noopener nofollow ugc">@nmbrone</a>)</li>
<li>Kevin Hagel (<a href="https://github.com/kevinhagel" rel="noopener nofollow ugc">@kevinhagel</a>)</li>
<li>Surya Teja Muthyala (<a href="https://github.com/suryatejamuthyala" rel="noopener nofollow ugc">@suryatejamuthyala</a>)</li>
<li>Simon McConnell  (<a href="https://github.com/simonmcconnell" rel="noopener nofollow ugc">@simonmcconnell</a>)</li>
<li>Daniil Nevdah (<a href="https://github.com/ndan" rel="noopener nofollow ugc">@ndan</a>)</li>
<li>Donald Wilson (<a href="https://github.com/donaldww" rel="noopener nofollow ugc">@donaldww</a>)</li>
<li>Walter Weinmann (<a href="https://github.com/walter-weinmann" rel="noopener nofollow ugc">@walter-weinmann</a>)</li>
<li>Moein (<a href="https://github.com/amoein" rel="noopener nofollow ugc">@amoein</a>)</li>
<li>Jonathan (JC) Chen (<a href="https://github.com/dijonkitchen" rel="noopener nofollow ugc">@dijonkitchen</a>)</li>
</ul>
</li>
<li>For pointing to <a href="https://github.com/gumi/yacto" rel="noopener nofollow ugc">Yacto</a> as a reproduction repository for a bunch of bugs
<ul>
<li>Tomoki Odaka (<a href="https://github.com/odk211" rel="noopener nofollow ugc">@odk211</a>)</li>
</ul>
</li>
</ul>
<h1><a name="p-218741-changelog-3" class="anchor" href="#p-218741-changelog-3" aria-label="Heading link" rel="nofollow"></a>Changelog</h1>
<h2><a name="p-218741-v11120-4" class="anchor" href="#p-218741-v11120-4" aria-label="Heading link" rel="nofollow"></a>v11.12.0</h2>
<h3><a name="p-218741-bug-fixes-5" class="anchor" href="#p-218741-bug-fixes-5" aria-label="Heading link" rel="nofollow"></a>Bug Fixes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1988" rel="noopener nofollow ugc">#1988</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Only descend into modular children of modular for Module scope.  Prevents recursion loops on use calls.</li>
<li>Don’t search for unquoted variable value variable is value for <code>do:</code>.</li>
<li>Protect from <code>IndexNotReady</code> in <code>resolver.Module.multiResolveProject</code>.</li>
<li>Stop walking unquoted variable that resolves to a parameter.</li>
<li>Walk case in <code>__using__</code> to find quote in any clause.  Fixes resolving test macro from <code>use PowerAssert</code></li>
<li>Resolve functions declared in <code>quote</code>’s scope when <code>block</code> injected with <code>unquote(block)</code>.<br>
Fixes resolving <code>field</code>, <code>timestamps</code>, and <code>index</code> in <code>schema</code> for <code>use Yacto.Schema</code> as it makes the <code>block</code> see the <code>import Yacto.Schema</code> above <code>unquote(block)</code> in the <code>quote</code> in <code>schema(..., do: block)</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1990" rel="noopener nofollow ugc">#1990</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Convert MissingSDK errors for Dialyzer into Notifications.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1993" rel="noopener nofollow ugc">#1993</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Log element in psi.scope.Type instead of using <code>TODO()</code><br>
Error will still be reported, but there will be enough information to triage and since <code>true</code> is returned now it won’t stop the type resolving from working.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1994" rel="noopener nofollow ugc">#1994</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Add missing mix deps options to non-path influencing list:
<ul>
<li>env</li>
<li>manager</li>
<li>repo</li>
<li>sparse</li>
<li>submodules</li>
<li>system_env</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1995" rel="noopener nofollow ugc">#1995</a> - <a href="https://github.com/hurricup" rel="noopener nofollow ugc">@hurricup</a>]
<ul>
<li>Fix incorrect <code>OuterElementType</code> in <code>eex.lexer.TemplateData</code>.<br>
The <code>EEX</code> <code>IElementType</code> needs to use <code>OuterLanguageElementType</code> instead of the direct <code>eex.psi.TokenType</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1996" rel="noopener nofollow ugc">#1996</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Run <code>QualifiedAlias#text</code> in <code>runReadAction</code> for <code>QualifiedAlias#name</code></li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1997" rel="noopener nofollow ugc">#1997</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Return <code>null</code> <code>Chunk</code> instead of throwing <code>IOException</code> when read incomplete.<br>
Incomplete reads happen often due to incomplete writes to the file system being read in. As such, they shouldn’t generate error reports and instead should be silently ignored.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1999" rel="noopener nofollow ugc">#1999</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Implement <code>beam.FileEditor#getFile</code> to fix <code>DeprecatedMethodException</code> as the default implementation is now deprecated and requires an explicit implementation.</li>
<li>Use <code>TabbedPaneWrapper.AsJBTabs</code> instead of <code>JBTabbedPane</code> for “BEAM Chunks” tabs.<br>
I’m not sure why <code>JBTabbedPane</code> stopped showing its labels sometime in the 2020.X IDE version series, but by debugging when “BEAM Chunks” name was retrieved I found that the bottom tabs used <code>TabbedPaneWrapper.asJBTabs</code>.  Using that, the labels reappeared.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2000" rel="noopener nofollow ugc">#2000</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Don’t require Alias qualifier to be a <code>PsiNamedElement</code>.<br>
It can be an <code>ElixirAtom</code> and getting the reference will still work.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2000" rel="noopener nofollow ugc">#2001</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li><code>Any.isDecompiled</code> for <code>CallDefinitionHead</code>.</li>
</ul>
</li>
</ul>
<h3><a name="p-218741-enhancements-6" class="anchor" href="#p-218741-enhancements-6" aria-label="Heading link" rel="nofollow"></a>Enhancements</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/1988" rel="noopener nofollow ugc">#1988</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>
<p>Find <code>Dep</code>s in function calls in the <code>deps()</code> list.</p>
</li>
<li>
<p><code>Dep.putPath</code> from a variable.</p>
</li>
<li>
<p>Treat <code>Memoize</code> <code>defmemo</code> as <code>def</code> and <code>defmemop</code> as <code>defp</code>.</p>
</li>
<li>
<p>Resolve <code>exception/1</code> and <code>message/1</code> to <code>defexception</code>.</p>
</li>
<li>
<p>Resolve to callbacks when searching in any module.</p>
</li>
<li>
<p>Support arity intervals for unquote_splicing in parameters</p>
<p>Functions defined with unquote_splicing, such as <code>Ecto.Schema.__schema/2</code>:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">for clauses &lt;- Ecto.Schema.__schema__(fields, field_sources, assocs, embeds),
    {args, body} &lt;- clauses do
  def __schema__(unquote_splicing(args)), do: unquote(body)
end
</code></pre>
<p>Need to have their arity not be the number of PsiElements in the parentheses.  Any call to <code>unquote_splicing(...)</code> can end up have 0 to infinite parameters, so it means when one is saw, the range of <code>minimum...maximum</code> should change to an open interval of <code>minimum...</code>.  This required changing <code>IntRange resolvedFinalArityChange()</code> to <code>ArityInterval resolvedFinalArityInterval()</code> on all <code>Call</code>s, which was a large change.  It also meant changing a lot of ArityRange types to ArityInterval, and NameArityRange to NameArityInterval, which influenced the variable names.</p>
<p>Since all Calls support ArityIntervals now and not just special forms and Ecto DSLs, exportArity is changed to always state the ResolveState, so that the special form changes can be integrated for all callers.</p>
<p>The actual implementation of CallImpl.resolvedFinalArityRange is changes to fold over the ArityInterval:</p>
<ul>
<li>Normal arguments increase the minimum and maximum.</li>
<li>Default arguments increase only the maximum.</li>
<li>unquote_splicing changes the maximum to null to indicate the interval is half open.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><a href="https://github.com/KronicDeth/intellij-elixir/blob/v11.12.0/README.md#installation" rel="noopener nofollow ugc">Installation Instructions</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="218741" data-batch-url="/posts/batch_likers">
                        7
                      </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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/90">Post #89</a>
	                </div>
	            </div>
              <div id="likers-container-218741" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="218741"
                     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 #89"></div>
  </section>
</div>
    <div class="postbit" id="221433" data-post-id="221433">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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">
								<h1><a name="p-221433-version-11130-1" class="anchor" href="#p-221433-version-11130-1" aria-label="Heading link" rel="nofollow"></a>Version 11.13.0</h1>
<p><a href="https://github.com/sponsors/KronicDeth" rel="noopener nofollow ugc"><img src="https://forum.elixirforum.com/images/emoji/apple/heart.png?v=15" title=":heart:" class="emoji" alt=":heart:" loading="lazy" width="20" height="20"> Sponsor</a></p>
<p>Historical One-time/Monthly Donations:</p>
<div class="md-table">
<table>
<thead>
<tr>
<th style="text-align:left">Stat</th>
<th style="text-align:right">Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Minimum</td>
<td style="text-align:right">$1.00</td>
</tr>
<tr>
<td style="text-align:left">Median</td>
<td style="text-align:right">$6.25</td>
</tr>
<tr>
<td style="text-align:left">Mean</td>
<td style="text-align:right">$12.52</td>
</tr>
<tr>
<td style="text-align:left">Maximum</td>
<td style="text-align:right">$200.00</td>
</tr>
</tbody>
</table>
</div><h1><a name="p-221433-changelog-2" class="anchor" href="#p-221433-changelog-2" aria-label="Heading link" rel="nofollow"></a>Changelog</h1>
<h2><a name="p-221433-v11130-3" class="anchor" href="#p-221433-v11130-3" aria-label="Heading link" rel="nofollow"></a>v11.13.0</h2>
<h3><a name="p-221433-bug-fixes-4" class="anchor" href="#p-221433-bug-fixes-4" aria-label="Heading link" rel="nofollow"></a>Bug Fixes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2035" rel="noopener nofollow ugc">#2035</a> - <a href="https://github.com/theqp" rel="noopener nofollow ugc">@theqp</a>
<ul>
<li>Remove bintray repositories.</li>
</ul>
</li>
</ul>
<h3><a name="p-221433-enhancements-5" class="anchor" href="#p-221433-enhancements-5" aria-label="Heading link" rel="nofollow"></a>Enhancements</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2035" rel="noopener nofollow ugc">#2035</a> - <a href="https://github.com/theqp" rel="noopener nofollow ugc">@theqp</a>
<ul>
<li>Update build to IntelliJ IDEA 2021.2.</li>
<li>Upgrade to Gradle 7.1.1.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2036" rel="noopener nofollow ugc">#2036</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Expand compatibility range to 2021.1.2-2021.2.</li>
</ul>
</li>
</ul>
<p><a href="https://github.com/KronicDeth/intellij-elixir/blob/v11.13.0/README.md#installation" rel="noopener nofollow ugc">Installation Instructions</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="221433" data-batch-url="/posts/batch_likers">
                        7
                      </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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/91">Post #90</a>
	                </div>
	            </div>
              <div id="likers-container-221433" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="221433"
                     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 #90"></div>
  </section>
</div>
    <div class="postbit" id="234228" data-post-id="234228">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KronicDeth" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KronicDeth/120/33300_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KronicDeth
                    <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">
								<h1><a name="p-234228-version-1200-1" class="anchor" href="#p-234228-version-1200-1" aria-label="Heading link" rel="nofollow"></a>Version 12.0.0</h1>
<p><a href="https://github.com/sponsors/KronicDeth" rel="noopener nofollow ugc"><img src="https://forum.elixirforum.com/images/emoji/apple/heart.png?v=15" title=":heart:" class="emoji" alt=":heart:" loading="lazy" width="20" height="20"> Sponsor</a></p>
<p>Historical One-time/Monthly Donations:</p>
<div class="md-table">
<table>
<thead>
<tr>
<th style="text-align:left">Stat</th>
<th style="text-align:right">Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Minimum</td>
<td style="text-align:right">$1.00</td>
</tr>
<tr>
<td style="text-align:left">Median</td>
<td style="text-align:right">$6.25</td>
</tr>
<tr>
<td style="text-align:left">Mean</td>
<td style="text-align:right">$12.52</td>
</tr>
<tr>
<td style="text-align:left">Maximum</td>
<td style="text-align:right">$200.00</td>
</tr>
</tbody>
</table>
</div><h1><a name="p-234228-changelog-2" class="anchor" href="#p-234228-changelog-2" aria-label="Heading link" rel="nofollow"></a>Changelog</h1>
<h2><a name="p-234228-v1200-3" class="anchor" href="#p-234228-v1200-3" aria-label="Heading link" rel="nofollow"></a>v12.0.0</h2>
<h3><a name="p-234228-breaking-changes-4" class="anchor" href="#p-234228-breaking-changes-4" aria-label="Heading link" rel="nofollow"></a>Breaking Changes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2179" rel="noopener nofollow ugc">#2179</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Drop support for Elixir &lt;= 1.6.<br>
Continuing support for Elixir &lt;= 1.6 required special handling of the language level to support differences in precedence and operators.  Removing the language level tracking allows dropping the <code>Level</code> and <code>FilePropertyPusher</code> classes and all their usages, including in the parser grammar and the special <code>ifVersion</code> external rule.  It also eliminates the need for tests to setup the SDK since it was only needed to get the appropriate Level.  This makes the tests run in 45 seconds instead of 7 minutes.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2339" rel="noopener nofollow ugc">#2339</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Remove code dependent on the Erlang plugin<br>
<a href="https://github.com/ignatov/intellij-erlang/issues/963#issuecomment-986261646" rel="noopener nofollow ugc">Erlang plugin is not 2021.3 compatible yet</a></li>
</ul>
</li>
</ul>
<h3><a name="p-234228-enhancements-5" class="anchor" href="#p-234228-enhancements-5" aria-label="Heading link" rel="nofollow"></a>Enhancements</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2179" rel="noopener nofollow ugc">#2179</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Resolve more calls and bindings in <code>Ecto.Query</code> calls
<ul>
<li>
<p>Resolve bindings in <code>Ecto.Query.lock/3</code></p>
</li>
<li>
<p>Resolve bindings in <code>Ecto.Query.windows/3</code></p>
</li>
<li>
<p>Walk <code>preload</code> binding and expression</p>
</li>
<li>
<p>Resolve in <code>update</code> for Ecto.Query</p>
</li>
<li>
<p>Resolve <code>fragment</code> in <code>with_cte</code></p>
</li>
<li>
<p>Resolve <code>binding</code> and <code>expr</code> in <code>Ecto.Query.dynamic/1-2</code></p>
</li>
<li>
<p>Resolve <code>field</code> in <code>join(..., on: field(..., ...) ...)</code><br>
For <code>join/5</code>, descend into the options to look for <code>on: value</code> and then walk <code>value</code> the same as the value to <code>having</code> or <code>where</code> in selects since they’re all boolean conditions.</p>
</li>
<li>
<p>Extract <code>ecto.query.Nested</code></p>
</li>
<li>
<p>Resolve <code>Ecto.Query.WindowAPI</code> functions</p>
</li>
<li>
<p>Resolve reference variable src in <code>join(query, ..., [{src, counter}], ..., ...)</code><br>
Tuple lists in join have two forms:</p>
<ol>
<li><code>{^assoc, a}</code></li>
<li><code>{src, counter}</code></li>
</ol>
<p>The pinned association form was already handled because the second element was checked for a declaration, but the first element was not, so <code>src</code> in (2) could not be resolved.</p>
</li>
<li>
<p><code>from([..] in ...)</code></p>
</li>
<li>
<p>Treat <code>or_having</code> the same as <code>having</code></p>
</li>
<li>
<p>Treat <code>or_where</code> the same as <code>where</code></p>
</li>
<li>
<p>Treat <code>having:</code> the same as <code>where:</code> in <code>from</code></p>
</li>
<li>
<p>Treat <code>select_merge</code> the same as <code>select</code> for resolving <code>Ecto.Query.API</code>.</p>
</li>
<li>
<p><code>from(..., [elements])</code></p>
</li>
<li>
<p>Resolve Ecto reference variables in <code>left in ...</code></p>
</li>
</ul>
</li>
<li><code>ModuleWalker</code> and <code>NameArityRangeWalker</code><br>
Reduce code by abstracting common pattern for walking library APIs.</li>
<li><code>ExUnit</code>
<ul>
<li>Find modules declared in <code>test</code>s.</li>
<li>Resolve call definitions inside <code>describe</code> blocks.</li>
<li>Resolve variables in <code>assert_receive</code> and <code>assert_received</code>.</li>
<li>Resolve <code>alias</code> to modules defined inside the enclosing <code>describe</code> block.</li>
<li>Walk <code>assert</code> expression for variable declarations
<ul>
<li>Check for earlier bindings of variables in right operand of <code>=</code> in <code>assert</code>.</li>
</ul>
</li>
</ul>
</li>
<li>Resolve <code>require</code> <code>as:</code> arguments as Aliases</li>
<li>Decompiler
<ul>
<li>Erlang
<ul>
<li>Decompile private Erlang functions</li>
<li>Decompile specs from Erlang DbgI</li>
<li>Decompile function bodies from Erlang DbgI
<ul>
<li>Escape “in” when an Erlang Var in type</li>
</ul>
</li>
<li>Decompile types from Erlang DbgI<br>
Fixes <span class="hashtag-raw">#2017</span></li>
</ul>
</li>
<li>Decompile Elixir function bodies using DbgI
<ul>
<li>:erlang./(a, b) → a / b</li>
<li>:erlang.*(a, b) → a * b</li>
<li>Convert :erlang.==(a,b) to a == b</li>
<li>Rewrite case to <code>and</code> when there is a badbool error too</li>
<li>Decompile %{<strong>struct</strong>: name, …} as %name{…}</li>
<li>Rewrite more :erlang functions to Elixir</li>
<li>Rewrite case to ||</li>
<li>Rewrite <code>case expr1 do pat1 -&gt; true; _ -&gt; false; end</code> to <code>match?(pat1, expr1)</code></li>
<li>Rewrite <code>if var do false else true</code> to <code>!var</code></li>
<li>Rewrite case to or</li>
<li>Rewrite case to and</li>
<li>Rewrite :erlang.error(E.exception(M)) to raise E, M</li>
<li>Rewrite case statements to if</li>
<li>Rewrite case statements to &amp;&amp;</li>
<li>Indent all lines of spec macro string in case it is multiple <a class="mention" href="/u/spec" rel="nofollow">@spec</a></li>
</ul>
</li>
</ul>
</li>
<li>Resolve module attributes defined outside the immediate modular lexical scope
<ul>
<li>
<p>Resolve module attributes registered in <code>elixir_module.erl</code> to decompiled source</p>
<ul>
<li>after_compile</li>
<li>before_compile</li>
<li>behaviour</li>
<li>compile</li>
<li>derive</li>
<li>dialyzer</li>
<li>external_resource</li>
<li>on_definition</li>
</ul>
</li>
<li>
<p>Index module attributes<br>
Use the index to resolve module attributes when it can’t be found directly by tree walking.</p>
<ul>
<li>Defined with <code>Module.put_attribute/3</code></li>
<li>Defined with <code>Module.register_attribute/3</code></li>
<li>Defined in <code>quote</code> blocks</li>
</ul>
</li>
</ul>
</li>
<li>Resolve variables to variables in any <code>quote</code> blocks<br>
If a variable can’t be resolved in the scope, try resolving it to any variable declared at the top-level of a <code>quote</code> block.  This helps with certain patterns of <code>quote</code> blocks used in Ecto where a variable’s declaration and usage are not in the same <code>quote</code> block.</li>
<li>Simplify CallDefinitionClause resolver for modulars<br>
Due to the addition of skipping if the entrance is a child call, the check for only following siblings is no longer needed.  Additionally, that check caused a bug because the <code>ElixirStabBody</code> skipped call definitions because they were new scopes.</li>
<li>Resolve functions declared with <code>Mix.Generator.embed_template</code> and <code>embed_text</code>.<br>
Also, new system for tracking resolves paths - <code>import</code>s, <code>defdelegate</code>, and <code>use</code> calls are added to the resolve results after the preferred elements are chosen for source in the same module.  This prevents only the <code>import</code> showing because the actual declaration is in another module or the SDK.</li>
<li>Record a call as visited in its <code>treeWalkUp</code> instead of requiring the caller to do it in the pass <code>ResolveState</code>
<ul>
<li>Record <code>quoteCall</code> as visited in <code>QuoteMacro.treeWalkUp</code></li>
<li>Record <code>unquoteCall</code> as visited in <code>Unquote.treeWalkUp</code></li>
<li>Record <code>unlessCall</code> as visited in <code>Unless.treeWalkUp</code></li>
<li>Record <code>ifCall</code> as visited in <code>If.treeWalkUp</code></li>
<li>Record <code>importCall</code> as visited in <code>Import.treeWalkUp</code></li>
<li>Record <code>useCall</code> as visited in <code>Use.treeWalkUp</code></li>
</ul>
</li>
<li>More macro specialized in Structure View
<ul>
<li><code>test</code></li>
<li><code>describe</code></li>
</ul>
</li>
<li>Resolve <code>Qualifer.unquote(variable)(...)</code> to any definition with correct arity in <code>Qualifier</code>.</li>
<li>Only calculate <code>element.resolvedFinalArity</code> once in <code>resolvedQualified</code></li>
<li>Implementations and Protocols
<ul>
<li>Redo icons</li>
<li>Implementations Go To Protocol line markers</li>
<li>Go to Super for calls to <code>defimpl</code> function/macro<br>
Goes to corresponding name/arity in the <code>defprotocol</code> that the <code>defimpl</code> implements.</li>
<li>Go to implementations line marker from defprotocol def</li>
<li>Go to implementations line marker from defprotocol</li>
<li>Go To Implementation from individual functions in defimpl</li>
<li>Go To Implementation from defimpl Alias</li>
<li>Resolve protocol function to <code>def</code> in defprotocol</li>
<li>Resolve defp inside of defimpl<br>
Process declarations inside of implementation the same as modules.</li>
</ul>
</li>
<li>Stop <code>prependQualifiers</code> at top of file</li>
<li>Walk the false and true (else) branch of unless in Modules or Quote</li>
<li>Walk the true and false (else) branch of if in Modules or Quote</li>
<li>Port <code>preferred</code> and <code>expand</code> system from <code>Callables</code> to <code>Modules</code>.</li>
<li>Update CI build dependencies</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2199" rel="noopener nofollow ugc">#2199</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Regression test for <a href="https://github.com/KronicDeth/intellij-elixir/issues/2198" rel="noopener nofollow ugc">#2198</a>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2201" rel="noopener nofollow ugc">#2201</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Use callbacks as completions for calls.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2223" rel="noopener nofollow ugc">#2223</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Decompiler
<ul>
<li>Don’t require <code>MacroNameArity</code> for <code>accept</code>, but use <code>NameArity</code> only because no decompiler cares about the macro.</li>
</ul>
</li>
<li>Tests for Code.Identifier and String.Tokenizer</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2226" rel="noopener nofollow ugc">#2226</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Structure View for <code>EEx.function_from_(file|string)</code></li>
<li>Variants (completion) for functions declared by special macros.
<ul>
<li>Functions defined by <code>EEx.function_from_(file|string)</code></li>
<li><code>exception/1</code> and <code>message/1</code> defined by <code>defexception</code></li>
<li><code>*_text/0</code> and <code>*_template(assigns)</code> functions defined by <code>Mix.Generator.embed_text</code> and <code>Mix.Generator.embed_template</code>.</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2334" rel="noopener nofollow ugc">#2334</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Internal Tool for BEAM Bulk Decompilation<br>
Decompile all .beam files in the project, modules and SDKs to check for errors in the generated Elixir code</li>
<li>Decompiler
<ul>
<li>Erlang Abst
<ul>
<li>Log decompilation errors</li>
</ul>
</li>
</ul>
</li>
<li>Error Reports
<ul>
<li>Include system information in error reports<br>
Instead of just including the plugin version, also include the Application name, edition, and version; and the Operation System name and version as these are common follow-up questions I have.</li>
<li>Remove tab at start of location for title of issues</li>
<li>Don’t include "java.lang.Throwable: " in title of issues<br>
The <code>Throwable</code> is necessary to get a stacktrace, but not a real error.</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2339" rel="noopener nofollow ugc">#2339</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Build against <code>2021.3</code></li>
<li><code>runPluginVerifier</code> in GitHub Actions
<ul>
<li>Update IDEA version range supports and verified</li>
<li>Fix reported compatibility warnings
<ul>
<li>Inline deprecated bundle messages</li>
<li>Don’t bundle built-in markdown plugin, depend on it instead</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3><a name="p-234228-bug-fixes-6" class="anchor" href="#p-234228-bug-fixes-6" aria-label="Heading link" rel="nofollow"></a>Bug Fixes</h3>
<ul>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2074" rel="noopener nofollow ugc">#2074</a> - <a href="https://github.com/Thau" rel="noopener nofollow ugc">@Thau</a>
<ul>
<li>Alternative function clause for <code>put_event</code> with <code>suite_finished</code></li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2179" rel="noopener nofollow ugc">#2179</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>StackOverflow fixes
<ul>
<li>
<p>getElementDescription(ElixirAtom, ElementDescriptionLocation)<br>
Override getElementDescription for atoms to prevent StackOverflow while looking for a provider.</p>
</li>
<li>
<p>Don’t descend into either branch of <code>if</code> or <code>unless</code> if entrance in either branch when resolving calls.<br>
If the definition were in one of the branch, it would already have been found on processing previous siblings in the <code>ElixirStabBody</code>.</p>
</li>
<li>
<p>Treat child of modulars as being at the same level if nested in <code>if</code> or <code>unless</code><br>
Prevents <code>test</code> in <code>if</code> in <code>supervisor_test.exs</code> in <code>ecto</code> from stack overflowing.</p>
</li>
<li>
<p>Fix StackOverflow when looking for earlier bindings in parameters.</p>
</li>
<li>
<p>Don’t check following siblings of modulars if entrance is a direct child</p>
<p>Prevent StackOverflow when trying to resolve embed_template when more than one appears in the same module.</p>
<p>In general, if the entrance is a child of modular then it can only be defined by a previous sibling, usually an <code>import</code> or <code>use</code>, but if the entrance is descendant of a child, then it child then it may be a call to a function or macro defined in the modular to following siblings of the entrance ancestor child needs to be checked if the entrance is a forward-call to a later declared function or macro.</p>
</li>
<li>
<p>Fix StackOverflowError in ifErlangRewriteTo<br>
Don’t rewriter :erlang.* to a different :erlang.*</p>
</li>
</ul>
</li>
<li>Adjust nameArityInterval in nameArityInAnyModule<br>
Ensures that <code>fragment/1..</code> used in a <code>quote</code> can resolve to one in <code>Ecto.Query.API</code>.</li>
<li>Resolve variable that are the only child of <code>quote</code><br>
Ecto loves doing <code>quote do: query</code> or other variable names in the code and tests, so record those as declarations to resolve as invalid results.</li>
<li>Find enclosing macro call when keyword <code>do:</code> is surrounded by parentheses<br>
Previously, only <code>quote do: variable</code> would work, but now <code>quote(do: variable)</code> also works to find the <code>quote</code> call.</li>
<li>Don’t mark fields and keys that are not expected to be resolvable yet as unresolvable in Elixir References inspection.
<ul>
<li><code>QualifiedBracketOperation</code> qualifier</li>
<li><code>StructOperation</code> qualifier</li>
<li>Expect qualified <code>unquote</code> to only have invalid results.</li>
<li>Don’t mark invalid only results for first chained function call.<br>
Don’t report <code>unquote(schema).__schema__(:source)</code></li>
<li>Don’t mark invalid only results for chained function calls.<br>
Don’t report <code>Mix.shell().yes?("Are you sure you want to drop the database for repo #{inspect repo}?") </code></li>
<li>Don’t mark invalid resolved function of call output</li>
<li>Don’t mark invalid resolved keys or fields of call output</li>
<li>Don’t mark invalid resolved function call on keys or fields</li>
<li>Don’t mark parentheses calls on variables if the call does not resolve.<br>
Can’t find exact valid resolves on variables yet.</li>
<li>Don’t mark keys or fields on the output of a function call.</li>
</ul>
</li>
<li>Fix some bugs with <code>Ecto.Query</code> calls.
<ul>
<li>Add missing <code>state.put(Query.Call, call)</code> for <code>join/3-4</code> <code>executeOnIn</code>.</li>
<li>Walk the operands of <code>|&gt;</code> in <code>select</code> expressions.</li>
<li>Resolve pinned variables as normal instead of as reference variables for Ecto.Query calls.</li>
<li>Don’t walk keywords that cannot declare reference variables.
<ul>
<li><code>hints</code></li>
<li><code>lock</code></li>
<li><code>intersect</code></li>
<li><code>intersect_all</code></li>
<li><code>except</code></li>
<li><code>except_all</code></li>
<li><code>union</code></li>
<li><code>union_all</code></li>
<li><code>prefix</code></li>
<li><code>preload</code></li>
<li><code>offset</code></li>
<li><code>windows</code></li>
<li><code>limit</code></li>
</ul>
</li>
<li>Don’t treat signature for call definition as use of Ecto macro</li>
</ul>
</li>
<li>Don’t generate references to aliases, functions, or types that don’t have declarations
<ul>
<li><code>assoc/2</code> in <code>join: .. in assoc(_, _)</code> in a no parentheses <code>from</code> call</li>
<li><code>var</code> in type restrictions<br>
Related to elixir-ecto/ecto#3756</li>
<li><code>BitString</code><br>
<code>BitString</code> is recognized in <code>defimpl ..., for: BitString</code> to define protocol implementations for <code>&lt;&lt;..&gt;&gt;</code>, but the <code>BitString</code> module itself does not exist, so can’t be resolved.</li>
</ul>
</li>
<li>Error reporting
<ul>
<li>Ignore <code>at com.intellij.openapi.diagnostic.Logger</code> when calculating location for error report titles</li>
<li>Improve error report format sent to GitHub</li>
<li>Fix the <code>event</code> <code>message</code> not being included, which meant that the excerpt wasn’t included, so no reproducibility or element class was available.</li>
<li>Filter stacktrace to stop at last line from the plugin to limit their size and improve chance of URL being short enough for GitHub.</li>
<li>Don’t include “What I was doing” section unless user actually fills in the additional information in the UI form.<br>
I’m sick of seeing the issue tracker full of “I don’t know what I was doing”, which is the default text when no additional info is given in the UI form.</li>
<li>Set title to the message at start of exception and first <code>at</code> that isn’t from the <code>errorreport.Logger</code> instead of <code>[auto-generated]</code> as this is the pattern I follow when renaming manually.</li>
</ul>
</li>
<li>Handle <code>alias __MODULE__.{...}</code> in prependQualifier<br>
Fixes <span class="hashtag-raw">#2153</span></li>
<li>Log error, but don’t fail with TODO() for unknown strippedQualifier or null qualifier<br>
Fixes <span class="hashtag-raw">#2153</span></li>
<li>Go To Declaration for captures
<ul>
<li>
<p>Don’t allow name to be acceptable named parent in <code>&amp;name/arity</code>.<br>
Resolves <span class="hashtag-raw">#488</span><br>
Allows Go To Declaration on <code>name</code> and not just on <code>/arity</code>.</p>
</li>
<li>
<p>Don’t allow <code>Mod.name</code> to be acceptable named parent in <code>&amp;Mod.name/arity</code>.<br>
Resolves <span class="hashtag-raw">#488</span><br>
Fixes <span class="hashtag-raw">#2101</span></p>
<p>Allows Go To Declaration on <code>name</code> and not just on <code>/arity</code>.</p>
</li>
<li>
<p>Resolve <code>&amp;name/arity</code> and <code>&amp;Mod.name/arity</code> using same code as callables.<br>
Fixes resolving &amp;Mod.name.arity and ensures that special handling for weird definitions for callables also apply to captures.</p>
</li>
</ul>
</li>
<li>Resolve <code>__MODULE__</code> in <code>quote</code> to <code>defmacro __MODULE__</code> in <code>Kernel.SpecialForms</code></li>
<li>Performance
<ul>
<li>
<p>Fix String.Unicode decompiled being PlainText instead of Elixir<br>
<code>String.Unicode</code> when decompiled using all information from <code>DbgI</code> was 161,171 lines long, which made the JetBrains API treat it as plain text instead of Elixir.  Being that long also made it freeze the UI while being decompiled.</p>
<p>Now, don’t even attempt to use the <code>DbgI</code> if the function has more than 10 clauses.</p>
</li>
<li>
<p>Don’t decompile private macros and functions if &gt; 500 definitions in one module.</p>
</li>
<li>
<p>If body cannot be decompiled, decompile as one-liner with <code>...</code> body</p>
</li>
<li>
<p>Don’t decompile Abst clause bodies that exceed 1024 bytes.</p>
</li>
<li>
<p>Decompile Erlang one clauses as Elixir one-liners</p>
</li>
</ul>
</li>
<li>Fix resolving type specs
<ul>
<li>
<p>Find <code>ancestorTypeSpec</code> for qualified type used in parentheses in anonymous function type in an alternation</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">@type run :: ((Ecto.Repo.t, changes) -&gt; {:ok | :error, any}) | {module, atom, [any]}
</code></pre>
</li>
<li>
<p>Resolve type parameters used in inline anonymous function types</p>
</li>
<li>
<p>Resolve callback heads to themselves when they have type restrictions using when</p>
</li>
<li>
<p>Ignore literal parameters</p>
<ul>
<li>Decimals</li>
<li>Aliases</li>
</ul>
</li>
<li>
<p>Check left operand of <code>\\</code> for type parameters as they could appear when copying def with defaults.</p>
</li>
</ul>
</li>
<li>putInitialVisitedElement in variable.Variants<br>
Fixes <span class="hashtag-raw">#2002</span></li>
<li>Walk <code>defdelegate</code>s when walking <code>import</code>s<br>
Fixes resolving <code>config</code> from <code>use Mix.Config</code> as it delegates to <code>Config</code></li>
<li>Resolve variables used in <code>match?</code> guards to pattern declaration<br>
Resolves <code>on_delete</code> in <code>match?(%{on_delete: on_delete} when on_delete != :nothing, reflection)</code></li>
<li>Implementations and Protocols
<ul>
<li>Fix calculating definition for stubs of defimpl with <code>for:</code><br>
There was no clause for defimpl being arity 3, which is the case when there is the (1) protocol (2) <code>for:</code> and (3) <code>do</code> block.  Not having a definition meant that the <code>defimpl protocol, for: struct do</code> would be in AllName index, but not ModularName.</li>
<li>Get name of enclosing modular for defimpl without <code>for:</code></li>
</ul>
</li>
<li>Store if stubs are guards</li>
<li>Decompiler
<ul>
<li>Surround <code>case</code> statements with parentheses when used in <code>cond</code> clause conditions</li>
<li>Convert OtpErlangString to OtpErlangList for tuple and call argument lists</li>
<li>Escape ESC character as \e</li>
<li>Handle Clause arguments being OtpErlangString</li>
<li>Handle tuple elements being an OtpErlangString</li>
<li>Add missing <code>.</code> after callee when it is a module or fn</li>
<li>Protect from <code>Macro.toString(macro)</code> StackOverflowError when decompiling body of function clauses</li>
<li>Don’t print function names as atoms in captures</li>
<li>Escape <code>\x</code> to <code>\\x</code> in OtpErlangStr</li>
<li>Fix rewrite of :erlang calls</li>
<li>Surround type unions with parentheses<br>
Prevents parsing problems with unions in guard (when) clauses</li>
<li>Don’t use <code>prependIndent</code> because it indents blank lines too.<br>
This doesn’t match <code>mix format</code> or the IntelliJ Elixir formatting.</li>
<li>Erlang
<ul>
<li>Escape fn Erlang variable</li>
<li>Escape Erlang char \ as \</li>
<li>Don’t append lines for clauses or <code>after</code> in Erlang <code>receive</code> when decompiling if empty.</li>
<li>Use <code>Infix</code>, <code>Prefix</code>, and <code>Unquote</code> decompolers for Erlang Abst chunk in addition to DbgI chunk
<ul>
<li>functions</li>
<li>typesepcs</li>
</ul>
</li>
<li>Use <code>function.macroNameArityMacro.macro</code> when decompiling Erlang Abst clauses.<br>
Don’t use <code>def</code> anymore when unexported and therefore private; use <code>defp</code> instead.</li>
<li>Remove space after <code>...</code> in decompiled private types.</li>
</ul>
</li>
</ul>
</li>
<li>Process imports for calls<br>
Imports were previously only processed inside of Modules and not in general, which means that imports in the file were not processed, which is needed for <code>association.ex</code> in Ecto.</li>
<li>Classify ..// as OTHER instead of NOT_CALLABLE, so that it is escaped as a key.</li>
<li>Fix Macro.ifCaptureModuleNameArity</li>
<li>Resolve variable to parameter in <code>%parameter{}</code> patterns for struct names</li>
<li><code>Unquote.treeWalkUpUnquoted</code> through tuples</li>
<li><code>Quote.treeWalkUp</code> through <code>case</code></li>
<li>Stop searching on numerical index in binding</li>
<li>Stop searching if atom in wrong place in binding<br>
Stops invalid binding test from erroring when resolving it.</li>
<li>Turn off <code>tailrec</code> because it doesn’t work correctly for <code>ElixirAccessExpression</code></li>
<li>Stop searching for qualifier when <code>ElixirUnqualifiedNoParenthesesManyArgumentsCall</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2199" rel="noopener nofollow ugc">#2199</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Stop highlighting types when <code>unquote_splicing/1</code> is reached.<br>
<code>unquote_splicing</code> is being used to splat arguments or fields of a struct into the type.  The arguments to <code>unquote_splicing</code> are normal calls or variables, not types.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2201" rel="noopener nofollow ugc">#2201</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Implement <code>call_definition_clause.Variants#executeOnCallback</code></li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2201" rel="noopener nofollow ugc">#2204</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li><code>CallDefinitionClause.time/1</code>
<ul>
<li>Mark guards as runtime.</li>
<li>Mark anything unknown as runtime too.</li>
<li>Log unknown calls.</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2207" rel="noopener nofollow ugc">#2207</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Check if <code>Call</code> <code>isValid</code> before using <code>containingFile</code> for <code>locationString</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2208" rel="noopener nofollow ugc">#2208</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Check if <code>project</code> is not dumb in <code>nameArityInAnyModule</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2209" rel="noopener nofollow ugc">#2209</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Take <code>resolveInScope</code> only if at least one valid<br>
Checking only for an empty collection allowed any prefixes in the scope to override exact matches in anywhere indexed, which meant that <code>Ecto</code> in <code>defmodule Ecto.Adapter do</code> resolved to itself instead of the exact <code>defmodule Ecto do</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2214" rel="noopener nofollow ugc">#2214</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>When regenerating the parser, <code>ElixirVisitor</code> is also regenerated.  When it was regenerated it lost the bug fix for <code>#visitLiteralSigileLine</code> calling itself.  Added a regression test, so that this can’t happen again.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2223" rel="noopener nofollow ugc">#2223</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Ecto
<ul>
<li>Walk keyword keys as right operand of <code>in</code> in <code>from</code></li>
</ul>
</li>
<li>Resolving type references
<ul>
<li>Walk struct operations for type parameters</li>
<li>Check keyword values for type parameters</li>
<li>Check operands of two operations for type parameters</li>
<li>Stop looking for type parameters on qualified or unqualified alias</li>
</ul>
</li>
<li>Decompiler
<ul>
<li>Only unquote <code>in</code> when an Erlang function, otherwise, use operators the same as Elixir for defs and calls.</li>
<li>Fix apply Erlang arguments, so that they are inside <code>[]</code>.</li>
<li>Quote keyword keys containing <code>-</code><br>
Fixes decompiling of <code>Elixir.Phoenix.HTML.Tag.beam</code></li>
<li>Use apply with escaped atom when Erlang function call is an Elixir operator</li>
</ul>
</li>
<li>Port String.Tokenizer.tokenize for use in Identifier.inspectAsKey<br>
I was putting off porting all of <code>Identifer.inspectAsKey</code> by adding special cases as needed, but the decompiler kept having bugs, so port all of it including <code>String.Tokenizer.tokenize</code>.  It will also work for unicode characters now too.</li>
<li>Resolve calls that are unquoted values to search for quote blocks in those functions.</li>
<li>Stop looking for qualifiers to prepend when reaching <code>=&gt;</code></li>
<li>The parent argument to AccumulatorContinue.childExpressionsFoldWhile should be this and not parent<br>
When converting to an extension function I left <code>parent</code> in place because the argument is called <code>parent</code>, but since it is an extension function that value because <code>this.parent</code> when it really should have been <code>this</code>.  Using <code>this.parent</code> meant it would ask for the parent’s children and keep looping back to <code>this</code>.</li>
<li>Don’t use <code>tailrec</code> in function with any body-recursion.<br>
It causes issues with <code>ElixirAccessExpression</code> recursion sometimes.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2226" rel="noopener nofollow ugc">#2226</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Implement completion for functions declared with <code>defdelegate</code>.</li>
<li>Fix <code>LookupElementPresentation.putItemPresentation</code> <code>addTailText</code>.<br>
Only append suffix of <code>presentableText</code> if it is prefixed by <code>itemText</code>.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2334" rel="noopener nofollow ugc">#2334</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Decompiler
<ul>
<li>Elixir
<ul>
<li>Decompile local function calls in Elixir DbgI using inspectAsFunction<br>
While remote calls used <code>inspectAsFunction</code>, local calls just used the <code>atomValue</code>,  which meant names that needed to be unquoted weren’t and caused parsing errors.</li>
</ul>
</li>
<li>Erlang Abst
<ul>
<li>Decompile Erlang Abst string with OtpErlangList as strings with non-ASCII codepoints<br>
Fixes unknown string format in <code>idna.beam</code></li>
<li>Always group for comprehensions in sequence even if there is only 1 element<br>
Some forms of <code>for</code> comprehensions cannot be used as the sole argument of a call unless surrounded by parentheses, so always add those parentheses.</li>
<li>Decompile Erlang Abst record empty record fields as <code>[]</code> for updates</li>
<li>Decompile Erlang Abst <code>left xor right</code> as <code>:erlang.xor(left, right)</code><br>
Elixir does not have a logical xor infix operator, so have to decompile as normal function call</li>
<li>Decompile Erlang Abst named anonymous function as a macro<br>
Named anonymous functions are support in Erlang, but not Elixir, so fake it as a macro when decompiling.</li>
<li>Add builtin-types for Erlang Abst
<ul>
<li><code>bitstring</code></li>
<li><code>float</code></li>
<li><code>nonempty_improper_list</code></li>
<li><code>nonempty_maybe_improper_list</code></li>
</ul>
</li>
<li>Decompile tagged atoms and other complex expression as function name in Abst capture</li>
<li>Decompile Erlang Abst <code>float</code></li>
<li>Decompile Erlang Abst <code>begin</code> blocks as parenthesized groups separated by ;</li>
<li>Decompile empty OtpErlangList as “” in Erlang Abst <code>string</code></li>
<li>Track if decompiled Erlang Abst contains do blocks so that they can be surrounded by parentheses when necessary</li>
<li>Fix decompiling Erlang Abst <code>record_index</code> when record name needs to be unquoted</li>
<li>Decompile <code>map</code> updates in Erlang Abst</li>
<li>Erlang Abst Function capture names are OtpErlangAtom and not tagged Atoms</li>
<li>Inspect local function names as atoms instead of as functions when apply/3 is used for operations and unquoted in Erlang Abst<br>
Stops <code>:unquote(:"NAME")</code> from happening</li>
<li>Surround anonymous function definitions that are called immediately with parentheses and call arguments with .( in Erlang Abst</li>
<li>Decompile <code>field_type</code> in Erlang Abst<br>
Fixes decompiling <code>hipe_icode_call_elim.beam</code></li>
<li>Inspect type name usages as local functions to ensure invalid names are unquoted</li>
<li>Inspect type names as local functions to ensure invalid names are unquoted</li>
</ul>
</li>
</ul>
</li>
<li>References
<ul>
<li>Stop looking for qualifiers to prepend when exiting interpolation</li>
<li>Don’t safeMultiResolve null call.reference in resolvesToModularName</li>
</ul>
</li>
<li>Types
<ul>
<li>Fix highlighting types declared with unquote and no secondary parentheses</li>
</ul>
</li>
<li>Performance
<ul>
<li>Don’t error if a private function mirror cannot be found<br>
Private functions are not decompiled if there are too many public functions.</li>
<li>Fix CallDefinitionImpl.isExported<br>
Used to be hard-coded to return <code>true</code>, but this pre-dated decompiling private functions.  Now with decompiling private functions, isExported needs to defer to the <code>Definition</code> and count as unexported if a private function, macro, or guard.</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2337" rel="noopener nofollow ugc">#2337</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Walk map constructin arguments, associatons, and variables when resolving type parameters.</li>
</ul>
</li>
<li><a href="https://github.com/KronicDeth/intellij-elixir/pull/2339" rel="noopener nofollow ugc">#2339</a> - <a href="https://github.com/KronicDeth" rel="noopener nofollow ugc">@KronicDeth</a>
<ul>
<li>Don’t use <code>PluginId.findId</code> that doesn’t exist in 2021.1.X</li>
</ul>
</li>
</ul>
<p><a href="https://github.com/KronicDeth/intellij-elixir/blob/v12.0.0/README.md#installation" rel="noopener nofollow ugc">Installation Instructions</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="234228" data-batch-url="/posts/batch_likers">
                        9
                      </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/intellij-elixir-elixir-plugin-for-jetbrains-intellij-platform/1697/92">Post #91</a>
	                </div>
	            </div>
              <div id="likers-container-234228" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="234228"
                     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 #91"></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/1697/load_more?page=10">Load more posts (20 remaining)</a>
</div></template></turbo-stream>