Keep up the good work Luke! oc
On Monday, September 5, 2016 at 7:15:15 PM UTC-4, Luke Imhoff wrote: > > Thanks > > - Thanks to @gremlinLee <https://github.com/gremlinLee>, Huy Hoang ( > @huyh <https://github.com/huyh>) , Ratan Paul (@RatanPaul > <https://github.com/RatanPaul>) and @anehing > <https://github.com/anehing> for reporting NoSuchMethod errors on > GeneratedParserUtilBase, which motivated me to actually ask JetBrains > > <https://intellij-support.jetbrains.com/hc/en-us/community/posts/207852029-Some-users-of-my-plugin-get-java-lang-NoSuchMethodError-com-intellij-lang-parser-GeneratedParserUtilBase-enter-section-> > how > to fix the problem, where Yann Cébron (@YannCebron > <https://github.com/YannCebron>) > - Thanks to Alexander Merkulov (@merqlove <https://github.com/merqlove>) > for opening an issue that Go To Definition didn't work for aliases as > before that the issue was just in my head. Go To Definition (and > completion) for Aliased ended up being the primary feature of this > release, > so thanks Alexander. > - Thanks to Josué Henrique Ferreira da Silva (@josuehenrique > <https://github.com/josuehenrique>) for reporting that Go To Symbol > broke on schema metaprogramming in Ecto, which led to support for > looking outside Enum.map functions for enclosing modulars. > - Thanks to Robin Hilliard (@robinhilliard > <https://github.com/robinhilliard>) for reporting that unquoting of > literal variables (unquote({name, [], nil}) in type specs was broken > - Thanks to Max Baumann (@dudeman <https://github.com/dudeman>) for > reproduction case inDBConnection.Connection.sync_stop/4 for variable > resolution not working for pinned variable inreceive clauses. > - Thanks to Filip Haglund (@drathier <https://github.com/drathier>), > Gerard de Brieder (@smeevil <https://github.com/smeevil>), Markus > Fischer (@mfn <https://github.com/mfn>) and Alexander Tovstonozhenko ( > @alextov <https://github.com/alextov>) for let me know that users > wanted to be able to turn off Module directive (alias, import, require > , user) folding. > - Thanks to Halil Özgür (@halilim <https://github.com/halilim>) excellent > reproduction case > > <https://github.com/KronicDeth/intellij-elixir/issues/367#issuecomment-244214975> > for > revealing the reason for mystery isParameter errors. > > Changelogv4.3.0Enhancements > > - #387 <https://github.com/KronicDeth/intellij-elixir/pull/387> - > Resolve aliased modules to their alias call, from the alias call, you > can Go To Declaration for the module itself. - @KronicDeth > <https://github.com/KronicDeth> > - Code structure > - Module resolution uses the OpenAPI convention of treeWalkUp now > instead of custom code. > - Resolvable names has been extracted to its own class > - Resolution use cases > - Suffix resolves to alias Prefix.Suffix > - Suffix.Nested resolves to alias Prefix.Suffix > - As resolves toalias Prefix.Suffix, as: As` > - NestedSuffix resolves to alias __MODULE__.NestedSuffix > - #389 <https://github.com/KronicDeth/intellij-elixir/pull/389> - > Completion for module aliases - @KronicDeth > <https://github.com/KronicDeth> > - From in-file aliases > - __MODULE__ > - In project modules (using index already used for Go To > Declaration) > - #393 <https://github.com/KronicDeth/intellij-elixir/pull/393> - In > addition to StubBased#canonicalName, there now also > StubBased#canonicalNames, for when a call defines multiple canonical > names, as is the case for defimpl <PROTOCOL>, for: [<TYPE>, ...]. - > @KronicDeth <https://github.com/KronicDeth> > - #397 <https://github.com/KronicDeth/intellij-elixir/pull/397> - When > a aliased name is added to the module list for completion, it's unaliased > name is searched for in the AllName index, if any nested modules are > found for the unaliased name, then those nested names are aliased and also > shown for completion. - @KronicDeth <https://github.com/KronicDeth> > - #399 <https://github.com/KronicDeth/intellij-elixir/pull/399> - > resolvableName allows nested modules under multiple aliases to be > completed. -@KronicDeth <https://github.com/KronicDeth> > - #403 <https://github.com/KronicDeth/intellij-elixir/pull/403> - By > user request, the folding will be off-by-default now, but can be > re-enabled, like the old behavior by checking the checkbox in Preferences > > > Editor > General > Code Folding > Elixir Module directive (alias, > import, require or use) groups. - @KronicDeth > <https://github.com/KronicDeth> > - #405 <https://github.com/KronicDeth/intellij-elixir/pull/405> - > @KronicDeth <https://github.com/KronicDeth> > - Resolve as: aliased name to both alias and defmodule > - Complete modules nested under as: aliased name. > - #409 <https://github.com/KronicDeth/intellij-elixir/pull/409> - > @KronicDeth <https://github.com/KronicDeth> > - Completion and reference tests for aliases: > - alias Prefix.Suffix > - alias Prefix.Suffix, as: As > - alias Prefix.{MultipleAliasA, MultipleAliasB} > > Bug Fixes > > - #393 <https://github.com/KronicDeth/intellij-elixir/pull/393> - > @KronicDeth <https://github.com/KronicDeth> > - defimpl <PROTOCOL>, for: [<TYPE>, ...] generates multiple > canonical names, which are stored in the stub index. > - When retrieved from the AllName index, the defimpl's > Implementation will render as if only the defimpl <PROTOCOL>, > for: <TYPE> was used for the <TYPE> matching the lookup name in > the Goto Symbol dialog. For example, if you search for Tuple, > JSX.Encoder.Tuple will match for defimpl JSX.Encoder, for: for: > [Tuple, PID, Port, Reference, Function, Any] > > <https://github.com/talentdeficit/exjsx/blob/master/lib/jsx.ex#L152-L155> > . > - #400 <https://github.com/KronicDeth/intellij-elixir/pull/400> - > @KronicDeth <https://github.com/KronicDeth> > - Look outside Enum.map for enclosing macro call because Ecto defines > the clauses of__schema__(:type, ...) using Enum.map, but > enclosingMacroCall only knews to jump over enclosing macros like for, > so a special case was added for anonymous function given toEnum.map. > - Fix if-else-ordering bug where Call appeared before operations > (which are usuallyCalls) like Match. > - #401 <https://github.com/KronicDeth/intellij-elixir/pull/401> - In @type > unquote({name, nil, []}) :: foo, name will be highlighted as a type > parameter even though it is not strictly the name that will appear as a > type parameter. - @KronicDeth <https://github.com/KronicDeth> > - #405 <https://github.com/KronicDeth/intellij-elixir/pull/405> - > @KronicDeth <https://github.com/KronicDeth> > - Resolve alias nested under aliased modules to both the alias and > defmodule, as resolving to only the alias loses the nested name, so > it wasn't possible to jump to the nested name's defmodule. > - Resolve aliased name to both the alias and the defmodule, so you > can skip jumping to the alias before jumping to the defmodule. > - #406 <https://github.com/KronicDeth/intellij-elixir/pull/406> - > @KronicDeth <https://github.com/KronicDeth> > - The generated ElixirParser uses the GeneratedParserUtilBase from > com.intellij.lang.parser, but since that version is a synced copy, > it is a snapshot ofGeneratedParserUtilBase from the version of > GrammarKit that was current when the IDE was released. To ensure the > generated parser works on all the IDEs, I copy > GeneratedParserUtilBase from org.intellij.grammar.parser into > org.elixir_lang.grammar.parser and then use that version in > ElixirParser. This ensures neither the IDE's version nor the > version in any installed GrammarKit plugin is used. > - #409 <https://github.com/KronicDeth/intellij-elixir/pull/409> - > @KronicDeth <https://github.com/KronicDeth> > - Check that index name maps to an actual project element before > returning it for completion as the names from > StubIndex.getInstance.getAllKeys(...) is a superset of actual keys > in the actual project according to Peter Gromov of JetBrains > > <https://intellij-support.jetbrains.com/hc/en-us/community/posts/207930789-StubIndex-persisting-between-test-runs-leading-to-incorrect-completions> > . > - Don't index canonicalName if it matches the literal name, as the > duplicate name leads to duplicate entries in the completion lookup. > - canonicalNameCollection was renamed to canonicalNameSet (with > type changing fromCollection<String> to Set<String> to match) to > emphasize that the canonical names should be unique, but > canonicalNameSet itself should still include duplicates of name > for those places where only canonical names are used. > - Use resolvableName for the unaliasedName for MultipleAliases Aliases, > so that they complete correctly for nested modules. > - Completion for nested modules will no longer complete with string > suffixes (i.e. SSHView) and only complete nested Aliases (i.e. > SSH.Key). > > README ChangesCompletionAliases and Modules > > When you start typing an Alias, completion will look in three locations: > > 1. alias aliased names in the current file a. Suffix for alias > Prefix.Suffix b. MultipleAliasA orMultipleAliasB for alias > Prefix.{MultipleAliasA, MultipleAliasB} c. As for alias Prefix.Suffix, > as: As > 2. Indexed module names (as available from Go To Symbol > > <https://github.com/KronicDeth/intellij-elixir/releases/tag/v4.3.0#go-to-symbol>) > > a. Prefix.Suffix from defmodule Prefix.Suffix b. MyProtocol from > defprotocol > MyProtocol c. MyProtocol.MyStruct i. defimpl MyProtocol, for: MyStruct > ii. defimpl MyProtocol nested under defmodule MyStruct > 3. Nested modules under aliased names a. Suffix.Nested for alias > Prefix.Suffix wherePrefix.Suffix.Nested is an indexed module, > implementation or protocol name. b.MultipleAliasA.Nested for alias > Prefix.{MultipleAliasA, MultipleAliasB} where > Prefix.MultipleAliasA.Nested alias Prefix.{MultipleAliasA, > MultipleAliasB} is an indexed module, implementation or protocol name. > c. As.Nested for alias Prefix.Suffix, as: Aswhere Prefix.Suffix.Nested is > an indexed module, implementation, or protocol name. > > Go To Declaration > > Go To Declaration is a feature of JetBrains IDEs that allows you to jump > from the usage of a symbol, such as a Module > Alias, to its declaration, such as the defmodule call. > Alias > > 1. Place the cursor over an Alias with an aliased name setup by alias > a. Suffix if alias Prefix.Suffix called b. MultipleAliasA if alias > Prefix.{MultipleAliasA, MultipleAliasB} called c. As if alias > Prefix.Suffix, as: As > 2. Activate the Go To Declaration action with one of the following: a. > Cmd+B b. Select Navigate > Declaration from the menu. c. Cmd+Click > 3. A Go To Declaration lookup menu will appear, allowing you to jump > either the alias that setup the aliased name or jumping directly to > defmodule of the unaliased name. Select which declaration you want a. > Use arrow keys to select and hit Enter b. Click > > Module > > 1. Place the cursor over a fully-qualified Alias a. A.B in A.B.func() > b. A.B in alias A.B c. B inalias A.{B, C} > 2. Activate the Go To Declaration action with one of the following: a. > Cmd+B b. Select Navigate > Declaration from the menu. c. Cmd+Click > > If you hold Cmd and hover over the Alias before clicking, the target > declaration will be shown. > > *Installation* > > > - From Github > 1. Go to > https://github.com/KronicDeth/intellij-elixir/releases/tag/v4.3.0 > 2. Download intellij-elixir.zip > 3. Open your JetBrains IDE of choice (Rubymine, IntelliJ IDEA, etc) > 4. Preferences > Plugins > 5. Click Install plugin from disk > 6. Select intellij-elixir.zip > 7. Restart your IDE > - From Plugin browser in Jetbrains IDE > - Open your JetBrains IDE of choice (Rubymine, IntelliJ IDEA, etc) > - Preferences > Plugins > - Click Browse Repositories > - Type Elixir in the search > - Install the plugin > - Restart your IDE > > -- You received this message because you are subscribed to the Google Groups "elixir-lang-talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-talk/f155244e-9877-4184-8136-e86a0c465d9a%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
