Skip to content

Latest commit

 

History

History
1512 lines (1372 loc) · 145 KB

CHANGELOG.md

File metadata and controls

1512 lines (1372 loc) · 145 KB

Table of Contents generated with DocToc

Changelog

v6.5.1

Bug Fixes

  • #904 - Don't do project instanceOf MockProjectEx because not all IDEs, such as Rider, ship with MockProjectEx; instead, do a Class#getCanonicalName() check. - @KronicDeth

v6.5.0

Enhancements

  • #898 - @KronicDeth
    • Update Build Matrix
      • Only include IDEA versions within the last year. Prior versions are supported, but not tested. It is up to users stuck on older versions to report incompatibilities and then I'm specifically fix those bugs.
        • Add 2017.2
        • Drop 2016.1.4
      • Only include Elixir versions within the last year. Prior versions are supported, but not tested. It is up to users stuck on older versions to report incompatibilities and then I'm specifically fix those bugs.
        • Add 1.5.2
        • Drop 1.3.4
      • Only include OTP versions within the last year. Prior versions are supported, but not tested. It is up to users stuck on older versions to report incompatibilities and then I'm specifically fix those bugs.
        • Add 20.1
        • Drop 18.3
    • Support not in grammar added by elixir-lang/elixir#5620 shipped with Elixir 1.5.
    • Don't treat numeric operands to @ and unary operators as separate operations from non-numeric operands to port elixir-lang/elixir@9747e58db773c716c01c210642ec1d91475e0c83 that shipped with Elixir 1.5.0. This only kicks in if the Elixir SDK is version >= 1.5.0 or not set. With an earlier SDK, you'll get the earlier behavior.

Bug Fixes

  • #898 - Make binary infix vs unary prefix +/- handling more robust to support one(two, - three) used in Elixir 1.5 enum.ex. - @KronicDeth
  • #901 - Call withCharSet(Charsets.UTF_8) on all GeneralCommandLines to prevent encoding errors on Windows. - @KronicDeth

v6.4.0

Enhancements

Bug Fixes

  • #861 - @KronicDeth.
    • Quote - in addition to # in Unquoted MacroNameArity decompiler.
    • Quote - in decompiled module names.
  • #862 - Wrap call definitions with name nil as unquote(:nil) in the decompiler. - @KronicDeth
  • #884 - Application#runWriteAction MUST be run from EventDispatch thread. This is true when run from a Run Configuration runner, but when the Credo annotator runs runWriteAction, it's not in an EventDispatch thread, so followed IntelliJ Platform SDK DevGuide - General Threading Rules and wrapped the runWriteAction in Application#invokeAndWait. - @KronicDeth
  • #885 - Wrap sdkModificator::commitChanges in invokeAndWait runWriteAction in MixRunningStateUtil#updateRoots. - @KronicDeth
  • #886 - @KronicDeth
    • Generalize what needs to be double quoted for Unquoted decompiler

      • Aliases and special forms are bare atoms
      • Anything that is NEITHER an identifier NOR a prefix operator is a double quoted atom.

      Normal identifiers and prefix operators then fall through to the Default decompiler.

  • #887 - Add end to Unquoted decompiler bare atoms. - @KronicDeth
  • #888 - Replace asserts in Credo external annotator with extended log messages that record the unexpected line. - @KronicDeth

v6.3.0

Enhancements

  • #854 - @KronicDeth
    • credo external annotator
      • Once modifications have settled on a file and all internal annotators have run, mix credo will be run on any modified file.
        • Each check failure reported by mix credo will be turned into a warning annotation (yellow highlight) of the line or line and column credo identified.
        • If you hover over the annotation (either in the source or on right gutter), the mix credo PATH:LINE(:COLUMN) explanation will be shown. Links in the tooltip are clickable and allow you to jump to the specific line or line and column of the failure.
  • #856 - @KronicDeth
    • Explain Rich vs Small IDEs more
    • Add feature support table for Rich vs Small IDEs with links to alternatives for Rich IDEs features not in Small IDEs.
    • Reorder Project subsections based on usage.

Bug Fixes

  • #854 - Rename package with typo org.elixir_lang.annonator -> org.elixir_lang.annotator. - @KronicDeth
  • #855 - @KronicDeth
    • Change error to say mix, elixir, or erlang path is not set instead of just mix path.
    • Rewrite of MixRunningStateUtil#setElixir to support calling erl directly in IntelliJ IDEA added a check that sdk type was the Elixir SDK Type, but there was no else clauses to handle that there IS an SDK, but its NOT Elixir, which is the common case on all Small IDEs (like Rubymine). To fill this gap, if the SDK is not Elixir and a Small IDE is detected, then the SDK Home from Preferences > Other Settings > Elixir External Tools > Elixir SDK > Path will be used to get the absolute path to the elixir (or elixir.bat executable and set it in the GeneralCommandLine.
  • #856 - @KronicDeth
    • Add missing ** for bold.
    • Document alternative setup in Small IDEs
    • Put Import from external model first in Project subsections, so that people are more likely to import as a mix project correctly.

v6.2.0

Enhancements

  • #817 - * Add note to README that atom module names should be prefixed with : - @merqlove
  • #827 - @KronicDeth
    • Elixir SDK will now have an Internal Erlang SDK, which can be supplied one of two ways:

      1. If intellij-erlang is installed: its Erlang SDK can be used
      2. Otherwise: the Erlang SDK for Elixir SDK from this plugin can be used

      Either Internal Erlang SDK's home path is used to locate the erl (or erl.exe on Windows) executable and it is used to run Elixir; bypassing the elixir (or elixir.bat on Windows) script. Instead, as was done in #789, the ebin directories for the Elixir SDK are passed as -pa options to erl.

      The Elixir SDK's configuration becomes more important: the classpath entries are now the list of ebin directories to pass to erl using -pa instead of scanning for ebins in the homepath, so additional code paths can be added to the Classpaths configuration and they will be used when running mix and mix test. The classpaths will be initialized to the ebin directories under the home path.

      • To support migrating from earlier version of the plugin, an SDK will be updated when it is used for Mix ExUnit Run Configurations
        • The default Internal Erlang SDK will be set, which uses the latest version of Erlang that can be found on the system. When intellij-erlang is installed, intellij-elixir's Erlang version suggestion is still used because intellij-elixir favors the latest version while intellij-erlang favors the first found, which is usually the oldest version.
        • Update roots (class path, source paths, documentation paths):
          • Class path of HOMEPATH/lib is replaced with HOMEPATH/lib/APP/ebin.
          • Source path of HOMEPATH/lib is replaced with HOMEPATH/lib/APP/lib IF it exists (so only for source SDKs)
          • Documentation of http://elixir-lang.org/docs/stable/elixir/ will be replaced with https://hexdoc.pm/APP/VERSION for every APP in HOMEPATH/lib.
  • #839 - @KronicDeth
    • All ebin paths in the Internal Erlang SDK will be copied to the Elixir SDK, so that they are indexed, which makes the Internal Erlang SDK modules show up in Symbol search.
    • Erlang SDK modules can be completed and then functions in those modules can be completed after typing ..
      • Atoms have References.
        • Indexed atoms (from decompiled Erlang .beams from the Internal Erlang SDK) will be used for completing atoms as soon the atom is parseable: either after the first letter : or inside the quotes when making a quoted atom.
        • Atoms will resolve to modules if the atom is a module name. If the atom is quoted and contains interpolation, it will treat each interpolation as .* and look for regex matches to this derived potential atom name.
    • Completions for functions after . will now work at the end of file. Previously, completions only worked in the middle of a file, where the . could parse the next work an existing call, now if that parse doesn't work and the only thing after is a new line, it will still complete.
  • #830 - Auto test for mix test case runner will automatically run tests after a change is detected in the project files, which normally happens on save, which happens when losing focus on a changed editor tab by default. - @nivanson
  • #840 - Regression test for #821 - @KronicDeth
  • #841 - Regression test for #803 - @KronicDeth
  • #842 - Regression test for #833 - @KronicDeth
  • #843 - Port elixir-lang/elixir#2774: Allow A-Z as sigil modifiers in addition to a-z to support U ungreedy modifier that replaced r ungreedy modifier for regexes. - @KronicDeth

Bug Fixes

  • #816 - Add notice for debug blacklist that it uses atoms, not Aliases, so you need to qualifier module aliases with Elixir. - @merqlove
  • #817 - Support atoms (prefixed with :) andElixir. and plain Aliases for debugger blacklist. - @merqlove
  • #832 - Add space to import window text - @kentongray
  • #840 - Add END to allowed keywordKey tokens - @KronicDeth
  • #841 - @KronicDeth
    • Only use "Macros" as first header in decompiled .beam files if macro is defmacro. "Macros" header was being printed when there was only functions because the check when there was no lastMacroNameArity didn't care what the current macroNameArity.macro was.
    • When an .erl file has -compile([compressed]), it will be compiled normally, and then gzipped, so that the .beam will not contain the BEAM magic number FOR1, but instead the gzip magic number 0x1f 0x8b. So, to properly handle normal and compressed, the decompiler needs to look-ahead 2-bytes and check the gzip magic number. If the gzip magic number is detected, the InputStream will be passed through GZIPInputStream before the the normal decoding process.
  • #842 - When decompiling function and macro names from Erlang module, its possible for the name to contain # and they would be interpreted as comments. Accepting those names in Unquoted wouldn't escape the # from being treated as a comment, so in addition to unquoteing the name, surround it in double quotes. - @KronicDeth
  • #848 - @KronicDeth
    • AdditionalDataConfigurable only copied the the Internal Erlang SDK Code Paths when the selection in the ComboBox was changed, which meant if the there was only one Erlang SDK or the user never changed the selection, the Code Paths were never copied. To get the Code Paths copied when the Elixir SDK is first created and setupSdkPaths interface method is called
      1. All paths are set directly on the Elixir SDK as before
      2. The default Erlang SDK, which should be the one that was last created, is configured in SdkAdditionalaData
      3. The Code paths from the Erlang SDK are copied to the Elixir SDK
        1. If the the Erlang SDK is from intellij-elixir and does not have ebin directories for its Class Paths, then the Class Paths is expanded to Code Paths.
  • #851 - The Code Paths from the Internal Erlang SDK were not being copied from the default Erlang SDK to the Elixir SDK when the default Erlang SDK was set during mix test runs, which meant that the Elixir SDK would not upgrade correctly from 6.1.1 to 6.2.0 without the user deleting the Elixir SDK and recreating it. - @KronicDeth

v6.1.1

Bug Fixes

  • #795 - When #754 made intellij-erlang a soft-dependency, it broke the debugger's icons that referenced ErlangIcons, but it turns out all the icon constants were aliases to AllIcons.Debugger constants, so by using the AllIcons.Debugger icons directly, the dependency on ErlangIcons can be removed without the need to copy the image files into intellij-elixir. - @KronicDeth
  • #796 - When do ... end template is inserted, it did not have a previous child whose attributes to use, so it used the default, which left the cursor unindented. To get the cursor indented by default, When the ElementType is DO, apply the stabChildrenIndent rules: indent normal and determine whether to indent relative to direct parent using code style setting. - @KronicDeth
  • #797 - Include VirtualFile path in Beam read errors - @KronicDeth

v6.1.0

Enhancements

  • #792 - @KronicDeth
    • Since the process of requiring resource files is the same, org.elixir_lang.ElixirModules has static methods for copying resources out to a temporary directory and adding the -r <temporary_path> for one or more resource files to a new or existing ParametersList. These are now shared for the Mix ExUnit and Debugger code paths.
    • Format class
      • ElixirXDebugProcess
      • MixExUnitRunningState
      • MIxRunningState

Bug Fixes

  • #792 - The compiled .beam files were removed in 58e7d4a, which was before v5.1.0, but not all users had problems with using the debugger. #739 persisted (as reported by @erikreedstrom) when 6.0.0 was released; I retried reproducing on a clean VM and I got it. I'm not sure why it worked for some people in prior releases since the .beam don't exist that were being copied, but now the debugger uses the same system of copying .ex files and requiring them with -r instead of copying .beam and using -pa to add the ebin directory. Fix was verified local under macOS and in Windows VM that reproduced #739. - @KronicDeth

v6.0.0

Enhancements

  • #724 - @KronicDeth
    • Code Formatter
      • do block lines are indented
      • do blocks end as the last argument of a no parentheses call unindents to the start of the call
      • If one clause of a multi-clause anonymous function wraps, all clauses wrap.
      • Indent after else
      • Indent map and struct keys
      • All keys wrap if any key wraps
      • No spaces around...
        • .
      • Spaces around...
        • and
        • in
        • or
        • when
      • Configure spaces around...
        • =
        • <- and \\
        • !=, ==, =~, !==, and ===
        • <, <=, >=, and >
        • + and -
        • * and /
        • Unary +, -, !, ^, and ~~~
        • ->
        • ::
        • |
        • || and |||
        • && and &&&
        • <~, |>, ~>, <<<, <<~, <|>, <~>, >>>, and ~>>
        • ..
        • ^^^
        • ++, --, .., <>
        • =>
      • Configure spaces before...
        • ,
      • No space after...
        • @
      • Spaces after...
        • not
        • fn
        • after
        • catch
        • rescue
        • key:
      • Configure space after...
        • &
        • ,
      • Configure spaces within...
        • { }
        • << >>
        • [ ]
        • ( )
      • No space around / in &NAME/ARITY and &QUALIFIER.NAME/ARITY
      • when wraps when its right operand wraps, so that guards start with when on a newline when they are too long.
      • Align |> at start of indented line for pipelines
      • Align end with start of call instead of start of line for do blocks in pipelines
      • Indent list elements when wrapped
      • Indent tuple elements when wrapped
      • Align type definition to right of ::
      • Align guard to right of when when guards span multiple lines
      • Align two operator (++, --, .., <>) operands, so that <> binaries are multiple lines align their starts instead of using continuation indent and being indented relative to first operand.
      • Align pipe | operands, so that alternates in types and specs are aligned instead of continuation indented relative to the first operand.
      • Comments in spec (that is above operands to | align with the operands
      • Remove newlines from pipelines, so that all pipelines start with an initial value or call and each |> is the start of a successive line.
      • Key exclusivity: if an association operation or keyword key is already on a line, the container value automatically has it's elements wrapped if there is nested associations or keyword pairs, so that two levels of keys are not on the same line.
      • Indent bit string (<< >>) elements when wrapped
  • #732 - @KronicDeth
    • Update IntelliJ IDEA version to latest in each MINOR version:
      • 2017.1.1 -> 2017.1.5
      • 2016.3.5 -> 2016.3.7
    • Update Elixir version 1.4.2 -> 1.4.5
  • #738 - @KronicDeth
    • TeamCityExUnitFormatting.put_event
    • Always match on %__MODULE__{} for state in clauses to prevent state update errors
    • Match on :suite_finished and :suite_started events, so that only events added to the interface will be unknown and IO.warn can be used tell anyone spotting the new event to file an issue.
  • #741 - Instead of pinning position (1 for lines or 3 for heredocs), pin *_PROMOTER token, so it's more obvious the pattern is that the promoter is pinned. - @KronicDeth
  • #747 - Regression test for #659 - @KronicDeth
  • #629 - Search for Elixir SDKs in /nix/store on Mac if homebrew path does not exist - @KronicDeth
  • #749 - Regression test for #672 - @KronicDeth
  • #750 - Regression test for #674 - @KronicDeth
  • #751 - @KronicDeth
    • Regression test for #683
    • Store expected decompilation in files to shrink DecompilerTest length
  • #754 - Update to org.jetbrains.intellij 0.2.15 - @KronicDeth
  • #755 - Regression test for #687 - @KronicDeth
  • #756 - Regression test for #692 - @KronicDeth
  • #758 - Regression test for #694 - @KronicDeth
  • #759 - Regression test for #699 - @KronicDeth
  • #760 - Use Elixir.LDAPEx.ELDAPv3.beam as regression test for #703 - @KronicDeth
  • #764 - Show quotes in list in macros in Structure View - @KronicDeth
  • #768 - References will be cached until the file containing the PSI element changes, so that results from Callable#multiResolve, CallDefinitionClause#multiResolve, Module#multiResolve, and ModuleAttribute#multiResolve, which are all the extant references, can be cached and invalidated correctly. - @KronicDeth
  • #769 - Use ParameterLists to support Path Variables in program parameters. - @KronicDeth
  • #774 - @KronicDeth
    • Adjust SDK home path when bin, lib, or src to parent directory.
    • Format ElixirSdkType.
  • #775 - Regression test for #354 - @KronicDeth
  • #777 - @KronicDeth
    • Include specific message for each decompilation error reason.

    • Regression test for #772

    • AtU8 UTF8 atoms chunk decompilation to support OTP 20 compiled .beam files.

    • Regression test for Elixir 1.5.0 announcement to ensure that unicode from AtU8 chunk can be read from beam file produced by following Elixir code: ```elixir defmodule AtU8Test do def こんにちは世界 do :こんにちは世界

           saudação = "Bom dia!"
      
          saudação
        end
      end
      ```
      
  • #771 - Guard against read/write mismatch in stubs - @KronicDeth
  • #782 - Always install IdeaVIM in the gradle sandbox because it got annoying having to reinstall it when the sandbox reset. - @KronicDeth
  • #786 - @KronicDeth
    • Merge both homebrew and nix store on Mac
    • Merge default and nix store on Linux
  • #789 - Format MixRunningStateUtil and fix warnings. - @KronicDeth

Bug Fixes

  • #726 - @KronicDeth
    • Treat :: the same as : in key: after when in type specifications as it's a realistic error.
    • Change . to # when referring to constants in javadocs
    • Remove @param without descriptions
    • Remove explicit type from generics when the type can be inferred.
    • Check if atNonNumericOperation reference is non-null before resolving
    • Swap empty branches to inverted conditions for final else.
    • Check if Type leftOperand is null before using it.
    • Remove empty highlightTypesAndTypeParameterUsages(When...)
    • Remove unused highlightTypesAndSpecificationTypeParameterDeclarations
    • Flip equals to eliminate need for null check
    • Remove redundant type arguments (<...>)
    • Change Collections.EMPTY_SET to Collections.emptySet() to prevent uncheck cast warnings.
    • Inline constant argument for errors.
    • Check if when rightOperand is non-null before scanning it for parameter names.
    • Fix typos
  • #732 - @KronicDeth
    • When compilation error is detected during mix test, it will be turned into a test failure.
      • Compilation errors are any stacktraces to stderr that end in (elixir) lib/kernel/parallel_require.ex:.
      • The test failure for the compilation will be attributed to either mix test or the inferred module name of test file.
        • If the first line of the stacktrace contains test/.*_test.exs:\d+: \(module\)
          • The file and line from that line will be used as the location of failure
          • The test/ and .exs will be stripped from the file and it will be camelized to produce the derived test module name of the failure
        • Otherwise, mix test is used
    • Rearrange doc test names to emphasize the function being tested: "test doc at MODULE.FUNCTION/ARITY (COUNT)" becomes "MODULE.FUNCTION/ARITY doc (COUNT)"
      • If MODULE is the same as the test case without the Test suffix, then MODULE. is stripped too and the test name becomes only FUNCTION/ARITY doc (COUNT)
    • Fix parallel test cases nesting under each other due to asynchronous reporting from formatter. ##teamCity testSuiteStarted messages automatically nest, so switched to using nodeId and parentNodeId system, so that nesting is explicit. This will allow multiple parallel tests to show up in GUI too.
    • Elixir. prefix is stripped from test case names.
  • #728 - Handle Elixir versions with non-numeric parts - @pazustep
  • #734 - Use a separate formatter, one GenEvent-based and one GenServer-based, depending on whether the SDK is >= 1.4.0 as that's when GenEvent was deprecated and GenServer was preferred. - @KronicDeth
  • #736 - @KronicDeth
    • Merge Callable and Kernel annotators
    • Use PsiElementVisitor instead of PsiRecursiveElementVisitor, so that macros in defmodule block don't get double annotated.
    • Instead of erasing and then applying multiple TextAttributeKey, erase as before, but then merge the TextAttributeKey's TextAttributes and apply as single setEnforcedTextAttributes. For some reason, this fixes the inconsistency of whether PREDEFINED_CALL or MACRO_CALL is applied first.
    • In case of multiple resolveds, make those that need PREDEFINED_CALL to win.
  • #738 - @KronicDeth
    • TeamCityExUnitFormatting.new should return struct only because none of the formatters expects an :ok tuple.
    • Fix order of TeamCityExUnitFormatting.put_Event catchall parameters.
    • FileReferenceFilter
      • Add .exs to pattern for stacktrace linking.
      • Highlight only stacktrace path and line umber instead of entire line
      • Better path match in stacktraces
        • Only accept VirtualFile if it has a suffix matching the stacktrace's path instead of accepting the first index file with a matching basename.
        • Allow multiple VirtualFiles to be linked if it turns out there is a true file path collision between two OTP apps in the Project or Libraries.
      • Format and fix warnings
  • #741 - @KronicDeth
    • Pin promoter for all quotes, including the previously missing stringLine and charListLine.
    • Only insert closing quote if previous token was an opening quote.
  • #742 - @KronicDeth
    • On unquote, include argument in name of call definition clause
    • Look outside tuple containing quote for enclosingMacroCall, which allows going to Phoenix.Template.compile's quote's defp
    • Treat Module.create as `Modular
    • Or interface to unify Matched and Unmatched Ors.
    • Look at both side of Or operation for nested child calls for Structure view.
    • Make unquote(ARG1) name for getName and indexing
  • #744 - @KronicDeth
    • ElementDescription for ElixirVariable
    • Mark UnqualifiedParenthesesCalls as call instead of variable.
  • #745 - @KronicDeth
    • mix local.hex --force before mix deps.get during project import to prevent prompt for hex update when local hex is earlier than that required by mix.
    • Fix warnings and format MixProjectRootStep
  • #746 - @KronicDeth
    • Mark ElixirDecimalFloat as error in types.
      • If in a Range: "Floats aren't allowed in Ranges"
      • Otherwise: "Float literals are not allowed in types. Use float() instead".
  • #747 - @KronicDeth
    • Ignore jps-*/out directories.
    • Look at parent for isParameter for AtUnqualifiedBracketOperation.
    • Treat AtUnqualifiedBracketOperation the same as UnqualifiedBracketOperation for isVariable.
  • #748 - Include path in error messages from buildFileStub - @KronicDeth
  • #749 - Erlang allows do as a function name, but it's a keyword in Elixir, so wrap it as unquote(:do). The SpecialForm decompiler already did this unquote(...) wrapping, but do is a keyword and not a special form, so rename the decompiler to Unquoted. - @KronicDeth
  • #750 - @KronicDeth
  • #751 - Unquote function names that start with an uppercase codepoint, so that they aren't parsed as Aliases. These function names occur in the CORBA modules in OTP. - @KronicDeth
  • #754 - @KronicDeth
    • Using intellij.plugins will prevent packaging intellij-erlang as a runtime dependency, which leads to duplicate templates.
    • Don't use the JPS type for jps-* projects because their deps become incompatible with other projects.
  • #755 - Add missing breaks to case statement in processDeclarations(Match, ...) that caused the logic of whether to check left, right, or both operand based on the whether the treeWalkUp came from always fell through to the RIGHT case, so it was only, always checking the right operand of the match and never the left operand. - @KronicDeth
  • #756 - Skip processDeclarationsInPreviousSibling when lastParent is ElixirFile - @KronicDeth
  • #757 - Remove background color from sigils because it stands out really badly in the Default theme where it's black on white and while it doesn't in Darcula, it's unnecessary there because it's so close to the editor background color in Darcula. - @KronicDeth
  • #758 - Treat Alias as miscapitalized type parameter. @KronicDeth
  • #759 - Ignore call definition clauses after when in type specifications as it is a common occurrence when typing a specification above a pre-existing call definition clause. - @KronicDeth
  • #761 - Use THashSet instead of the more specific SmartHashSet because THashSet allows null keys, which are expected for the canonicalNameSet. - @KronicDeth
  • #764 - @KronicDeth
    • Look above List for enclosing modular macro.
    • Look above ElixirNoParenthesesManyStrictNoParenthesesExpression for enclosing modular macro.
  • #765 - Remove background color from Sigil Color Scheme Design to match changes in #757. - @KronicDeth
  • #769 - @KronicDeth
    • Check if program parameters is blank before splitting into mix args.
    • Use ParametersList to properly parse quote program parameters.
  • #773 - @KronicDeth
    • Move Quoter into test directory, so it and its dependency on JUnit is only used for test compilation and runtime and not the shipped runtime.
    • Fix Quoter warnings and format.
  • #774 - @KronicDeth
    • Show expected SDK home path structure when invalid. screen shot 2017-08-06 at 2 28 36 pm
    • Suppress invalid warnings in ElixirSdkType.
  • #775 - Always check if resolution result is right operand of match. - @KronicDeth
  • #776 - CallDefinitionClause InsertHandler always assumed there was a character after the insert location, but when inserting at the very end of the file, there isn't, which caused an IndexOutOfBoundsException. Only check if the following character is not a space, (, or [ when the document is longer than the tail offset to prevent the IndexOutOfBoundsException. If the insertion is at the end of the file, then the () will always be inserted. - @KronicDeth
  • #777 - Decompilated -> Decompilation - @KronicDeth
  • #771 - The lower-level Data(Output|IntputStream (write|read)Int don't work correctly with sizes, so use the JetBrains (write|read)VarInt ones instead. - @KronicDeth
  • #782 - Delegate ChildAttributes to previous child when available: Block.getChildAttributes is used when Enter is pressed to determine the indentation and alignment. Using the default implementation, newlines in stabs look overly indented, but there is a constant, DELEGATE_TO_PREV_CHILD that can be used to just use the last child's indent as long as there is one, which appears to work well for stabs (do block bodies, etc). - @KronicDeth
  • #783 - @KronicDeth
    • Increase suspect nameSetSize from 4 to 10 because a Poison.Encoder has an impl module for 4 types, and so has 4 canonical names.
    • Only read-ahead if guard length is non-zero; otherwise, only warn the nameSetSize may be suspect and don't read-ahead as this can mess up OK namesets.
  • #784 - @KronicDeth
    • Override Kernel.SpecialFroms arity intervals
      • alias overridden from 2 to 1-2 to support without :as option.
      • import overridden from 2 to 1-2 to support without :except or :only options.
      • quote overridden from 2 to 1-2 to support block without options.
      • require overridden from 2 to 1-2 to support without :as option.
      • super overridden from 1 to 0- to support calling any super method.
  • #789 - elixir.bat in at least Elixir 1.5.1, will not properly parse a mix path with spaces in it on Windows even when the path has outer quotes (see elixir-lang/elixir#6455). It is not possible to use inner quotes, as you can do in cmd.exe, using the JetBrains and Java libraries hat auto-matically quote, so instead bypass the bad quoting in elixir.bat by doing what elixir.bat does: call erl.exe with all the SDK ebin paths added with -pa, then -noshell -s elixir start_cli to run Elixir and-extra to run requires (-r), mix and its tasks. - @KronicDeth

Incompatible Changes

  • #732 - @KronicDeth
    • Drop 14.1.X support because it does not have support for nodeId test output, so it's not possible to handle the ExUnit test output in a safe manner while still allowing concurrent output for asynchronous tests.

v5.1.0

Enhancements

Bug Fixes

  • #669 - Replace assert scope.isEquivalentTo(lastParent.getParent()) with an if and log what lastParent was when condition is false, so root cause can be traced. - @KronicDeth

v5.0.0

Enhancements

  • #574 - @KronicDeth
    • Decompile .beam files
      • Structure view for decompiled .beam files
      • Index modules, functions, and macros exported by .beam files
      • Go To Symbol for Modules defined in .beam files (both SDK and deps)
        • Erlang using atoms (like :idna)
        • Elixir using Alias (like Enum)
      • Completion for Modules defined in .beam files (both SDK and deps)
        • Elixir using Alias (like Enum)
      • Completion for functions and macros exported by .beam files
      • Syntax highlighting
  • #579 - Regression test for #575 - @KronicDeth
  • #583 - @KronicDeth
    • Macros appear before functions in decompiled .beam files
      • Header for macro and function sections
  • #585 - @KronicDeth
    • Update ELIXIR_VERSION for 1.2.* from 1.2.3 to 1.2.6
    • Add ELIXIR_VERSION 1.3.4
    • Add ELIXIR_VERSION 1.4.0
    • Update IDEA for 2016.* to 2016.3.1
    • Show OtpErlangBitStr (and therefore OtpErlangBinary contents when tests fail
    • Quote binaries as to_charlist instead of to_char_list for Elixir >= 1.3. Depends on Elixir version of project SDK.
    • Use elixir instead of java VM, so now Erlang and Elixir don't need to be built on travis-ci, but ant and the jdk need to be installed, but unlike Erlang and Elixir, there are tarballs for that, so this way is faster than the old method without depending on travis-ci cache.
  • #609 - @KronicDeth
    • If multiResolve causes a StackOverflow for org.elixir_lang.annotator.Callable.visitCall, then catch it and use errorreport logger to log the element.
    • Include file path in errorreport excerpt
    • Log element for StackOverflow related to imports
    • Regression test for #605.
    • Log LookupElement#getObject when LookupElement#getPsiElement is null to track down how it was null in #563.
  • #614 - Regression test for #559 - @KronicDeth
  • #504 - @JakeBecker
    • Switch to Gradle for builds.
      • ./gradlew runIde (or the runIde (VERSION) Run Configurations) will run IDEA in a sandbox with the development version of the plugin.
      • ./gradlew test (or the test (VERSION) Run Configurations) will run the main plugin and jps-builder tests.
      • The plugin can now be published with ./gradlew publishPlugin, BUT you'll need to fill in publish* properties in gradle.properties. This will eventually allow for automated "nightlies" from successful Travis-CI builds on master.
  • #638 - The Callable annotator is meant for variables, parameters, and macro and function calls and declarations. The ModuleAttribute annotator handles module attribute declaration and usage, so we can save reference resolution time by skipping module attributes in Callable. - @KronicDeth
  • #640 - Allow module attribute folding to be configured. - @KronicDeth
  • #662 - @KronicDeth
    • Allow call definition heads to resolves to themselves for consistency with Aliases of defmodule.
    • Generalize Callable.callDefinitionClauseDefiner(Call): in addition to the current CallDefinitionClause, make it work for Implementation, Module, and Protocol.

Bug Fixes

  • #574 - Fix copy-paste errors in MatchOperatorInsteadOfTypeOperator - @KronicDeth
  • #579 - @KronicDeth
    • Subtract 1 from arity in .beam file when decompiling to defmacro calls because the Erlang function for Elixir macros has one addition argument: the first argument is the Caller of the macro.
    • If the name of the decompiled macro/function is an infix operator, then decompile the head as a binary operation instead of a normal prefix name as infix operators aren't valid prefix names and led to parsing errors, which was the root cause of #575.
    • Fix IntelliJ warnings in BeamFileImpl
    • Remove unused VirtualFile argument to BeamFileImpl#buildFileStub.
  • #583 - @KronicDeth
    • Add ++, =~, and in to INFIX_OPERATOR_SET.
    • Only render infix operators if arity is 2.
    • Prefix operator decompilation: + and - are both binary and unary operators. When a unary operator they need to be wrapped in parentheses, so that the call definition clause is parsed correctly.
  • #585 - @KronicDeth
    • Ignore JFLex jar
    • Don't check for elixir-lang/elixr files remove in 1.3
    • Allow nil as a keyword key. nil was being lexed as a potential keyword key, but NIL was missing from the token list in the keywordKey grammar rule.
  • #599 - Some SpecialForms don't work as literals as they would be interpreted as metaprogramming, so their name needs to be wrapped as an atom to unquote. - @KronicDeth
  • #600 - @KronicDeth
    • Check children of MultipleAliases for variable declarations.
    • Treat any variable declared in a MultipleAliases as invalid.
  • #609 - @KronicDeth
    • Skip import Kernel in kernel.ex to prevent stack overflow due to recursive import
    • Strip all outer parentheses for left type operand, so that (+value) can be see as + operator type spec.
    • Use advice from IndexNotReadyException documentation and check DumbService.isDumb(Project) before calling StubIndex.getElements in Module and module.MultiResolve.indexNameElements.
    • Don't assert that LookupElement#getPsiElement is not null in CallDefinitionCluase.renderElement
    • Update to ant 1.10.1 because 1.10.0 is no longer hosted.
  • #612 - Yeah, it sounds weird, but an ElixirVariable isn't necessarily a variable if it doesn't occur in a declaration context. It could just be a no-parentheses function call in the wrong spot, so check the parent PsiElement to determine if ElixirVariable is a variable. - @KronicDeth
  • #614 - Highlight parameterized type head (maybe(t) in @type maybe(t)) the same as a full type definition (maybe(t) in @type maybe(t) :: t | nil) - @KronicDeth
  • #616 - Only show Mix ExUnit Run in context when the module, or when the module is not a available, the project SDK is Elixir. If there is no SDK configured, show "Mix ExUnit Run" in the menu. - @KronicDeth
  • #617 - Mark do: as atom in demo text - @KronicDeth
  • #627 - Annotations can only be applied to the single, active file, which belongs to the referrer Callable. The resolved may be outside the file if it is a cross-file function or macro usage, in which case it's TextRange should not be highlighted because it is referring to offsets in a different file. - @KronicDeth
  • #634 - @KronicDeth
    • Variable scope for QualifiedMultipleAliases, which occurs when qualified call occurs over a line with assignment to a tuple, such as Qualifier.\n{:ok, value} = call()
    • Remove call definition clauses (function or macro) completion for bare words as it had a detrimental impact on typing feedback (the editor still took input, but it wasn't rendered until the completion returned OR ESC was hit to cancel the completion, which became excessive once the index of call definition clauses was expanded by the decompilation of the Elixir standard library .beams, so disable it. If bare-words completion is restored. It will either (1) need to not use the Reference#getVariants() API because it generates too many objects that need to be thrown away or (2) need to only complete call definition clauses that are provably in-scope from imports or other macros.
  • #636 - @KronicDeth
    • Both intellij-erlang and intellij-community are Apache 2.0 licensed and its the default license for Elixir projects, so seems like a good choice for LICENSE.md
    • Add CODE_OF_CONDUCT.md
  • #638 - @KronicDeth
    • The run configurations I put together in #504 didn't allow for the debugger to work properly: neither pause nor breakpoints had any effect, so regenerate them from the Gradle pane.
    • Check parent of when operation in case it's a guarded function head in org.elixir_lang.annonator.Parameter.putParameterized(Parameter, PsiElement)
    • Instead of highlighting call definition clauses when they are referred to, which only works if it is in the same file, highlight all function and macro declarations when the def* call is encountered.
    • Only increment arity for right pipe operand instead of all operands, so that left operands resolve to correct arity or as variable/parameter.
  • #662 - @KronicDeth
    • Override ModuleImpl#getProject() to prevent StackOverflowError. Without overriding #getProject(), IdentifierHighlighterPass gets stuck in a loop between getManager and getProject on the target (the ModuleImpl) when clicking on the space between defs or defmacros in the decompiled .beam files.
    • Fix source formatting
    • Skip looking for variables unless 0-arity AND no arguments
    • Highlight unresolved macros as macro calls. Anything with a do keyword or a do block will be treated like a macro call even if it can't be resolved. No resolved is either no resolve results or an empty list
    • Implicit imports at top of file in addition to top of Module.
  • #663 - @KronicDeth
    • CallDefinitionClause completion provider is unexpectedly invoked both when . is typed, but continues to be invoked after a letter is typed after the .; however, once the letter is typed, the letter becomes the default prefix instead, so the prefix should only be reset to "" when it ends in ..
    • Disable Callable#getVariants unless Unqualified to prevents local functions and macros being shown as completions for qualified names.
  • #651 - @StabbyMcDuck
    • Among many other tweaks, the String color is now green, so that Atom and String are no longer close to one another, which was the original issue in #569 screen shot 2017-04-09 at 9 44 06 pm
      • Alias now has underscored effect
      • Brackets are now greenish instead of brownish
      • Callbacks are now a lighter blue and has underscored effect
      • CharList is little lighter
      • CharToken is dark yellow now instead of dark purple
      • Dot is now purple instead of dark red
      • Expression Substitution Mark is a little lighter
      • Interpolation is now lime green
      • Kernel Macros are a burnt orange
      • Map is now a dark blue instead of a dark yellow
      • Operation Sign is a little lighter
      • Parameters are a little darker
      • Parentheses are redder
      • Predefined is orange instead of blue
      • Specification is now red instead of purple
      • Struct is now purple instead of yellow
      • Type is now green instead of dark purple
      • Variable is more tealish
  • #650 - @StabbyMcDuck
    • Fix indentation to fix sub-lists in CONTRIBUTING.md
    • Fix pluralization in CONTRIBUTING.md
  • #664 - @KronicDeth
    • Check if resolve results are null for For.resolveResultList
    • Check if Protocol.resolveResultList is null
  • #665 - Check match Call is an UnqualifiedNoArgumentCall, in addition to being 0 resolved final arity, before checking if the name matches. - @KronicDeth

Incompatible Changes

  • #585 - Move ^^^ to its own three-operator precedence level to match 1.2. This does mean the parsing will be wrong for Elixir 1.1, but is simpler than maintaining two grammars for those that are still using Elixir 1.1 - @KronicDeth
  • #504 - The ant build files have been removed. To build the build plugin (for Install From Disk), use the ./gradlew buildPlugin. - @JakeBecker
  • #640 - Change to module attribute folding to off by default. - @KronicDeth

v4.7.0

Enhancements

  • #523 - Use the CommonProgramParametersPanel to get the working directory and environment variables the same way the JUnit form does. Replace the custom "Command" input with the "Program arguments" input built into the CommonProgramParametersPanel. CommonProgramParametersPanel expects to store the "Program Arguments" in a "ProgramParameters" field, so old run configurations will lose their "Command" option value and it will be migrated to the new "ProgramParameters". - @KronicDeth
  • #482 - @JakeBecker, @KronicDeth
    • Create / Run Mix ExUnit Run Configurations
      • Run Configuration from Directory
      • Run Configuration from File
      • Run Configuration from LIne
    • Run Configurations support Common Program Parameters
      • Program Arguments
      • Working directory
      • Environment variables
  • #531 - @KronicDeth
    • enclosingMacroCall returns enclosing macro call when parent is ElixirDoBlock, so that end element goes to the macro call.
    • Navigate > Test will go to the Module that has the same canonical name as the current defimpl, defmodule, defprotocol , or quote with a Test suffix added
    • Navigate > Test Subject will go to the defimpl, defmodule, defprotocol, or quote that has the same canonical name as the current Module with the Test suffix removed.
  • #533 - Regression test for #500 - @KronicDeth
  • #545 - Regression test for #517 - @KronicDeth
  • #548 - Regression test for #521 - @KronicDeth
  • #549 - @KronicDeth
    • Regression test for #525
    • If : is used instead of :: for a type specification, mark it as an error with a Quick Fix to convert : to ::.
    • Highlight = operands the same as :: operands in type specifications.
    • If = is used instead of :: in a type specification, mark it as an error with a Quick Fix to convert = to ::.

Bug Fixes

  • #523 - Fix typo: myRunInModuleChekcBox => myRunInModuleCheckBox - @KronicDeth
  • #532 - Don't log error when name length exceeds presentable text length because it appears to be common for normal users and not a development environment artifact. - @KronicDeth
  • #533 - Check parent of ElixirMultipleAliases for isVariable because ElixirMultipleAliases can be hit in isVariable when MyAlias. is added on a line above a pre-existing tuple, such as when typing a new qualified call. - @KronicDeth
  • #534 - Add space between variable and match in lookup element presentation - @KronicDeth
  • #535 - Check VirtualFile is not null before creating attachment because PsiFile can lack a VirtualFile if the PsiFile only exists in memory. - @KronicDeth
  • #537 - Convert CallDefinitionClause(Call) to CallDefinitionClause.fromCall(Call), so that null can be returned when CallDefinitionClause.enclosingModular(Call) returns null. - @KronicDeth
  • #539 - @KronicDeth
    • Use functionName instead of getName when multiresolving unqualified functions because getName will return the Alias when called on defmodule.
    • maybeQualifiedCallToModular returned null BOTH (1) if the call was unqualified OR (2) if the call was qualified, but its modular could not be resolved, so qualified calls to .beam-only modules, like File.read! returned null because File could not be resolved to a modular. Remove maybeqQualifiedToModular and call qualifiedToModular when myElement is qualified. If the modular is null, then return an empty ResolveResult[] instead of looking for unqualified matches.
    • Pass maxScope to Module reference. maxScope is generally the containing file for the element, but when using Module to resolve imports, it is the import call's parent element, so that the resolve doesn't ricochet between the defmodule and its child, the import call until StackOverflowError.
  • #545 - A variable cannot be declared in update arguments, so return LocalSearchScope.EMPTY, the same as interpolation. - @KronicDeth
  • #548 - ElixirSystemUtil.getProcessOutput already allowed for an empty, invalid ProcessOutput when the workDir wasn't a directory, so allow it to also be null and return the empty ProcessOutput. - @KronicDeth
  • #549 - @KronicDeth
    • If a single keyword pair is used for a type spec, treat : as a type for ::
    • Limit variable use scope for variables "declared" in module attributes to the module attribute because the variable can't be declared there and it is really a variable usage without declaration.

v4.6.0

Enhancements

Bug Fixes

  • #454 - Return emptySet when lookupElementByPsiElement is null. - @KronicDeth
  • #455 - @KronicDeth
    • Don't do a naked assert that there are 2 children because this can fail during error recovery on the operand, instead use the prefix.Normalized.operand() through prefix.operand().

      WARNING: This changes the @NotNull array so that its sole element changes from @NotNull to @Nullable. It may trigger new bugs.

  • #461 - Use shipped GeneratedParserUtilBase.DUMMY_BLOCK because the DUMMY_BLOCK MUST match the GeneratedParserUtilBase to detect dummy blocks inserted for error handling. - @KronicDeth
  • #465 - Skip over ElixirNoParenthesesStrict for isVariable - @KronicDeth
  • #466 - Allow newlines before do in doBlock - @KronicDeth
  • #467 - Don't match do or fn to end when used as a keyword key. - @KronicDeth
  • #474 - @KronicDeth
    • Check if iterator.atEnd() before calling iterator.getTokenType() to avoid IndexOutOfBounds exception.
    • Don't add current call definition clause being written to completion
  • #476 - When#leftOperand will return null (because it's normalized) if there are left-hand error elements, but when stripping guards we want best-effort to match human expectations, so don't use normalized null, but use left, non-error element if it is unique. - @KronicDeth
  • #477 - Highlight types in QualifiedNoParenthesesCall - @KronicDeth
  • #478 - Still not obvious why name for a CallDefinitionClause lookup renderer can be longer than presentableText, so still log an error, but with Logger.error, so we get name, presentableText, and the original element. - @KronicDeth
  • #479 - @KronicDeth
    • Skip Arguments elements in previousParentExpresion to eliminate an unnecessary level of processing declarations since calls will enter their arguments.
    • Only put new ENTRANCE in ResolveState in variable.MultiResolve.resolveResultList, so that caller can override the default value.
    • Set ENTRANCE to matchAncestor instead of previous expression to eliminate the looping that occurred when a variable was unbound (or a function) because the check for with (and for) was expecting the ENTRANCE to be the previous child expression instead of the with clause as a whole (or the Arguments element as had been the case before 6fcc19b).
  • #483 - @KronicDeth
    • Resolves functions qualified by Aliases that are either direct Module references or one-step aliases.
    • Remove Call#resolvedFunctionName because import can't rename functions.
  • #484 - Don't type-highlight BracketOperations as they occur when putting maps or structs in front of lists. - @KronicDeth
  • #485 - Treat Enum.each the same as Enum.map around def - @KronicDeth
  • #486 - Increase resolvedFinalArity by 1 for piping. - @KronicDeth
  • #498 - @KronicDeth
    • Go To Declaration resolves through import
      • for import MyModule
        • the import statement
        • the call definition clause in the imported Module.
      • for import MyModule, only: [name: arity]
        • the import statement
        • the call definition clause in the imported Module.
      • for import MyModule, except: [name: arity] if reference is not name/arity.
        • the import statement
        • the call definition clause in the imported Module.

v4.5.0

Enhancements

  • #452 - @KronicDeth
    • Go To Declaration for functions and macros (only those defined in parseable-Elixir source. References to Erlang functions or only those available in .beam file, such as the standard library will not resolve.)
    • Completion for functions and macros (only those defined in parseable-Elixir source. Erlang functions and Elixir function only in compiled .beam file, such as the standard library will not complete.)
      • Completion uses the same presentation as Structure View, so the you can tell whether the name is a function/macro, whether it is public/private, and the Module where it is defined.
      • Completed functions/macro insert () after the name in preparation for Elixir 1.4 where it is an error to have bare function calls. It also makes it more obvious that you inserted a function and not a variable.
      • Completion works for all functions when a bare identifier is used. For a qualified identifier, only functions/macros under than Module are shown.

v4.4.0

Enhancements

Bug Fixes

  • #419 - @KronicDeth
  • #424 - Check if rightOperand is null when highlighting types for Type, which can occur when typing : for an atom after the :: for a Type - @KronicDeth
  • #425 - Use GeneratedParserUtilBase synced to GrammarKit version as was done originally in #406 - @KronicDeth
  • #426 - Check parent of BracketArguments for isParameter and isVariable- @KronicDeth
  • #428 - Instead of asserting that a QualifiableAlias has 3 children, which may not be true on error recovery, use the Normalized static methods that are used elsewhere to handle error recovery around Infix operations as the . in QualifiableAliases is a pseudo-Infix - @KronicDeth
  • #432 - Add missing @Nullable to @NotNull change when parser wasn't regenerated when canonicalNameSet was changed to @NotNull in the interface. - @KronicDeth
  • #434 - Search above block items and block lists for calls to check use scope - @KronicDeth
  • #435 - Check parent isVariable for ElixirNoParenthesesManyStrictNoParenthesesExpression - @KronicDeth
  • #439 - Highlight @type without :: - @KronicDeth
  • #440 - ElixirNoParenthesesManyStrictNoParenthesesExpression indicates an ambiguous no parentheses nesting, but the highlighting should not error and do a best effort instead. - @KronicDeth
  • #441 - isParameter(Call) called isParameter on its parent if it wasn't a call definition clause, delegation or macro, but isParameter(PsiElement) immediately calls getParent() and does all the instanceof tests on the parent. So, instead of isParameter(Call) calling isParameter(PsiElement) on its parent, it should just call it on itself, this way the check for ElixirInterpolation will not be skipped and there's no need to handle ElixirInterpolatedString. - @KronicDeth

v4.3.0

Enhancements

  • #387 - Resolve aliased modules to their alias call, from the alias call, you can Go To Declaration for the module itself. - @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 to alias Prefix.Suffix, as: As`
      • NestedSuffix resolves to alias __MODULE__.NestedSuffix
  • #389 - Completion for module aliases - @KronicDeth
    • From in-file aliases
    • __MODULE__
    • In project modules (using index already used for Go To Declaration)
  • #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
  • #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
  • #399 - resolvableName allows nested modules under multiple aliases to be completed. - @KronicDeth
  • #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
  • #405 - @KronicDeth
    • Resolve as: aliased name to both alias and defmodule
    • Complete modules nested under as: aliased name.
  • #409 - @KronicDeth
    • Completion and reference tests for aliases:
      • alias Prefix.Suffix
      • alias Prefix.Suffix, as: As
      • alias Prefix.{MultipleAliasA, MultipleAliasB}

Bug Fixes

  • #393 - @KronicDeth
    • defimpl <PROTOCOL>, for: [<TYPE>, ...] generates multiple canonical names, which are stored in the stub index.
  • #400 - @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 to Enum.map.
    • Fix if-else-ordering bug where Call appeared before operations (which are usually Calls) like Match.
  • #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
  • #405 - @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 - @KronicDeth
    • The generated ElixirParser uses the GeneratedParserUtilBase from com.intellij.lang.parser, but since that version is a synced copy, it is a snapshot of GeneratedParserUtilBase 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 - @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.
    • 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 from Collection<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).

v4.2.0

Enhancements

  • #371 - @KronicDeth
    • BraceMatcher
      • Matches the following pairs:
        • do to end
        • fn to end
        • """ to """
        • ''' to '''
        • << to >>
        • < to >
        • [ to ]
        • { to }
        • ( to )
      • Completes the following pairs:
        • [ with ]
        • { with }
        • ( with )
    • QuoteHandler completes standard quotes (that start with " or ')
      • ' with '
      • " with "
      • ''' with '''
      • """ with """
    • TypedHandler completes the non-standard quotes and braces
      • do with end
      • fn with end
      • <<with>>`
      • < with > (for promoters)
      • / with / (for promoters)
      • | with | (for promoters)

Bug Fixes

  • #372 - Check parent for isVariable(ElixirMapUpdateArguments) - @KronicDeth
  • #374 - @KronicDeth
    • IntelliJ 15.0.4 is no longer available from JetBrains, so if the cache is not available, the builds don't work, so use 15.0.6, which is available in 15.0.4's place as the test version for 15.X.
    • IntelliJ 2016.2 is no longer available from JetBrains, so if the cache is not available, the builds don't work, so use 2016.2, which is available in 2016.1's places at the test version for 2016.X.
  • #378 - enclosingMacroCall could climb out the stab after a do, but not the else in an if, which is used for defined functions conditionally in Phoenix.Endpoint.server/0 - @KronicDeth
  • #380 - A lot of ppl use the doc template after already typing @, but the doc template starts with @, so it ends up inserting @@doc .... The @doc template is the same code, but since the name starts with @, it doesn't insert a second @. Unfortunately, the template search code doesn't prompt when just typing @, so you end up having to type @doc before only one template is selected. The @doc template will show in the lookup as soon as @d is typed, but you have to select it from the list then before tabbing to accept. - @KronicDeth
  • #381 - Look at end of do instead of start for end completion to stop ignoring the : in do: , when caret - 3 would land on the o, now all tests are meant to land on the o, so do: won't complete with end incorrectly anymore. - @KronicDeth
  • #382 - Ignore ElixirVariable in highlightTypesAndTypeParameterUsages - @KronicDeth

v4.1.0

Enhancements

  • #331 - @KronicDeth
    • Allow do end blocks to fold to do: ...
    • Allow -> operator and the right operand to fold to -> ...
    • Allow @doc, @moduledoc and @typedoc value to fold to "...".
    • Fold runs of adjacent alias, import, require, or use to be followed to a single alias, import, require, or use followed by ....
  • #334 - Function separators - @KronicDeth
    • Show a function separator (Preferences > Editor > General > Appearance > Show method separators) above the group of @doc, @spec and def, defp, defmacro, and defmacrop (call definition clauses) of the same name and arity range. Arity range will be used if one of the call definition clauses uses default arguments.
  • #337 - @KronicDeth
    • @for folds to the resolved module name in defimpl
    • @protocol folds to the protocol name in defimpl
  • #343 - Share code between mix and elixir version parsing. - @KronicDeth
  • #344 - @KronicDeth
    • Allow Unknown modulars in the Structure pane, in addition to Go To Symbol. Their icon is a big ? to indicate their correct usage is unknown.
  • #348 - @KronicDeth
  • #349 - Have both QualifiedBracketOperation and UnqualifiedBracketOperation extend BracketOperation, so that BracketOperation can be used to match both when the qualification does not matter. - @KronicDeth
  • #364 - @KronicDeth
    • Regenerate parser with GrammarKit 1.4.2

    • ElixirSdkRelease is now Comparable, so version checks can be done for tests to restrict them to Elixir 1.2+ for multiple alias support.

    • Resolve Multiple Aliases with unqualified Alias in tuples.

    • canonicalName borrows from the idea of PsiReference#canonicalText: an element can have both a Name (from getName), which is the literal name in the code, which can be renamed, and a Canonical Name, which is the name to refer to the element without need for imports or aliases. For this change, defimpl, defmodule, and defprotocol will show their full module Alias for their Canonical Name.

      This change addresses the use case of Go To Declaration that should resolved to a nested defmodule.

Bug Fixes

  • #330 - Check if parameter is null before Variable#execute call in Variable#execute(PsiElement[], ResolveState). - @KronicDeth
  • #336 - Fix isVariable and variableUseScope for var!(name)[...] - @KronicDeth
  • #337 - @KronicDeth
    • @for is no longer marked as unresolved in defimpl and instead resolve to the either the <name> in for: <name> or the module name for the enclosing module when for: is not given.
    • @protocol is no longer marked as unresolved in defimpl and instead resolve to the <name> in defimpl <name>.
  • #342 - @KronicDeth
    • Instead of assert checkRight || checkLeft in Match#processDeclaraions, do the normal code if checkRight || checkLeft and log an error report otherwise, so that the exact code that trigger this error can be reported and the method fixed to handle that form of Match later.
  • #343 - Be able to parse mix version from 1.3.0+ - @KronicDeth
    • Check all lines of output for mix version as Elixir 1.3.0 changed the format of mix --version, so that it includes the Erlang header (Erlang/OTP ... [erts-...] [source] [64-bit] [smp:..:..] [async-threads:..] [hipe] [kernel-poll:false] [dtrace]) on the first line and Mix <version> on the 3rd line. Previously the parsing expected Mix <version> to be the first line.
  • #344 - @KronicDeth
    • If no known modular (Module, Implementation, Protocol, Quote, or Use) matches the call, then use Unknown, which accepts any macro with a do block or keyword. This allows Go To Symbol to no error in projects using Dogma as defrule is now treated as Unknown instead of causing an error that the enclosing modular could not be found.
  • #349 - BracketOperations are neither parameters nor variables. - @KronicDeth
  • #353 - Fix stacktrace linking picking wrong file with same basename - @KronicDeth
    • Strip spaces from front of file path in mix output, which allows file looks to work correctly.
    • Ensure file reference highlight doesn't include the leading and trailing characters by fix off-by-one errors.
  • #358 - Determine whether to check left, right, or both by doing isAncestor checks for all operands, not just the normalized operand. The normalized operand is still used for PsiScopeProcessor#execute since #execute is not expected to handle error elements. - @KronicDeth
  • #364 - @KronicDeth
    • Add A.{B, C} to grammar with quoting to check consistence with Elixir 1.2. Ports elixir-lang/elixir#3666.
    • Use fullyQualifiedName instead of getName for resolvableName because fullyQualifiedName is needed so that qualified aliases inside of the { } of a multiple alias will not have a name as getName is null for those qualified aliases because the name from getName has to be a literal name that can be renamed and qualified names can't be renamed.
  • #365 - The Module icon got the same icon as Unknown when creating Unknown somehow, I assume due to find-replace. - @KronicDeth

v4.0.0

Enhancements

  • #314 - Call references for unqualified no argument calls that work as variables or parameters - @KronicDeth
    • Resolve and highlight parameter references
      • Resolve call definition clause (def(macro)?p?) parameters to themselves
      • Resolve call definition parameter with default to itself
      • Add Parameter ot Color Settings Page
      • Parameters in any macro with do block or keyword pair
    • Resolve and highlight variable references
      • Properly identifier variable declared in for comprehension as variable
      • Add Variable to Color Settings Page
      • Highlight bind quoted keyword key as Variable
      • Resolve references to earlier && operands, which handles code that matches a variable and only uses the variable on success like ((cwd = cwd()) && write_tmp_dir(cwd))
      • Resolve variables from destructure
    • Detect bitstring segment options and don't treat them as variables.
      • Highlight bitstring segment type options as Type, the same highlight as used for @type names.
      • Don't generate (unresolved) references for bitstring segment options
    • Resolve _ to only itself, no matter how many are used to reflect that it is non-binding, while _<name> will resolve to _<name> as it does bind.
      • Add Ignored Variable to Color Settings Page
    • Reimplement module attribute renaming so that variable renaming can be implemented using a different validator for renaming (since module attribute names include the @). Non-inplace renaming should also be supported, but inplace is preferred. (There's a setting to turn off in-place renaming in JetBrains IDEs.)
    • operation.infix.Normalized
      • Normalizes leftOperand, operator, and rightOperand for an Infix operation that may have errors (in either operand). If there is an error in the operand then its normalized value is null.
    • Keyword key type descriptions
      • Default to "keyword key".
      • Detect bind_quoted: usage and call those "quote bound variable".
    • Add interfaces to unify matching of Matched and Unmatched form of operations when the code cares about the operator
      • And
      • UnaryNonNumericOperation
    • Add processDeclarations to support variable and parameter resolution using PsiTreeUtil.treeWalkUp and PsiScopeProcessors
      • ElixirStabBody
      • StabOperations
    • Treat variables and parameters as NamedElements, so they can be Rename Refactored.
    • Move reused Module and Function names to org.elixir_lang.psi.name.{Module,Function} constants.
    • Parameter and Variable completion
  • #318 - Highlight keyword keys (key: in key: value) that aren't quotes ("key": value or 'key': value) as Atom. - @KronicDeth
  • #320 - @KronicDeth
    • Show annotator applied highlights in the Preferences > Editor > Colors & Fonts > Elixir.
      • Errors
      • Alias
      • Braces and Operators
        • Bit (<< and >>)
        • Braces ({ and })
        • Brackets ([ and ])
        • Char Tokens (?)
        • Comma (,)
        • Dot (.)
        • Interpolation (#{ and })
        • Maps and Structs
          • Maps (%{ and })
          • Structs (%{ and } when used for struct. The Alias is still highlighted using Alias)
        • Operation Sign
        • Parentheses (( and ))
        • Semicolon (;)
      • Calls
        • Function (currently only combined with Predefined to highlight Kernel functions. Will be used later for all function calls once function references are implemented.)
        • Macro (curently only combined with Predefined to highlight Kernel and Kernel.SpecialForms macros. Will be used later for all macro calls once macro references are implemented.)
        • Predefined (Combined with Function to highlight Kernel functions. Combined with Macro to highlight Kernel and Kernel.SpecialForms macros.)
      • Escape Sequence
      • Module Attributes
        • Documentation (Previously Documentation Module Attributes)
          • Text (Previously Documentation Text)
        • Types
          • Callback (my_callback in @callback my_callback() :: :ok or my_macro_callback in @macrocallback my_macro_callback)
          • Specification (my_function in @spec my_function() :: :ok)
          • Type
            • typ and integer in @type typ :: integer
            • parameterized in @type parameterized(type_parameter) :: type_parameter
            • typtyp in @opaque typtyp :: 1..10
            • typ and typtyp in @callback func(typ, typtyp) :: :ok | :fail
            • binary and utf8 in << "hello" :: binary, c :: utf8, x = 4 * 2 >> = "hello™1"
        • Type Parameters (type_parameter in @type parameterized(type_parameter) :: type_parameter)
      • Numbers
        • Binary, Decimal, Hexadecimal, and Octal Digits (Previously at top-level.)
        • Decimal Exponent, Mark and Separator (Previously at top-level)
        • Invalid Binary, Decimal, Hexadecimal, and Octal Digits (Previously at top-level.)
        • Non-Decimal Base Prefix (Previously at top-level.)
        • Obsolete Non-Decimal Base Prefix
      • Variables
        • Ignored
        • Parameter
        • Variable
    • Recover in expression until close of subexpression
      • \n
      • \r\n
      • >>
      • ]
      • }
      • )
      • ;
      • ->
      • end
      • after
      • catch
      • else
      • rescue
    • Update Preferences > Editor > Colors & Fonts > Elixir example text's bitstring syntax to Elixir post-1.0.0 (Use - to separate segment options instead of a list.)
    • Use same algorithm for ElixirStabBody and ElixirFile because they are sequences of expressions.
    • Highlight atom keywords (false, nil, and true) as merge of Atom and Keyword text attributes. If both only use foreground color, Keyword wins.
    • Annotate QualifiableAlias as Alias.
    • Highlight keyword list and map keywords (<key>:) as Atom.
    • Add with to highlighted special forms
  • #322 - Additional Text Attributes - @KronicDeth
    • Default text attributes for "Darcula" and "Default" themes: almost every Text Attribute Key has a unique hue for the Foreground color.
    • Explain how to add additionalTextAttributes to plugin.xml in CONTRIBUTING.md
    • Group Textual Text Attribute Keys Together: Next "Textual" group is created and "Character List", "Escape Sequence", "Sigil", and "String" are moved under the group.
    • Describe relations between different text attributes in COLOR_SCHEMA_DESIGN.xml, so they can be applied to different base schemes, such as applying the current Darcula additonalTextAttributes to Default.

Bug Fixes

  • #314 - @KronicDeth
    • Don't generate module attribute references for control attributes: Module attributes that control compilation or are predefined by the standard library: @behaviour, @callback, @macrocallback, @doc, @moduledoc, @typedoc, @spec, @opaque, @type, and @typep, should not have references because their uses are unrelated.
    • Drop requirement that there are 2 children and only require there be 1 and assume that is the Operator.
    • Don't count @(...) as a module attribute usage: Module attribute declarations are defined as defmacro @(...) in Kernel and that @ should count as a function name, not a prefix for a module attribute name.
    • Allow null Module for Scratch File use scope
    • Default to "call" for Call type
    • Fix typo that had *Two operations using Type interface
    • Don't process AccessExpression declarations
  • #316 - @KronicDeth
    • Highlight foo in @spec foo as a type, which occurs while typing a new @spec before :: can be typed.
    • Check if leftOperand is null even when checkLeft is true because checkLeft can be true and leftOperand is null when the lastParent is the operand or operation as a whole, but there is an error in the unnormalized leftOperand leading to the normalized leftOperand being null.
    • Check if reference is null before checking if it resolves to null when replacing module attribute usages with their value because AtNonNumericOperations can have a null reference when they are non-referencing, like @spec.
  • #317 - Leave normal highlighting for char tokens when highlighting types - @KronicDeth
  • #320 - @KronicDeth
    • Stab operation parameter Use Scope is the stab operation.
    • Skip over PsiLeafElement when looking for variables because the PsiLeafElement is an error.
    • In a script file where the parent of a Match is a PsiFile, the Match Use Scope is the rest of the file.
    • Add = to Operator Signs
    • Skip NoParenthesesKeywords when highlighting types, which occurs when the :: has no proper right operand and the following one-liner function clause with do: is parsed as the right operand.
    • Skip DUMMY_BLOCK when looking for Variable, which prevents walking through errors.
    • Use Normalized pattern for Prefix, so that the operand is null when only the operator matches or the operand has errors.
    • Work-around Phoenix .ex templates that contain EEX: if <%= from EEX is detected, don't throw error when Modular can't be found.
    • Fix capitalization error in example text
  • #323 - Build jps-builder using only Java 1.6 compatible .classes - @KronicDeth
    • In IntelliJ 14.1, all of openapi.jar targets Java 1.6 (with MAJOR.MINOR 50.0), but in IntelliJ 2016.1, some of openapi.jar targets only Java 1.8 (with MAJOR.MINOR 52.0), since jps-builders require parts of openapi.jar and must target Java 1.6 even for IntelliJ 2016.1, the 52.0 .classes needed to be ported into org.elixir_lang.jps.builder, so that the 52.0 version in openapi.jar wouldn't be attempted to be loaded.

      This ended up being 5 classes:

      • ExecutionException
      • GeneralCommandLine
      • ParametersList
      • ParamsGroup
      • ProcessNotCreatedException

      Only GeneralCommandLine was used directly, all others are dependencies of it.

Incompatible Changes

  • #320 - @KronicDeth
    • Preferences > Editor > Colors & Fonts > Elixir restructured to group together related highlights and to match grouping used for Colors & Fonts > Language Defaults and Colors & Fonts > Java.
      • Documentation Module Attributes renamed to Module Attributes > Documentation
      • Documentation Text renamed to Module Attributes > Documentation > Text
      • Expression Substitution Mark renamed to Braces and Operators > Interpolation.
      • The following are now nested under Numbers instead of being at the top-level:
        • Binary, Decimal, Hexadecimal, and Octal Digits
        • Decimal Exponent, Mark and Separator
        • Invalid Binary, Decimal, Hexadecimal, and Octal Digits
        • Non-Decimal Base Prefix
        • Obsolete Non-Decimal Base Prefix
  • #322 - "Character List", "Escape Sequence", "Sigil", and "String" are moved under the new "Textual" group. - @KronicDeth
  • #324 - Group Numbers subcategories and lower display name verbosity - @KronicDeth
    • "Numbers > Binary, Decimal, Hexadecimal, and Octal Digits" renamed to "Numbers > Digits > Valid"
    • "Numbers > Invalid Binary, Decimal, Hexadecimal, and Octal Digits" renamed to "Numbers > Digits > Invalid"
    • "Numbers > Non-Decimal Base Prefix" renamed to "Numbers > Base Prefix > Non-Decimal"
    • "Numbers > Obsolete Non-Decimal Base" renamed to "Numbers > Base Prefix > Obsolete > Non-Decimal"

v3.0.1

Bug Fixes

  • #287 - Use the error reporter logger instead of plain assert in Prefix#operator. NOTE: This does not address error recovery recovery since I don't have a regression test case. - @KronicDeth
  • #283 - All function name elements act as PsiNameIdentifiers now even if they don't resolve, but that means they all need to support FindUsagesProvider#getType, which they don't, so use a placeholder of "unknown call type" for any Call that can't be matched and "unknown element" for anything else. - @KronicDeth
  • #284 - Enumerate all Kernel Functions, Macros, and Special Forms in the Syntax Highlighting section of the README, so that users searching for which category controls highlighting a given call can find it. - @KronicDeth

v3.0.0

Enhancements

  • #257 - @KronicDeth
    • Go To Symbol (⌥⌘O)
      • Call definition clauses (def, defp, defmacro, and defmacrop)
      • Callbacks (@callback and @macrocallback)
      • Call definition specifications (@spec)
      • Call definition heads (foo(bar)) for delegation (defdelegate foo(bar), to: BAZ)
      • Implementations (defimpl)
      • Protocols (defprotocol)
    • Go To Declaration for Aliases now uses the same isModular checks as the stubbing for the index uses for Go To Symbol.
  • #263 - Build against 14.0, 14.1, 15.0, and 2016.1 on travis-ci to ensure continued compatibility. - @KronicDeth
  • #273 - Error reporting for type highlighter gives the Class, Excerpt and Full Text when an unknown element type is encountered as the Excerpt alone is not enough sometimes. - @KronicDeth
  • #275 - @KronicDeth
    • Custom error handling that will open an issue against https://github.com/KronicDeth/intellij-elixir with the exception messsage and stacktrace filled in.
    • Changed NotImplementedExceptions and (some) asserts to logging custom error message that include the PsiElement text and the containing file as an attachment. The files make the URL too big for the error handler to put the file contents in when opening the browser with the error handler, so the issue body instead explains how to get the attachment text out of IntelliJ's "IDE Fatal Errors"
  • #276 - Update to Grammar Kit 1.3.0. - @KronicDeth

Bug Fixes

  • #256 - Fix Elixir Mix Run configuration not persisting past restart - @zyuyou
  • #259 - Allow Infix#operator to work on operations with errors, which eliminates the AssertionError reported when typing infix operation and they are incomplete - @KronicDeth
  • #259 - Add Keywords to the Preferences > Editor > Colors & Fonts > Elixir settings page, so it can be customized for just Elixir instead of having to change Preferences > Editor > Colors & Fonts > General > Keyword - @KronicDeth
  • #263 - Ensure compatibility from 14.0 to 2016.1 - @KronicDeth
    • Use TextAttributesKeys that aren't deprecated in 2016.1 and work back to 14.1

      All of CodeInsightColors is deprecated, so all constants from there had to be replaced. Unfortunately, the recommended replacements don't have the same color as the original, so I used different DefaultLanguageHighlighterColors constants for some.

      "Module Attribute" is now based on DefaultLanguageHighlighterColors.CONSTANT (which is purplish in Darcula) instead of the recommended METADATA, which is yellow. Although module attributes don't have to be constant since they can be set to accumulate, often they are used as constants and not really as metadata, since they are just data then. All the metadata uses of module attributes have a separate color.

      "Specification" is now based on DefaultLanguageHighlighterColors.FUNCTION_DECLARATION, which maintains the golden color that CodeInsightColors.METHOD_DECLARATION_ATTRIBUTES had.

      "Type" is now based on DefaultLanguageHighlighterColors.METADATA, which is bright yellow unlike CodeInsightColors.ANNOTATION_ATTRIBUTE_NAME_ATTRIBUTES, which was a bright white.

      "Type Parameter" is now based on DefaultLanguageHighlighterColors.PARAMETER, which unfortunately has no attributes associated with it, but the constant name was too good a fit not to use, so if you want the old color, you'll need to customize it yourself.

    • Restore compatibility with the IntelliJ IDEA 14.0 release line

      • By using reflection to call FileTemplateManager#getInstance if FileTemplateManager#getDefaultInstance is not available
      • By calling FileChooserDescriptorFactory#createSingleLocalFileDescriptor (which works in 14.0 through 2016.1) instead of FileChooserDescriptorFactory#createSingleFileDescriptor (which only works in 14.1 through 2016.1)
  • #264 - Use more human-readable error message for Elixir File action - @KronicDeth
    • Instead of showing the regular expression pattern, which may be confusing to new developers, explain in English the expected pattern. I also included the description, which explains how nesting is mapped to directories, of the action since it doesn't actually show up in the dialog otherwise.
  • #265 - Check if a file exists before allowing Elixir Module to be created. If it exists, show an error with the conflicting path. - @KronicDeth
  • #272 - Fix (one cause) of AssertionError in GoToSymbolContributor when the Modular (defimpl, demodule, defprotocol, and quote) could not be resolved due a def being surrounded by a for comprehension, which is common in Elixir libraries as was the case for Postgrex: any enclosing for comprehension(s) will now be ignored and the next enclosing macro will be checked to see if it is a Modular. - @KronicDeth
  • #273 - While typing, before : in keyword pairs, after the when, such as in @spec foo(id) :: id when id before finishing typing @spec foo(id) :: id when id: String.t, the keyword key will be properly highlighted as a Type Parameter - @KronicDeth
  • #276 - @KronicDeth
    • Properly handle the Infix#rightOperand being null due to the Pratt Parser matching up through the operator and then ignoring the mismatched right operand, which leads to the Infix having only 2 elements: the left operand and the operator.
    • @doc and other module attributes appearing as the right operand of @type name :: will be ignored as it is common when adding a new type above pre-existing, documented functions.
    • Only error in Infix#leftOperand if there are not 2-3 children for Infix instead of a strict 3.

Incompatible Changes

  • #276 - Drop support for IntelliJ 14.0 because the parser generated by Grammar Kit 1.3.0 is not compatible with the OpenAPI libraries shipped in IntelliJ 14.0. Still compatible with 14.1 through 2016.1. - @KronicDeth

v2.2.0

Enhancement

  • #240 - Code Commenter - qertoip
  • #243, #248 - Structure View - KronicDeth
    • Controls
      • Scroll to Source and Scroll From Source
      • Sorting
        • Runtime (functions) vs Compile (macros)
        • Visibility (public [def, macro, etc] vs private [defp, macrop and @typep])
        • Alphabetical
      • Show Used - injects structure from use Alias call's __using__'s quote into the call site Structure
    • Elements
      • Callbacks (@callback) show their name/arity and then a nest spec
      • CallDefinition groups together CallDefinitionClause of the same name/arity
      • CallDefinitionClause (def, defp, macro, and macrop) shows the head of each definition under the CallDefinition.
      • CallDefinitionSpecification (@spec) show the type specification for a CallDefinition
      • CallReference name: arity shows the name/arity for a defoverridable.
      • Delegation shows all the :append_first and :to options with the implied Function Delegation nested underneath
      • Exception (defexception) show the implicit struct and nest any callback functions, such as exception/1 or message/1.
      • Overridable defoverridable tracks overridable functions and is used to mark CallDefinitions are overrides.
      • Quote quote do end models quote blocks so they can be injected use Alias sites.
      • Use use Alias show use calls.
  • #241 - Live Templates - pfitz
  • #220 - Added clarification to "Import Project from External Model" that mix.bat should be used instead of mix - f-lombardo
  • #244 - Get the Elixir version directly from System.build_info[:version] instead of processing the formatted output of elixir --version as the build info version is more stable - KronicDeth

Bug Fixes

  • #244 - Elixir version parsing handles both pre and build numbers if present by using the same regular expression as Elixir itself uses for the Version module - KronicDeth
  • #245 - Better error handling in Structure View - KronicDeth

v2.1.0

Enhancement

  • #236 - \u in strings and char lists for unicode mapping - KronicDeth
  • #237 - Test against Elixir 1.1.1 and 1.2.0 - KronicDeth
  • #233 - More flexible elixir --version parsing: works with elixir 1.2.0 and earlier - bitgamma

Bug Fixes

  • #231 - Update IntelliJ to 14.1.6 to fix 403 errors in Travis-CI build - sholden

v2.0.0

Enhancements

  • #207 - KronicDeth
    • Highlighters for
      • Kernel Functions
      • Kernel Macros
      • Kernel.SpecialForms Macros
  • #219 - Test against Elixir v1.1.1 - KronicDeth
  • #221 - Highlight after, catch, do, else, end, fn, and rescue as keywords - KronicDeth
  • #223, #227 - Annotate Module Attributes - KronicDeth
    • Documentation module attributes (@doc, @moduledoc, and @typedoc) are annotated as "Documentation Module Attributes" while all other module attributes are annotated as "Module Attributes".
    • The string or heredoc argument to a documentation module attribute (@doc, @moduledoc, and @typedoc) is annotated as "Documentation Text"
    • Function names passed to @callback, @macrocallback or @spec are annotated as "Specification".
    • Variables/calls in the parameters and return of @callback, @macrocallback, @spec are annotated as "Type".
    • Parameters of @opaque, @type, @typep names are annotated as "Type Parameter"
    • Keyword keys from the when clause of @callback, @macrocallback or @spec definitions and their usage are annotated as "Type Parameters"
    • @doc false, @moduledoc false, and @typedoc false will annotate the false with a weak warning: "Will make documented invisible to the documentation extraction tools like ExDoc.".
  • #228 - Module attributes resolution and refactoring - KronicDeth
    • Go To Definition for module attributes.
    • Module attribute completion (NOTE: works after typing first character after @. To see all module attributes, type a character after @, then delete the character to get the full list.)
    • Module attributes that can't be resolved will have "Unresolved module attribute" error annotation (i.e. red squiggly underline).
    • Find Usages of module attributes from their declarations.
    • Rename module attributes inline (editing the name in the declaration will change the name at the usage site at the same time without a dialog).
    • The module attribute value (from the declaration site) will be folded into the usage site. It can be reverted to the literal @module_name text by clicking the + to unfold.

Bug Fixes

  • #206 - Change "edition" to "addition" in README. - folz
  • #225 - Sped up reparsing when [ENTER] is hit in the middle of comment by removing the custom error handling element, adjacentExpression, and going with the default error handling provided by JetBrains' OpenAPI. - KronicDeth
  • #226 - Fix mix version detection on Windows - KronicDeth

Incompatible Changes

  • #225 - KronicDeth
    • Removed "Add Newline" Quick Fix as it depended on adjacentExpression elements, which have now been removed to speed up error handling when comments become code.
    • Removed "Add Semicolon" Quick Fix as it depended on adjacentExpression elements, which have now been removed to speed up error handling when comments become code.

v1.2.1

Enhancements

  • #204 - Keywords not at the end of no parentheses calls will be properly marked as errors. - KronicDeth

Bug Fixes

  • #200 - Fix IllegalStateException for file delete and rename by giving ElixirFiles descriptive names for safe-refactoring displaying file usage. - KronicDeth
  • #201 - KronicDeth
    • README states explicitly that the plugin works with both IntelliJ Community and Ultimate.
    • README states that the plugin is free.
  • #202 - Prevent match error when typing ~ to start a sigil that is followed later by a \n by matching EOL in the NAMED_SIGIL state as a BAD_CHARACTER - KronicDeth
  • #204 - Keywords at the end of a no parentheses call that is surrounded by parentheses will not be marked as an error when that parenthetical group appears in the middle of an outer call. - KronicDeth

v1.2.0

Enhancements

  • #184 - If (1) you have intellij-erlang installed and (2) you have an atom in Erlang that starts with Elixir., such as 'Elixir.Test', then intellij-elixir will annotate whether it can resolve the name to a defmodule call in Elixir files. - KronicDeth
  • #188 - Default SDK path for Linux and Windows - zyuyou
  • #198 - KronicDeth
    • Go To Declaration (Cmd+Click, Cmd+B, Navigate > Declaration) from Alias to defmodule where Alias is declared.
    • Index defmodules for fast Go To Declaration in elixir-lang/elixir and other large projects.
    • Find Usage for Alias in defmodule

Bug Fixes

  • #187 - Fix links to screenshots in README - zhyu

v1.1.0

Enhancements

  • #167 - zyuyou
    • Build
      • Compile an individual file
      • Make Project to build the entire project
    • New
      • Elixir File has new templates
        • Empty module
        • Elixir Application
        • Elixir Supervisor
        • Elixir GenServer
        • Elixir GenEvent
      • Project > Elixir creates a new Elixir project with an empty lib directory marked as source directory.
      • Project from Existing Sources...
        • Create project from existing sources sets up the project with SDK using a pre-existing directory.
        • Import project from external model > Mix
          • Fetches the the dependencies with the local version of mix
          • Marks lib directory as source
          • Marks test directory as test sources
    • Run > Elixir Mix to setup Run Configurations to run mix tasks.

v1.0.0

Enhancements

  • #168 - Update ant build on travis-ci.org to use IDEA 14.1.4 (from 14.0.2) - KronicDeth
  • #174 - Parser is verified to quote the same as native Elixir - KronicDeth

Bug Fixes

  • #154 - Fix parsing of unary vs binary +/- with leading and trailing spaces and newlines - KronicDeth
  • #155 - Allow EOL between list arguments and ] - KronicDeth
  • #156 - KronicDeth
    • Relative identifiers after . that start with and, or, and not will be lexed as a single identifier instead of and, or, or not followed by another identifier.
    • end is allowed as a relative identifier after .
  • #157 - Fix (...) as part of matched expression in no parentheses stab signature - KronicDeth
  • #158 - Allow multiple newlines to mark the end of an expression, but only one ; - KronicDeth
  • #159 - Allow operators in function references (<op>/<arity>) for function captures (&<op>/<arity>) - KronicDeth
  • #160 - unquote_splicing is properly wrapped in __block__ when in stab bodies - KronicDeth
  • #163 - Check for matching terminator in heredocs when determining white space type at beginning of line - KronicDeth
  • #170 - Allow + to count as addition - KronicDeth
  • #171 - Unary expressions inside parentheses are no longer marked ambiguous_op: nil - KronicDeth
  • #173 - Differentiate between Qualifier.'relative'() vs Qualifier.'relative' () and Qualifier."relative"() vs Qualifier."relative" () - KronicDeth
  • #176 - Fix link to Elixir website in README - shalecraig
  • #178 - All tokens have human-readable names and/or expected characters for better error messages - KronicDeth

Incompatible Fixes

  • #162 - New Elixir File has moved to the last item in the New File menu to preserve CTRL+N ENTER keyboard shortcut for New > File - jaketrent

v0.3.5

Enhancements

  • #135 - do blocks (`do end) - @KronicDeth
  • #152 - Unmatched expressions (operations involving do block calls and normal matched expressions) - Kronicdeth

Bug Fixes

  • #137 - Lex full atom instead of just identifier-like operator prefix (:in<nospace>dex before vs :index after) - @KronicDeth
  • #138 - ! and not are properly wrapped in __block__s when in stab bodies - @KronicDeth

v0.3.4

Enhancements

v0.3.3

Enhancements

  • #122 - @KronicDeth
    • Remote function calls (Alias.function, :atom.function, etc) and local function calls (function) with...
      • No Parentheses with...
        • No Arguments (Alias.function)
        • Keywords (Alias.function key: value)
        • Nested No Parentheses Call (Alias.function Inner.function positional, key: value)
        • Positional and Keyword arguments (Alias.function positional, key: value)
        • Matched Expression (Alias.function 1 + 2)
      • Parentheses with...
        • No arguments (Alias.function())
        • No Parentheses Call (Alias.function(Inner.function positional, key: value)
        • Keywords (Alias.function(key: value))
        • Positional and Keyword arguments (Alias.function(positional, key: value))
        • Trailing parentheses for quoting (def unquote(variable)(positional))
  • #125 - Bracket expression (foo[key]) - @KronicDeth

v0.3.2

Bug Fixes

v0.3.1

Enhancements

  • #112 - File > New > Project From Existing Sources can be used in IntelliJ to setup the excludes, sources, tests, SDK and libraries for an Elixir project that has already been created with mix new. - @KronicDeth
  • #114 - Operators can be qualified function names - @KronicDeth
  • #118 - @KronicDeth
    • Anonymous function calls (.(...))
    • Inspection that marks errors when keywords aren't at end of list.

v0.3.0

Enhancements

  • #108 - \x is marked as an error in CharLists, CharList Heredocs, Strings, and String Heredocs, but not in any sigils. - @KronicDeth
  • #111 - New Elixir File will automatically underscore the camel case module name when creating the file name and will convert qualifying aliases before the last . to directories - @KronicDeth

Incompatible Changes

  • #111 - New Elixir File validates that the name is a valid Alias, so each . separated part must start with a capital letter. Previous New Elixir File validated that the name was a valid path, and so forced the name to be lowercase. - @KronicDeth

v0.2.1

Enhancements

  • #105 - No parentheses function calls can occur as the right operand in binary infix operations or the sole operand of unary prefix operation. - @KronicDeth
  • #74 - @KronicDeth
    • Function calls with neither parentheses nor do blocks that have at least 2 arguments: a positional argument and keyword arguments or 2 or more positional argument(s) followed by optional keyword arguments.
    • Inspection that marks errors for ambiguous commas
    • Inspection that marks errors for ambiguous parentheses
    • Quick Fix for the ambiguous parentheses to remove the space between the function name and the opening parentheses.
  • #75 - @KronicDeth
    • Inspection that marks errors for missing end-of-expressions (; and newlines) between expressions.
    • Quick Fix to insert ; for missing end-of-expression.
    • Quick Fix to insert newline for missing end-of-expression.

Bug Fixes

  • #74 - Right hand-side of dot_alias and dot_identifier was translated incorrectly. Only Aliases and Identifiers are allowed now. @KronicDeth

v0.2.0

Enhancements

  • #73 - @KronicDeth
  • New attributes for parts of numbers on Color Settings Page
    • Binary, Decimal, Hexadecimal, and Octal Digits
    • Decimal Exponent, Mark, and Separator
    • Invalid Binary, Decimal, Hexadecimal, and Octal Digits
      • 2-9, A-Z, and a-z will be parsed as invalid binary digits
      • 8-9, A-Z, and a-z will be parsed as invalid octal digits
      • G-Z and g-z will be parsed as invalid hexadecimal digits
    • Non-Decimal Base Prefix
      • Any letter other than b, o, or x, in either case, will be recognized as an invalid whole number base
    • Obsolete Non-Decimal Base Prefix (B for binary and X for hexadecimal)
  • Any digit, 0-9, A-Z, or a-z will be parsed as invalid for invalid whole number based numbers
  • Recovery for non-decimal whole numbers if the prefix is given, but no digits are given

Incompatible Changes

  • #73: Number attribute has been removed from Color Settings page - @KronicDeth

v0.1.4

Enhancements

Bug Fixes

  • #17: Sigil terminator escapes are recognized, so that sigils are no longer prematurely terminated. - @KronicDeth
  • #24: Comments do not consume EOL, so trailing comments don't cause error parsing expression on following line. - @KronicDeth
  • #36: Sigil modifiers now work on groups in addition to heredocs. - @KronicDeth
  • #47: ; is separate from EOL and either or both can separate expressions, but only EOL can separate operators and operands for operations - @KronicDeth

v0.1.3

Bug Fixes

  • #10: Blank lines are properly parsed as whitespace instead of bad characters. - @KronicDeth
  • #13: EOL is parsed as bad character in sigil name (after ~) instead of causing the lexer to fail to match, which raised exceptions in Event Log. - @KronicDeth

v0.1.2

Enhancements

  • Atoms with highlighting
  • Atom with double or single quotes to allow interpolation. Double quotes are highlighted as 'String' while single quotes are highlighted as 'Char List'. This may be changed in the future.
  • Literal atoms highlighted as 'Atom'.
  • Operator atoms highlighted as 'Atom'.

v0.1.1

Bug Fixes

  • Build using JDK 6 instead of 7 so that plugin will work by default on OSX Mavericks.

v0.1.0

Enhancements

  • #3: Literal and interpolated sigils with highlighting - @KronicDeth
    • CharList Sigils (~c and ~C) highlighted as 'Char List' in Settings.
    • Regex Sigils (~r and ~R) highlighted as 'Sigil' in Settings. NOTE: Regex syntax is not internally highlighted yet
    • String Sigils (~s and ~S) highlighted as 'String' in Settings.
    • Word Sigils (~w and ~W) highlighted as 'Sigil' in Settings.
    • Custom Sigils highlighted as 'Sigil' in Settings.
    • Modifiers are highlighted on Regex, Word, and Custom while modifiers aren't allowed on CharList and String Sigils.

Bug Fixes

  • Single-quoted strings are correctly referred to as 'Character List' now instead of 'String' in Settings.
  • Double-quoted strings are correctly referred to as 'String' now instead of 'Interpolated String' in Settings.
  • Non-Heredoc CharLists and Strings can be multiline.
  • CharLists and Strings support interpolation and escape sequences.

v0.0.3

Enhancements

  • Single quoted strings with highlighting. ('String' in Color Settings.)
  • Double quoted strings with highlighting. ('Interpolated String' in Color Settings.)
    • Interpolation (#{ and }) with highlighting. ('Expression Substitution Mark' in Color Settings.)
    • Escape sequences for " and # with highlighting. ('Escape Sequence' in Color Settings.)

v0.0.2

Enhancements

  • Binary, Hexadecimal, and Octal numbers (including deprecated syntax) are recognized as numbers.
  • Syntax Highlighting for numbers.
  • Color Settings page for changing the color of comments and numbers for Elixir (Preferences > Editor > Colors & Fonts > Elixir).

Bug Fixes

  • Parser no longer freezes IDE on tokens it doesn't understand.
  • White space at beginning of lines no longer leads to annotation errors.
  • White space and EOLs at beginning of file no longer lead to annotation errors.