Skip to content

Latest commit

 

History

History
2932 lines (2599 loc) · 272 KB

CHANGELOG.md

File metadata and controls

2932 lines (2599 loc) · 272 KB

Changelog

Table of Contents

v11.10.0

Enhancements

  • #1893 - @KronicDeth
    • Simplify onlyTemplateDateFileType
  • #1897 - @KronicDeth
    • Add missing opcodes to Code disassembler
      • OTP 23 opcode bs_start_match4
      • Current (in-development) OTP 24 opcodes
        • make_fun3
        • init_yregs
        • recv_marker_bind
        • recv_marker_clear
        • recv_marker_clear
        • recv_marker_user
  • #1899 - @KronicDeth
    • Log PsiElement if Call#finalArguments contain a null.
  • #1902 - @KronicDeth
    • Suggest ASDF directories as homepaths for both Elixir and Erlang for Elixir SDKs.
  • #1821 - @jacekgajek
    • Run 'Dialyzer based inspections (Elixir)' using Elixir SDK running mix dialyzer or any customized mix command.

Bug Fixes

  • #1893 - @KronicDeth
    • Use VirtualFile#fileType instead of EEx Type::INSTANCE when looking up extensions. Since LEEx file Type is a subclass of EEx's file Type, it calls templateDataFileTypeSet in EEx's Type, but templateDataFileTypeSet uses INSTANCE from EEx. By using the VirtualFile#fileType instead, it will properly be EEx or LEEx based on the actual file extension and then it can be used to strip that off and find the DataTemplateLanguage, such as HTMLLanguage for .html.leex.
  • #1897 - @KronicDeth
    • Compare max opcode in to file to max opcode number, not ordinal. Opcodes are 1-based, but the ordinal of the Kotlin Enums are 0-based, so the comparison was off-by-1 when a file had the max opcode and would be incorrectly marked as too new.
  • #1899 - @KronicDeth
    • Don't return null left or right infix operands in primaryArguments operation.infix.Normalized.leftOperand and .rightOperand ensures that PsiErrorElement is not returned: they can return null when there is no left or right operand. Infix.primaryArguments was not taking this into account and so could return a null as one of the primaryArguments, which broke Call.finalArguments.
  • #1902 - @KronicDeth
    • Don't attempt to execute elixir -e "System.version |> IO.puts" to get the version number as it requires too much of a full SDK to be built and from the Erlang paths to be correct too, which was rarely the case for ASDF. Since for Homebrew and ASDF, the directory name is the version name, this shouldn't be a loss in naming ability. If the directory name is not a parseable version it will be of the format Elixir at <path>. This is probably more correct for installs directories that aren't versioned as SDK versions aren't updated if the version installed at the path changes, such as /usr/local/elixir or /opt/elixir, etc.

v11.9.2

Bug Fixes

  • #1887 - @KronicDeth
    • Protect from nested heredocs in documentation from stopping documentation's heredoc as happens in Module and Ecto.Query.
      • Use ~S for @moduledoc too, in addition to @doc.
      • Check if the documentation contains """ or ''' and use the opposite one as the promoter/terminator.
        • If neither is used, use """.
        • If both are used, use """, but then escape """ as \"\"\".
      • Trim trailing whitespace from documentation lines to match formatter output.
  • #1890 - @KronicDeth
    • Set runIde maxHeapSize to 7g
      • Set to the same I run my own IDE at, so the debugged instance isn't any slower than the normal IDE when I need to do extended all day testing to trigger bugs.
    • Test that all FormattingTest files can be parsed.
    • YYINITIAL is special - wrappers of the lexer assume that if in YYINITIAL, it is safe to shift the lexer over when there is an error, having {OPENING_CURLY} pushAndBegin(YYINITIAL) when it was either in YYINITIAL or INTERPOLATION (https://github.com/KronicDeth/intellij-elixir/blob/36b53331967950453906c3bde9c7f79dc3f9cd2f/src/org/elixir_lang/Elixir.flex#L812) means that the lexer looked like it was restartable when it really wasn't. This code has been in the lexer for 6 years (https://github.com/KronicDeth/intellij-elixir/blame/36b53331967950453906c3bde9c7f79dc3f9cd2f/src/org/elixir_lang/Elixir.flex#L812).
      • When in YYINITIAL, { no longer recurses into YYINITIAL as } does not need to be counted to determine if it is closing an interpolation.
      • When in INTERPOLATION, { enters INTERPOLATION_CURLY to allow counting and matching of } until it can exit and go back to INTERPOLATION, where } will exit the interpolation.
      • When in INTERPOLATION_CURLY, { enters another level of INTERPOLATION_CURLY to allow counting and matching of } until it can exit and go up a level.
    • The } in YYINITIAL did yybegin(ADDITION_OR_SUBTRACTION_MAYBE), but it should have been pushAndBegin(ADDITION_OR_SUBTRACTION) as ADDITION_OR_SUBTRACTION_MAYBE or its following states all exit with handleInLastState() or popAndBegin(). This was not caught in #1859 because the extra YYINITIAL from pushAndBegin(YYINTIAL) hid the bug.
    • Prevent nested YYINITIAL bugs in the future by erroring
      • If trying to pushAndBegin(YYINITIAL).
      • If trying to push(YYINITIAL) and the state stack is not empty
    • Clear the state Stack when ElixirFlexLexer#reset is called, as at the level of typing and pasting, the ElixirFlexLexer is wrapped in many layers of lexers including LexerEditorHighlighter where the ElixirFlexLexer is no longer re-instantiated when there is no text, but instead, ElixirFlexLexer#reset is only called. This has always been an invariant violation since the stack state was added 7 years ago in https://github.com/KronicDeth/intellij-elixir/commit/52cb2fbf6368ba551a4784bd1de49e1fc21c969a. It likely only became more apparent with the changes to +/- parsing in #1859 that made return-to-YYINITIAL less likely.
      • Since this stack.clear() has to be manually added to ElixirFlexLexer.java, which is generated from Elixir.flex, ResetTest is added to check that the code is still there.
    • For a reason I haven't been able to explain, the LexerEditorHighlighter stops working after : is typed at the start of an atom in certain situations, such as before ) inside a function call, like when adding an argument. In this case, the old version of the lexer would mark ) as a BAD_CHARACTER and continue to do so until an expected atom start of [a-zA-Z_], ', ", or an operator occurred. Now, if an invalid atom start is matched, the ATOM_START state ends and the previous state handles the text, which in the function case mean ) is parsed as CLOSING_PARENTHESIS. This change allows the highlighting to continue. I do not know if returning BAD_CHARACTER will always break the LexerEditorHighlighter, but I don't think, so since the GroovyLexer in intellij-community returns it, but it may be the case that it isn't actually returned ever when users are typing and only handled by the lexer for completeness.

v11.9.1

Bug Fixes

  • #1877 - @KronicDeth
    • Fix syntax highlighting stopping due to decompiling of Kernel failing caused by bugs introduced in #1834. Syntax highlighting could fail part way through a file when Kernel needed to be decompiled to resolve parts of the syntax. This would lead to the file to be colored above a certain point, but then the default gray after that point.

      • Connect compiled stubs to decompiled source by name/arity. Previously, when the decompiler didn't use the Docs, it was guaranteed that the PsiCompiled stubs would correlate, in-order, with the decompiled source call definitions, and so mirrors could be set by matching up the list of them in order. Since the Docs doesn't have to correspond to and doesn't correspond to the binary precisely for some BEAMs, most importantly, Elixir.Kernel.beam, the PsiCompiled stub and decompiled source is now matched by name and arity. This means some mirrors are missed, but no errors are produced.
      • Allow decompile source to map to entire arity range Since the decompile source from Docs can have default arguments the call definition clauses can have an arity range and not just a fixed arity, so all arities in the range need to be mappable to PsiCompiled functions.
      • Use correct macro for signature from Docs. Ensures that defmacro is used for macros instead of hard-coding def as in #1834.
      • Use ~S""" for docs from Docs chunk. The docs from the Docs chunk may contain interpolation in the code samples or #{ in regex examples, but these should not be treated as an interpolation start as the Docs format does not support interpolation. Anything that looks like interpolation in the docs text was actually escaped in the original docs, so also escape it here by using S""", which turns off interpolation.
      • Log an error if Code function can't be matched to decompiled source. Unlike the old InvalidMirrorException, this won't be an exception and the binary <-> decompile will still work for the other functions/macros in the file, so it will be a more graceful degradation.
  • 1878 - @KronicDeth
    • Fix missed references to DepsWatcher as project component DepsWatcher was converted to a Project Listener in #1844 to support installing the plugin from the Marketplace without reloading, but some references to DepsWatcher were still trying to get its instance for project using project.getComponent(), which would now return null.
  • #1879 - @KronicDeth
    • Target Java 1.8 for JPS compatibility. JPS (JetBrains Project System) is the API used to allow External Builders, like mix to build projects.
  • #1880 - @KronicDeth
    • Fix matching unquote(ATOM) call definitions to compiled function by using the argument tounquote when calculating the name of the call definition clause if possible. Needed to match anonymous function names that are unquoted because they contain / to separate the outer function name from the anonymous function naming convention.
    • Don't use Docs signature for MacroNameArity that is an operator or unquoted The signatures for operators and unquoted don't produce valid code that can be parsed.
    • Don't use signatures for __struct__ functions. The signatures for the __struct__ functions are like %Module{}, but that's not parseable, so bypass the signatures with a specialized SignatureOverride decompiler that matches the actual code in defstruct.
    • Don't indent empty lines from Docs for @moduledoc and @doc to match the formatter output.
  • #1881 - @KronicDeth
    • Fix capitalization of Docs @moduledoc @moduleDoc -> @moduledoc

v11.9.0

Enhancements

  • #1844 - @KronicDeth
    • Make plugin updatable without a restart when installing from the JetBrains Marketplace. (If installing from file on GitHub you still need to restart due to a limitation in the JetBrains API.). JetBrains refers to this as a Dynamic Plugin.
      • Convert DepsWatcher from project component to project listener
      • Convert Watcher from module component to project listener
      • Make org.elixir_lang.packageManager extension point dynamic
    • Remove unnecessary assert.
    • Replace if with when
    • Include asd tool version Prevent me screwing up the quoter cache using the wrong elixir version again.
    • Update gradle project
      • gradlew 6.7.1
      • org.jetbrains.intellij 0.6.3
      • org.jetbrains.kotlin.jvm 1.3.70
      • de.undercouch.download to 4.4.1
    • Update to GitHub Environment Files
  • #1859 - @KronicDeth
    • Update CI to Elixir 1.11.2 and Erlang 23.1
      • Quoting (for verification of correspondences between plugin and Elixir native lexer and parser.)
        • Port elixir-lang/elixir#9725
          • Indentations for sigil binaries with complex content. Makes sure the indentation metadata is added to sigils that have content with metadata already.
        • Quote charlist the same as string when used for a quoted atom
        • Port elixir-lang/elixir@e89e9d874bf803379d729a3bae185052a5323a85
        • Add sigil delimiter to metadata Ports elixir-lang/elixir#9671
          • Have 3 character delimiter for heredocs
        • Add no_parens: true metadata Port elixir-lang/elixir@8e7befb1087bd37d5acb883e21925b1c0eb0a55f
      • Remove elixir-lang parsing tests for files that don't exist in Elixir 1.11
      • Add missing @Deprecated to match overridden method
      • Format expected and actual quoted Makes the diff not be a one-liner. so easier to spot the difference.
      • Convert Quoter to Kotlin
      • Regenerate Parser for newer GrammarParser version.
      • Port elixir-lang/elixir@1e4e05ef78b3105065f0a313bd0e1e78b2aa973e
  • #1834 - @marcindawidziuk
    • Rewrote the DocumentationProvider so it no longer relies on invoking mix (which I admit was more like a hack than a real solution). This now works so quickly that it actually makes sense to show docs on mouse hover.
      • It can get the documentation from both the source code and decompiled .beam files.
    • Decompilation of documentation was implemented according to EEP-48.
    • The experience on navigating through decompiled file has also been improved a bit
      • See the @moduledoc and @docs
      • See if a function has been deprecated
      • See the original signature of the function (instead of just p0, p1, ...).

Bug Fixes

  • #1844 - @KronicDeth
    • Fix deprecation warnings for IntelliJ IDEA 2020.2
      • Replace fileTypeFactory extensions with fileType
      • Convert fileTypes to Kotlin
      • Replace uses of deprecated Project#baseDir
      • Replace uses of deprecated ContainerUtil.newHashMap
      • Replace defaultLiveTemplatesProvider with defaultLiveTemplates
      • spaceExistanceTypeBetweenTokens replaced with spaceExistenceTypeBetweenTokens
      • Replace ListCellRendererWrapper with SimpleListCellRenderer
      • Replace StdFileTypes.PLAIN_TEXT with FileTypes.PLAIN_TEXT
      • Replace LanguageSubstitutors.INSTANCE with getInstance()
      • Replace ReportMessages.ERROR_REPORT with ReportMessages.getErrorReport()
      • Replace DefaultProgramRunner with GenericProgramRunner
        • Have only one runner for all configurations in plugin since body of runner was all the same for non-debug.
      • Don't override deprecated flushBufferBeforeTerminating()
      • Don't override deprecated acceptsFile
      • Override initExtra(Project) instead of initExtra(Project, MessageBus, Engine)
      • Replace NamedFoldingDescriptor with FoldingDescriptor
        • Convert folding.Builder to Kotlin
      • Replace file with value for @Storage annotation
      • Replace checkBox(fieldName, title) with checkBox(title, getter, setter)
      • Replace com.intellij.util.contains.Predicate with java.util.function.Predicate
      • Replace CodeStyleSettingsManager with CodeStyle
      • Replace Comparing.equal with Objects.equals
      • Replace UsageType(String) with UsageType(Supplier)
      • Replace PluginManager with PluginManagerCore
      • Replace WakValueHashMap with createWakeValueMap
      • Don't pass Pass to LineMarkerInfo
      • Replace newArrayListWithCapacity with ArrayList
      • Replace newIdentityHashMap with IdentityHashMap
      • Replace RefElement#element with #psiElement
      • Pass columnMargin to setupCheckboxColumn
      • Extensions.getExtensions(name) -> name.extensionList
      • Extensions.findExtension -> ExtensionPointName.findExtensionOrFail
      • Object -> Any
      • Replace choseAndSetSdk with SdkPopupFactory
    • Fix error reporting formatting
      • Fix new lines around excerpts so that code blocks quote correctly
      • Use FILE:LINE format for excerpt location, so it can be used in editors for rapid lookup.
      • Separate title from message
      • Remove use of ErrorBean
      • Pass project for LevelPropertyPusher DumbModeTask
      • Don't use constructor injection for SetupSDKNotificationProvider
      • Don't use AnnotationHolder::create* APIs and use AnnotationBuilder instead.
        • Convert Annotators to Kotlin
      • Use logger.error directly instead of LogMessageEx
    • Fix Atom annotator to only annotator within current element. Annotation keyword pair's key and colon instead of annotating the keyword key and the colon outside of it.
    • Fix Macro parsing in DbgI
      • ifAccessToString I missed taking the 3rd element of the tuple to get [Access, :get] and was checking the outer tuple directly.
        • Convert beam.assembly.ParserDefinition to Kotlin
      • ifWhenToString where as should be as?
    • Suppress unused variables for TODO()s
    • Remove unnecessary Line chunk dependency on Atom chunk
    • Switch unused unsignedInt values to _ as Kotlin doesn't support _name
    • Use key instead of environment for computeIfAbsent
    • Replace lambda with constructor reference
    • Remove unnecessary !!s
    • Replace mapIndexed with map because index is unused
    • Remove open that has no effect in object
    • Fix is overrides by converting to Kotlin
    • Remove unused Call from Implementation. and CallDefinitionClause .elementDescription(Call, ElementDescriptionLocation).
    • Don't shadow resolveResultList in addToResolveResultList
    • Remove useless ?:
    • Remove unnecessary != null
    • Fix named argument calling by using super argument name
    • Change Float.from(ByteArray, Int) to TODO() as implementation is invalid.
    • Remove unused ModuleChooserDialog
    • Setup EncodingManager for ParsingTestCase
    • Remove redundant internal
    • Don't highlight resolved callables along with referrers Newest annotation API asserts that the annotator only annotates the PsiElement being visited, so can't highlight the resolved call definitions at the same time anymore.
  • #1859 - @KronicDeth
    • Differentiate signs, unary +/-, and addition/subtraction in lexer. Fix parsing of -1 for case clauses (#1316) by more strictly parsing decimal exponent signs differently than addition/subtraction and differently from unary + and -. No longer have a "dual" operation emitted from the lexer like the Elixir native lexer and instead use specific tokens for each use case so that the parser doesn't need to decide on the operation.
    • Heredoc with escapable newlines (#1843) Heredocs allow the final newline to be escaped so you can write a heredoc in the code, but have no newlines in the string term at runtime.
    • Fix terminators docs to show closing version and not opening version
  • #1866 - @KronicDeth
    • Protect against IndexOutOfBounds from highlighterIterator in QuoteHandler.

v11.8.1

Bug Fixes

  • #1822 - @KronicDeth
    • Vendor JInterface 1.11 to support BIG_CREATION when debugging. The JInterface on Maven Central has stopped being updated because the OTP Team didn't actually maintain it, that was Basho, and Basho is gone now. This version of JInterface, 1.11, is from Erlang 23.0.4 from Homebrew, but with the formula edited (brew edit erlang) to add --with-java and then built with brew install erlang --build-from-source.
  • #1823 - @KronicDeth
    • On Windows, the file.path to the debugger server files has \, but they aren't escaped. Therefore, replace them with escaped version, \\ to fix debugging on Windows, but leave Linux and macOS unaffected.

v11.8.0

Enhancements

  • #1792 - @marcindawidziuk
    • Quick documentation (F1/Ctrl+Q)
  • #1807 - @niknetniko
    • Run Icons in gutter next to ExUnit tests. The icon changes to the state of the test: green for passing and red for failing.

Bug Fixes

  • #1788 - @KronicDeth
    • Fix Unchecking Show Method Separator still showing on @doc and @spec.

      Previously, unchecking Show Method Separator would still show the method separator if it was the module attributes (such as @doc and @spec) associated with the call definition (def, defp, defmacro, or defmacrop) and only disabled the ones directly above the call definition. This is fixed by checking if method separators are enabled in getLineMarkerInfo(PsiElement) instead of the specialized getLineMarkerInfo(Call), so that the check happens for both module attributes and call definitions.

  • #1786 - @odk211
    • Remove "Unresolved module attribute" error annotation because module attributes cannot be resolved through use yet, so current annotation is a false positive in those cases.
  • #1801 - @niknetniko
    • Use SimpleTemplateLanguageFormattingModelBuilder for EEx files, so that the TemplateDataLanguage (i.e. html when the extension is .html.eex) formatter is used instead of the Elixir formatter.

v11.7.0

Enhancements

  • #1781 - @KronicDeth
    • Convert annotator.ModuleAttribute to Kotlin
      • Apply optional Kotlin transformations.

Bug Fixes

  • #1781 - @KronicDeth
    • Check if at least one resolution for module attribute references is valid

      Previously, it was checked if module attributes resolved to exactly one declaration, but this is no longer true with the looser reference resolution that allows invalid results for PisPolyVariantReference. resolve() will return null when there is more than one result from multiResolve even if some are invalid, so we need to explicitly check if the PsiReference is a PsiPolyVariantReference and if so check if any are valid.

    • Fix deprecation warnings for annotator.ModuleAttribute.

    • Quick fixes for inlinables in annotator.ModuleAttribute.

  • #1774 - @odk211
    • Fix iex and erl arguments not being saved for IEx Mix Run Configurations.

v11.6.1

Bug Fixes

v11.6.0

Enhancements

Bug Fixes

  • #1646 - @seanwash
    • Swap improperly sized General.QuestionDialog icon for RunConfigurations.TestUnknown icon for Unknown icon in Structure View.
  • #1632 - @ortex
    • Fix MODULENAME variable in defm live template, so that the file name is camel-cased before being capitalized.
  • #1643 - @zrma
    • Update README.md about information for Goland IDE since has been released for awhile and no longer only an EAP.
  • #1735 - @KronciDeth
  • #1738 - @Koziolek
    • JetBrains IDEs 2020.1 compatibility
      • Change obsolete references to AllocIcons in Icons to new ones in AlllIcons that are recommended in documentation.
      • Update to @NotNull annotation on PsiElementVisitor
        • DepGatherer
        • QuotableImpl.quote
  • #1745 - @KronciDeth
    • Fix tests for IDEA 2020.1.
  • #1753 - @KronciDeth
    • Get ProjectImportProvider builder in doGetBuilder instead of constructor.

      Fixes use of deprecated constructor dependency injection that is incompatible with dynamic, injectable plugins in 2020.1.

      com.intellij.diagnostic.PluginException: getComponentAdapterOfType is
      used to get org.elixir_lang.mix.project._import.Builder(
        requestorClass=org.elixir_lang.mix.project._import.Provider,
        requestorConstructor=protected org.elixir_lang.mix.project._import.Provider(org.elixir_lang.mix.project._import.Builder)
      ).
      
      Probably constructor should be marked as NonInjectable. [Plugin: org.elixir_lang]
      
  • #1685 - @gerritwalther
    • Allow underscores in binary (0b), octal (0o) , and hexadecimal (0x) numbers.

v11.5.0

Enhancements

  • #1630 - @KronicDeth
    • Ignore the incompleteCode flag and instead always use the criteria used when incompleteCode was set.

      name prefix exact name ResolveResult valid
      N/A N/A

      This extends #1617 to more cases.

      • Qualified calls (Process.flag(...), etc)
      • Type specs (@spec foo(...))
      • Aliases (alias Foo...)
      • Module Attributes (@attribute)
      • Variables (foo)
      • Protocol reserved module attributes (@protocol and @for)

Bug Fixes

v11.4.0

Enhancements

  • #1617 - @KronicDeth

    • Previously, the arity of a function or macro could only disagree with the definition and resolve if
    1. The arity of the call was in the arity range of the defintion and the ResolveResult was marked as a validResult.
    2. The code is marked as incomplete (because the IDE detects typing, etc) and the arity mismatches and the ResolveResult is marked as an invalid result.

    By marking all arity mismatches, regardless of incompleteness of the code as an invalid result, Go To Definition and Show Parameters works when the the arity is incorrect. This males Show Parameters work while typing out a call without the correct number of commas and allows jumping to the definition while typing out the call too.

v11.3.0

Enhancements

Bug Fixes

  • #1607 - @hoodaly
    • Fix must specify non-empty 'commandLine' parameter
  • #1608 - @KronicDeth
    • GeneralCommandLine's escaping for Windows can't handle the parentheses in a way that both works for the Windows shell and Elixir running the code the shell hands off. Removing the parentheses leaves runnable code even if it is no longer formatted.

      Fixes "Unknown Version" naming for Elixir SDKs and the "Probably SDK installed in ... is corrupt" dialog from appearing.

v11.2.0

Enhancements

Bug Fixes

  • #1589 - @KronicDeth
    • Don't error on runtume in mix deps. guardian is too common of a dependency and too many users have the version with the typo installed.
  • #1569 - @chitacan
    • Fix IEx Mix Run/Debug Configuration for asdf by using absolute path to mix.
  • #1595 - @KronicDeth
    • Add OTP 22 and 23 opcodes to Code BEAM Chunk Viewer
      • put_tuple/2
      • bs_get_tail/3
      • bs_start_match3/4
      • bs_get_position/3
      • bs_set_position/2
      • swap/2

v11.1.0

Enhancements

  • #1587 - @KronicDeth
    • Update gradle plugins
      • gradle-intellij-plugin (org.jetbrains.intellij) to 0.4.10
      • org.jetbrains.kotlin.jvm to 1.3.50
      • de.undercrouch.download to 4.0.0
    • Update IDEA version in builds
      • 2019.2 -> 2019.2.2

Bug Fixes

  • #1582 - @KronicDeth
    • Don't log if partial or no header typeID is read. It happens too often due to .beam files being written partially to disk during the build process. They will be re-indexed when they are complete.
  • #1587 - @KronicDeth
    • Update gradle intellij plugin to fix runIde on newer macOS.
  • #1588 - @KronicDeth
    • Fix ConcurrentModificationException in Structure View

      Java 9 fixed a bug (https://bugs.openjdk.java.net/browse/JDK-8071667) in HashMap where computeIfAbsent did not check for concurrent modifications, and it turns out that TreeElementList was using concurrent modifications, so it was now broke.

      Fixed by use get or put if it is absent, so that putNew can ensure that the CallDefinition is in the TreeElementList before it is added to the MutableList<TreeElement>, which was the original reason why there was a put inside of computeIfAbsent, which would have put when the function returned anyway.

v11.0.1

Bug Fixes

  • #1548 - @KronicDeth
    • The java plugin dependency needs to be declared so that it shows up for compiling the JPS builder system and the project importer in IntelliJ and Android Studio, but it needs to be optional, so that the plugin is still compatible with Rubymine and the other small IDEs.

v11.0.0

Enhancements

  • #1545 - @KronicDeth
    • Simplifications due to only supporting IntelliJ 2019.2
      • Don't use reflection for error report Submitter
      • Don't use deprecated WeakHashMap. It was needed for backwards compatibility, but since this build is for 2019.2 only, no compatibility is necessary and it clears up the long warnings from the logs for end users.
      • Remove reflection from OutputToGeneralTestEventsConverters. Only 2019.2 is now supported, so no need for complicated backwards compatibility.
      • Only support IntelliJ 2019.2 in Travis CI
    • Remove Elixir 1.5 and 1.6 builds as they are both > 1 year since the last release approximately.

Bug Fixes

  • #1545 - @KronicDeth
    • IntelliJ 2019.2 compatibility
      • Explicitly depend on java plugin. 2019.2 extracted the Java functionality to a plugin (as outlined here), which includes the JPS builder used for Project Build functionality.

      • Remove project converterts. Project converters are broken in 2019.2 because the DialogWrapper they try to launch isn't being launched in the Event Dispatch Thread (EDT) (https://youtrack.jetbrains.com/issue/IDEA-218071).

        As this is bug in code wholey controlled by upstream, the only option is to remove the project converters. The work-around is for users to re-import projects when a project layout update is necessary.

      • Fix nullability of override arguments in ChooseByNameModel

      • Don't use dependency injection for OpenProcessor builder. JetBrains has removed dependency injection for Extensions in 2019.2.

      • Don't pass a null name ot findSdk

Incompatible Changes

  • #1545 - @KronicDeth
    • Changes needed for 2019.2 compatibility make this build incompatible with earlier releases.

v10.6.0

Enhancements

  • #1492 - Add Linux Mint Erlang and Elixir home paths to SDK home path suggestions. Linux Mint installs to /usr/lib/erlang and /usr/lib/elixir instead of /usr/local/lib/erlang and /usr/local/lib/elixir. - @KronicDeth

Bug Fixes

  • #1491 - @KronicDeth
    • Elixir 1.8 made :elixir.quoted_to_erl/3 private, so in Elixir 1.8+, the debugger needs to inline the private version to maintain < 1.8 and >= 1.8 compatibility.
    • Reformat debugger for Elixir 1.8

v10.5.1

Bug Fixes

  • #1483 - @KronicDeth
    • Numerous users have reported that annotation can encounter a StackOverflowError. A reproduction case shows that they are called by Phoenix Web modules where one function containing quote block uses the same module again, such as an admin_view depending on the base view through use App.Web, :view. When the use App.Web, :view is resolving, the defmacro __using__ is re-entered as is the admin_view because there was no tracking of already visited PsiElements. The fix is to track the visited elements and not re-enter the visited elements so that admin_view is skipped and the other call definition clauses can be checked to find view.

v10.5.0

Enhancements

  • #1445 - @KronicDeth
    • Replace comparator with Comparator.reverseOrder()
    • The correct home path for kiex is ~/.kiex/elixirs/elixir-VERSION/lib/elixir as that contains the true lib and bin directory, but users may select other directories by mistake, so doing the following adjustments:
      • Adjust bin home path to lib/elixir.
      • Adjust elixirs/elixir-VERSION home path to elixirs/elixir-VERSION/lib/elixir.
  • #1462 - Use reflections to allow saving settings when creating the projects before in 2018.3 and 2019.1 even though the API changed. - @KronicDeth

Bug Fixes

  • #1443 - @KronicDeth
    • In RubyMine, attach OTP applications as separate projects with Elixir facets instead of directly creating ELIXIR_MODULE modules in DirectoryConfigurator. This matches the manual steps of opening the OTP apps as separate directories after opening the root of the project.
      • Mark directories when adding facet
      • Sync libraries when adding facet or attaching to root project. Ensures External Libraries show up for all OTP applications.
    • Convert Small IDE projects with ELIXIR_MODULEs:
      1. Remove ELIXIR_MODULE *.iml files
      2. Remove ELIXIR_MODULE entries root project's modules.xml file.
      3. Lack of modules in project in doOpenProject will trigger DirectoryProjectConfigurators to be run, which will setup the project and run DirectoryConfigurator to attach the apps OTP apps and Elixir facets.
        • Only support automatic attaching multiple OTP apps as separate projects in Rubymine. In IntelliJ normal support for multiple Modules in one Project still works.
  • #1444 - Increase suspect nameSet size to 15 to support geo. geo has 13 String.Chars implementations. - @KronicDeth
  • #1445 - @KronicDeth
    • Remove obsolete SdkType. I keep confusing it with its replacement org.elixir_lang.sdk.elixir.Type!
    • Check that HomePath has ebin paths when validation. Prevents selecting false HomePaths for kiex.
  • #1446 - Adding missing ESpec template. When reviewing #1410 I missed that the template wasn't in resources. 🤦‍♂️ - @KronicDeth
  • #1447 - Ignore targets when calculating Dep path. - @KronicDeth
  • #1448 - Ignore organization when calculating Dep path. - @KronicDeth
  • #1449 - Get view provider document in read action. - @KronicDeth
  • #1450 - Support rebar.config deps that are name only. - @KronicDeth
  • #1456 - Always use containingFile for QualifiableAlias maxScope for getReference. Prevents cache capturing maxScope, which can vary based on invocation. - @KronicDeth
  • #1462 - @KronicDeth
    • Create new project before attaching it in Small IDEs. When attaching a directory to a project during startup, saving is disallowed, so the attached directory only has a workspace.xml in its .idea when the attach is attempted. Attaching requires the .idea/*.iml Module file, so the attaching fails, saying the directory is an unsupported format.

      Experimentation showed that manually attaching the directory also did not work, but opening the directory in a separate window, then opening and attaching it again would make the directory have the full project files. To mimic this manual process:

      1. The internals of doOpenProject are copied
      2. A save of the project files is forced, bypassing the normal "startup" save blocker
      3. The project is attached to the root project.

      Tested to work when upgrading from 10.4.0 to 10.5.0-pre in Rubymine when no project was already open.

    • Check if project can be attached instead of if RubyMine Although GoLand supports attaching projects, it doesn't work for non-Go projects, so it is also excluded. How the support appears in each non-IntelliJ IDEA is shown below:

      IDE Works?
      Android Studio YES Android Studio is built on top of IntelliJ, so it has full multi-Module support. It is not Small IDE.
      CLion NO No Attach to Project support to multiple module support.
      DataGrip No DataGrip doesn't have a Project View and doesn't support Attach to Project. You can still run tests if you directly open the file.
      GoLand NO Modules show up, but independent projects are not attached as in other Small IDEs, so disabled. In general, the Go settings, like Test Runners always win, so it is recommended to not use GoLand at all for Elixir development.
      PHPStorm YES The projects are listed in Directories. The Languages & Frameworks > Elixir shows all 3 projects. Right-clicking on the marked Test directory will not show the Elixir Run Configuration, Python ones win, but subdirectories and *_test.exs will show up in the context menu.
      PyCharm YES The root project is listed in Project. app/* projects are listed listed as Project Dependencies of the root Project. The Languages & Frameworks > Elixir shows all 3 projects. Right-clicking on the marked Test directory will not show the Elixir Run Configuration, Python ones win, but subdirectories and *_test.exs will show up in the context menu.
      Rider No Solution system is separate from Project system.
      Rubymine YES The projects are listed in Project Structure. The Languages & Frameworks > Elixir shows all 3 projects. Right-clicking on the marked Test directory will not show the Elixir Run Configuration, Python ones win, but subdirectories and *_test.exs will show up in the context menu.
      WebStorm NO No Attach to Project support or multiple module support.
    • Don't count Android Studio as a Small IDE. It includes Project Structure menu with multiple-language, multiple-Module per Project support from IntelliJ.

v10.4.0

Enhancements

Bug Fixes

  • #1410 - @KronicDeth
    • Only show Run/Debug ExUnit when *_test.exs files exist.
    • Only show Run/Debug ESpec when *_spec.exs files exist.
  • #1415 - Wrap UnqualifiedNoArgumentCall.quote identifier.text in runReadAction. - @KronicDeth
  • #1419 - Fix typos in CONTRIBUTING.md - @nschulzke
  • #1420 - Prevent the module attribute annotator from running in EEx files. - @nschulzke

v10.3.0

Enhancements

Bug Fixes

  • #1408 - @KronicDeth
    • Cache all computed Elixir levels at the file, module, project, and SDK levels. The computed Elixir level is used to determine how to emulate the various grammar changes made for the different Elixir versions. This bug was potentially introduced as earlier asv7.0.0 (2017-12-15) and as late as v7.5.0 (2018-06-03) as that's the history for LevelPropertyPusher.java and has affected all later versions. If you ever experienced the 6.X series as faster than the 7.X series and later, this bug may be why and you should upgrade/reinstall immediately.

v10.2.0

Enhancements

  • #1353 - @KronicDeth
    • Improve support for umbrella projects in Small IDEs like Rubymine by creating a separate module for each mix.exs when opening a directory (DirectoryConfigurator). This matches the pre-existing support in Rich IDEs (IntelliJ Community & Ultimate Edition) when using Import From External Model and Quick Import when opening a directory.
    • Ignore assets directory when looking for mix.exs files for Import From External Model, Quick Import and Directory Configurator.
  • #1355 - @KronicDeth
    • Update Build Matrix
      • Add 2018.3.
        • Update gradlew to 5.0.
        • Update org.jetbrains.intellij to 0.3.12.
        • Update org.jetbrains.kotlin.kvm to 1.3.10.
          • Update Kotlin apiVerision to 1.3.
        • Update de.undercouch.download to 3.4.3.
        • Don't configure Kotlin in projects that don't use it.
      • Remove 2017.3 to keep version count at 3.

Bug Fixes

  • #1355 - Prevent ConcurrentModificationExceptions when updating gradle by using allprojects less. - @KronicDeth
  • #1359 - @KronicDeth
    • Remove unused variables in Elixir debugger server.
    • Protect from AssertionError when VirtualFileCache is disposed.
  • #1360 - Protect from AssertionError when VirtualFilePointerContainer is disposed. - @KronicDeth
  • #1364 - Use :path for deps for paths external to project. Unfortunately, even though they show up in the Project Structure, only ebin directories are shown as it is restricted to those marked as CLASSES and the :path lib is a SOURCES. - @KronicDeth
  • #1367 - Ignore :tag when finding path to dep. - @KronicDeth
  • #1368 - No longer use the forked version of TerminalExecutionConsole as 2018.3's version doesn't have the text echoing behavior that was being bypassed before. - @KronicDeth
  • #1372 - Ignore :ref when finding path to dep. - @KronicDeth

v10.1.0

Enhancements

  • #1330 - @KronicDeth
    • Add IntelliJ Elixir Help to Help menu that opens link in browser using plugin version to link to README.md on GitHub.

      screen shot 2018-11-02 at 12 06 52 pm

      The link will work on released versions that have a tag.

  • #1334 - @KronicDeth
    • Allow creating ExUnit.Case modules from template. Template contains
      • use ExUnit.Case
      • alias of the source module
      • @moduletag :capture_log
      • doctest
      • test that checks that the source module exists.
    • Convert CreateElixirModuleAction to Kotlin.
    • Drop "Elixir" prefix from templates name in Elixir File dialog since you already know you're creating an Elixir File.

Bug Fixes

  • #1327 - Fix deadlinks to Run Configurations, which broke when section was renamed Run/Debug Configurations and auto-anchor changed name. - @KronicDeth
  • #1328 - Fix image links in README. - @KronicDeth
  • #1331 - Ensure defmodule one-liner isn't mistaken for call definition head in Go To Symbol. - @KronicDeth
  • #1336 - Wrap packagePisToDepSet in read action because checking the validity of the dependencies requires a read action. - @KronicDeth

v10.0.1

Bug Fixes

  • #1322 - @KronicDeth
    • Eliminate freezes when calculating Module and Library dependencies during project import and dependency updates.
      • Run library syncing in tasks: When importing projects, run sync as a modal task while when VirtualFileSystem events occur, run sync as background tasks. Either style of task is cancellable and importantly, it allows to show what is happening during the syncing. This converts the unresponsive UI beachball on macOS during import to an updating progress bar.
      • Calculate dep sets iteratively with a work queue instead of recursively to limit the calculation of dep set for a root to 1 time. Then use normal transitive walk to get complete dep set for module. Vastly speeds up project import.
      • Cache dep set on package PsiFile to allow faster refreshes when indirect dependencies don't change.
  • #1323 - @KronicDeth
    • Log nameSet when it reaches suspect size (10) to allow triaging if it is a real bug or just something with a lot of valid names.
    • Fix inverted condition around when to warn and when to error and use readAheadLength.

v10.0.0

Enhancements

  • #1272 - @KronicDeth
    • Go To Symbol and completion will only resolve in project source unless non-project sources are turned on.
      • deps are properly marked as Libraries and no longer count as being in the project scope for the Go To tools.
      • In umbrella projects, when in_umbrella is used, the Project Module for each apps/#{APP_NAME} will be marked a dependency,
      • Library and Modules are properly connected as dependencies, so that only declared dependencies will resolve, lessening false completions and declarations when different OTP app share common Module or function names.
    • deps and the _build/#{MIX_ENV}/lib/#{DEP_NAME} will be marked as Excluded, so that Libraries appear in External Libraries at the bottom of the Project Pane.
  • #1275 - @KronicDeth
    • Go To Class action (Cmd+O) to go to modules separately from all functions as would happen with Go To Symbols (Alt+Cmd+O).
      • New ModuleName index keeps track of only the names of modulars:

        • defmodule
        • defimpl
        • defprotocol

        It is used to power gotoClassContributor for Go To Class action.

  • #1280 - Handle commit and override for Mix.Dep. - @KronicDeth
  • #1283 - Add .eex to .ex and .exs for accepted file extensions used to hyperlink files in stacktraces. - @KronicDeth
  • #1285 - @KronicDeth
    • Resolve unaliased name when using alias __MODULE__, as: Mod
    • Resolve usage of Mod in alias __MODULE__, as Mod
      1. Mod
      2. __MODULE__ in alias __MODULE__
      3. defmodule MyModule that is enclosing __MODULE__.
    • Disable ProcessCanceledException for runIde gradle task, to allow for easier manual testing of completion and Go To actions during development.
    • Completion of functions in current module when using Mod. after alias __MODULE__, as: Mod.
    • Show more context for alias calls in presentations, like "Choose Declaration" pop up for Go To Declaration.
      • Show resolved __MODULE__ name (alias MyModule) when using alias __MODULE__.
      • Show full alias MyModule, as: Mod when listing Mod in alias __MODULE__, as Mod.
  • #1293 - @KronicDeth
    • Exclude common directories when importing projects
      • cover for test coverage
      • doc for ex_doc
      • logs for log files
      • assets/node_modules/phoenix for phoenix
      • assets/node_modules/phoenix_html for phoenix_html
    • Setup Libraries and Module dependencies when importing projects from Mix.
  • #1299 - Regression test for #1270. - @KronicDeth
  • #1313 - @KronicDeth
    • Update gradle wrapper to 3.5 to allow for environment variable overrides
    • Setup datetime based pre-release versioning to ensure that correct version of pre-release plugin is used when testing Install Plugin From Disk.
  • #1318 - @KronicDeth

Bug Fixes

  • #1277 - Don't include null useCall as __MODULE__ dependency. - @KronicDeth
  • #1279 - @KronicDeth
    • Wrap LibraryTable#removeLibrary in write action.
    • Wrap Library#modifiableModule#commit in write action.
  • #1282 - Check if Mix.Dep has already been seen to prevent recursive loops. - @KronicDeth
  • #1287 - @KronicDeth
    • More closely match ExUnit.CliFormatter output in Test Runner.
      • Don't inspect ExUnit failure reason as ##teamcity message.
      • Add captured logs to failure
      • Colorize test failures - including diff colorization
    • .formatter.exs input globs would not match file paths because it was default that needed lib on top and not version-dependent paths used in resources/exunit.
  • #1291 - @KronicDeth
    • Ignore branch and hex options when finding path of Mix.Dep
    • Map Elixir 1.7 :excluded and :skipped (added in elixir-lang/elixir#7245) to testIgnored teamcity message, thereby restoring ignored test counts and markers from Elixir 1.6.
  • #1293 - @KronicDeth
    • When the entire deps directory has updated sync the children deps directories and then sync all modules instead of syncing them after each dep.
    • For an unknown reason, when sync occurs at initComponent time in DepsWatcher or mix.Watcher, the child directories of the project basedDir aren't shown in the Project Pane until a change is applied in Project Structure.
    • Use invokeAndWait instead of invokeLater to ensure order of syncs.
  • #1299 - When finding a defmodule, check that it is an ancestor of the entrance of the ResolveState, so that nested sibling modules are not scanned for potential call definition clauses, but only the outer module of the entrance. - @KronicDeth
  • #1300 - Improve error message for org.elixir_lang.debugger.settings.stepping.module_filter.editor.table.Model.getValueAt, so we can detect if there is an off-by-1 error. - @KronicDeth
  • #1304 - Remove @2x and @3x SVG icons that render wrong size in 2018.3 EAP. - @KronicDeth
  • #1305 - @KronicDeth
    • Fix unused variables in TeamCityExUnitFormatting
      • reason was completely unused.
      • details should have been used.
  • #1306 - @KronicDeth
    • flushBufferBeforeTerminating was deprecated and in newer IntelliJ the call to processStatuses does not occur unless flushBufferOnProcessTermination is also overridden.
    • Treat == Compilation error in STDOUT as ERROR for ExUnit reporter
    • Convert (CompileError) of a test file to test failure. The "Test framework quit unexpectedly" is converted to a failed run with a single test with the compilation error as the failure message.
  • #1308 - @KronicDeth
    • Don't treat redefinition of defmodule macro as module definition (as occurs in @bitwalker's distillery's Mix.Tasks.Release.Init.MixMock
      • Bump AllName VERSION to re-index and drop bad call definition head from #1301.
  • #1310 - Don't log compilation errors as test failures unless a test has started. Test name being called mix test does not work, so log those compilation errors as normal build messages instead. - @KronicDeth
  • #1311 - Don't interpret :crypto by default: :crypto includes NIFs that can't be reloaded and so kills the debugger. - @KronicDeth
  • #1312 - Protect from null containingFile for modular names during completion. - @KronicDeth
  • #1313 - Wrap syncPublisher(JDK_TABLE_TOPIC) in invokeLater runWriteAction. - @KronicDeth

Incompatible Changes

  • #1272 - @KronicDeth
    • Dependencies are now counted as external to the project, so the Go To tools, like Go To Symbol will no longer include matches for both project sources and dependencies sources together, instead they will follow the more JetBrains native behavior
      • Project sources will be shown by default
      • If there are no project matches, dependencies will be shown instead.
      • If you want to include dependency (non-project) matches, you can check the box or hit Cmd+O.
  • #1293 - Modules and Libraries won't be automatically setup when a project or module is opened, but instead only when apps or deps directories or subdirectories change. - @KronicDeth

v9.0.0

Enhancements

  • #1255 - @KronicDeth
    • Resolve calls through use AnAlias calls
      1. AnAlias will be resolved to its modular (module, implementation, or protocol)
      2. The __using__ macro in the modular is found
      3. The last call in __using__ is checked
      • If it is a quote block, check for call definitions recursively inside the block

      • If it is an apply/3 call

        1. Resolve the first argument as a modular
        2. Scan for each function in modular
        3. In each function Goto Step 3 above

        This handling is what specifically makes use MyAppWeb, :controller in Phoenix apps now work.

      • If it is a general call

        1. Resolve the call to its definition
        2. Goto Step 3 above
  • #1259 - @KronicDeth
    • Go To Related (Ctrl+Cmd+Up) can be used to Go To the decompiled Module or call definitions when on a source modular (defimpl, defmodule, or defprotocol) or callable (def, defp, defmacro, defmacrop). This somewhat restores the ability to go to both source and decompiled module and calls before 9.0.0, but now the source is preferred for Go To Declaration and the decompiled will only be available if there is no source and if you definitely want decompiled, you'll need to use Go To Related.

Bug Fixes

  • #1245 - Specify that Kotlin Plugin is needed in CONTRIBUTING.md, so IntelliJ plays nice. - @sfat
  • #1246 - @KronicDeth
    • Resolve unqualified bracket operation identifiers (var in var[key]) to variables or 0-arity calls.
      • Fixes renames of variables not renaming usage of variables for Access lookups (i.e. var[key]).
  • #1248 - @KronicDeth
    • Go To Symbol will no longer show redundant entries
      • Call Definitions (name/arity) is no longer shown if the Call Definition Clause is also included. This isn't a large loss because the /arity was not searchable and only part of the presentation.
      • If there is a decompiled and a source version of a symbol, only the source version will be shown.
        • The source Implementation will be shown and not the decompiled Module with the same fully-qualified name (<protocol>.<for>).
      • Items will be deduped if they point to the same element, such as function clauses with default arguments because when presented they look the same even if internally one is representing /1 and /2, for example.
  • #1249 - Ensure that Go To Declaration for qualified calls such as Module.function(...) where Module is an alias does not return the decompiled version of Module when the source is available. - @KronicDeth
  • #1256 - @KronicDeth
    • Fix completion not working for unqualified functions from imports.
      • When I switched to using ?.let I accidentally hid the if from running when there was no ENTRANCE_CALL_DEFINITION_CLAUSE, so the correct form is add if there is no entrance or if there is a non-equivalent entrance.
      • I just straight up forgot an ! on a contains check. I moved to computeIfAbsent, so it is more obvious what the intent is.

Incompatible Changs

  • #1248 Go To Symbol and Go To Declaration will no longer suggest decompiled modules or functions if source modules or functions of the same name or module/name/arity exists. - @KronicDeth

v8.1.0

Enhancements

Bug Fixes

  • #1233 - Look above Enum.reduce for enclosing macro call. - @KronicDeth
  • #1234 - @KronicDeth
    • Add Facet SDK as External Library to re-enable indexing. When the External Library was removed in 4297287 in favor of a real SDK, completion for SDK .beam modules was lost because Small IDEs don't index SDKs, but only External Libraries, so add Application-wide External Libraries for SDKs when they are created (and update, remove on edit or delete), which are then added as a Dependency for the facet's module when the SDK is set for the Small IDE project.
      • Convert old modules with Elixir facets to also have External Library, so that users don't need to remove and add the SDKs to get the External Library.
  • #1237 - @KronicDeth
    • Use #AEB9C0 for JetBrains Default/Light Gray. Use #87939A for JetBrains Darcula Gray. Colors based on IntelliJ's color picker picking its own colors.

      Icon matching testing done under both themes in 2018.2.1. Weirdly, the colors are different in the SVGs in my intellij-community@master. Hopefully, this doesn't mean the colors change again in 2018.3.

  • #1244 - @KronicDeth
    • Run createLibrary inside runWriteAction.
    • Remove test that leaks threads and so causes builds to fail.

v8.0.0

Enhancements

  • #1175 - @KronicDeth
    • New and improved Run/Debug Configurations
      • Distillery Release CLIs for running console, foreground, etc Options for configuring each part of the command line
        • Path to Release CLI
        • Release CLI arguments (like a command console)
        • Settings that are normally hidden in environment variables
          • erl arguments (ERL_OPTS)
          • elixir -extra arguments (EXTRA_OPTS)
          • Code Loading Mode (CODE_LOADING_MODE)
          • Log Directory (RUNNER_LOG_DIR)
          • Replace OS Vars (REPLACE_OS_VARS)
          • sys.config file (SYS_CONFIG_PATH)
          • Release Config Directory (RELEASE_CONFIG_DIR)
          • Pipe directory (PIPE_DIR)
        • Use Pseudo-Terminal (PTY) to allow overriding console type when it can't be inferred from the Release CLI arguments, such as using PTY for console because it uses an iex-like shell.
        • Working Directory
        • Environment Variables
      • iex console with proper PTY support (colors, tab completion, history) Options for configuring each part of the command line
        • iex arguments
        • erl arguments
        • Working Directory
        • Environment Variables
      • elixir with colors Options for configuring each part of the command line
        • elixir arguments
        • erl arguments
        • Working Directory
        • Environment Variables
      • mix tasks getting expanded options to match the new configurations
        • mix arguments, which used to be called "Program Arguments" (I figured out how to customize that name. 😉)
        • elixir arguments
        • erl arguments
        • Working Directory
        • Environment Variables
      • iex -S mix Options for configuring each part of the command line
        • mix arguments
        • iex arguments
        • erl arguments
        • Working Directory
        • Environment Variables
      • mix test
        • mix test arguments, which used to be called "Program Arguments"
        • elixir arguments
        • erl arguments
        • Working Directory
        • Environment Variables
    • Debugger enhancements
      • All the above configurations can be debugged using the debugger. It is no longer restricted to only working with mix-based configurations.
      • Filter more common dependency modules from being interpreted by default.
        • credo
        • inch_ex
        • earmark
        • ex_doc
      • More ways to filter interpreted modules
        • Run Configurations now have an Interpreted Modules tab, next to Configuration, which by default imports the Application-wide settings, but allows
          • Disabling inherited filters
          • Adding configuration-specific filters
          • Remove configuration-specific filters
        • Allow interpreted modules to be uninterpreted when the debugger is running, using the "Interpreted Modules" tab.
      • Improved Variables pane by showing the Elixir name of variables instead of Erlang names
      • Evaluate can evaluate an Elixir expression in any stack frame.
  • #1192 - @KronicDeth
    • Add all OTP 21 opcodes to disassembler. Previous opcode set was frozen prior to OTP 21 release and missed some later additions.

      number name Added
      160 build_stacktrace Before OTP 21 release
      161 raw_raise Now
      162 get_hd Now
      163 get_tl Now
  • #1196 - @KronicDeth
    • Spell checking for identifiers, aliases, comments, and literals (charlists, strings, and sigils).
      • Dictionaries for common dependencies
        • Elixir
        • Ecto
  • #1203 - @KronicDeth
    • Elixir 1.7 debugger Variables and Evaluate compatibility
      • Elixir 1.7 names Erlang variables like _<elixirVariableName>@<counter> while Elixir 1.6 used V<elixirVariableName>@<counter>
      • Elixir 1.7 changed elixir_erl record and %Macro.Env{}, which changed how :elixir.quoted_to_erl needed to be called.
  • #1208 - Update 2018.2 to 2018.2.1 in build matrix. - @KronicDeth
  • #1210 - Regression test for #1141 - @KronicDeth
  • #1212 - Improve Cannot Create SDK error message (additions in bold): "You need to configure an Erlang SDK for Elixir SDK. Click OK to be take through the Erlang SDK configuration. Click Cancel to stop configuring this SDK AND the Erlang SDK." - @KronicDeth
  • #1223 - Convert mix and mix test run configurations to new format. - @KronicDeth

Bug Fixes

  • #1188 - Show ... for module name when Dbgi has no module name as happens for instrumented modules from IEx.break/4. - @KronicDeth
  • #1189 - Don't assume callDefinitionClause is non-null. - @KronicDeth
  • #1190 - Don't assume parent of list access expression is QuotableKeywordPair- @KronicDeth
  • #1191 - Don't assume parent of keywords is a list. - @KronicDeth
  • #1208 - TerminalExecutionConsole itself echos input in 2018.2 and 2018.2.1, which was introduced in https://github.com/JetBrains/intellij-community/commit/fd7bbd0cb7f3c2a5add8872e0e6c5172be5f074a#diff-5acc2eb2e78fe52d7458d4a48b0eac9f, but it was reverted in JetBrains/intellij-community@5f4465b, so this uses that version to maintain compatibility across supported versions. - @KronicDeth
  • #1210 - In Phoenix.Router.Helpers, a quote block appears as the head of [head | tail] list, so add support for search for enclosing macro call above |. - @KronicDeth
  • #1213 - Treat EEx tag the same as StabBody for use scope. - @KronicDeth
  • #1214 - Use ATOM for keyword keys instead of IDENTIFIER_TOKEN as ATOM allows for @, which is needed for correctness. - @KronicDeth
  • #1215 - In eachEbinPath, the ebin directories were found by iterating <SDK_HOME_PATH>/lib and then iterating grandchild of that, so that all paths matching <SDK_HOME_PATH>/lib/<APP>/ebin would be added, but for some installs from source, like SDK, there are non-OTP-app files in <SDK_HOME_PATH>/lib, so filter <SDK_HOME_PATH>/lib/<APP> to only directories. - @KronicDeth
  • #1216 - org.elixir.lang.psi.scope.Module.aliasedName(QualifiedAlias) was already converted to use org.elixir_lang.psi.operation.Normalized and org.elixir_lang.psi.infix.Normalized, which makes it work with errors in the PSI tree, so there's no need protect with an assert and that assert would be wrong in times of errors handled by Normalized. - @KronicDeth
  • #1217 - org.elixir_lang.reference.module.UnaliasedName.down(PsiElement) only expects ElixirAccessExpression or QualifiableAlias, but for unexpected classes of elements, it was a simple Kotlin TODO(), which didn't log anything useful for enhancements. Replace the TODO() with an org.elixir_lang.errorreport.Logger.error, so that the element's class and content can be reported when this happens again. - @KronicDeth
  • #1164 - Use / in paths passed to Erlang, even on Windows - @notriddle

Incompatible Changes

  • #1175 - Drop support for IntelliJ IDEA before 2017.3 as they lack the TerminalExecutionConsole used to run iex in a PTY. - @KronicDeth

v7.5.0

Enhancements

  • #1055 - Refactor ElixirPsiImplUtil into separate files tied to specific classes or interfaces to shrink its size. - @KronicDeth
  • #1073 - Complete #{ with }. - @KronicDeth
  • #1109 - @KronicDeth
    • Read Write Accessor Detector
      • Variable/Parameter declarations/rebindings are highlighted as writes while other usages are highlighted as reads.
    • Improved Find & Show Usages
      • Added Find & Show Usages for Functions at declaration and usage site
        • Multi-clause functions use all clauses as targets and find usages of all clauses.
      • Improved Find & Show Usages for Modules/Aliases
    • Improved Element Descriptions
      • It is easier to distinguish aliases and the defmodule that is being aliased because element description now include alias or defmodule before the Alias name based on how the Alias is defined in the scope.
      • Call definitions use the same presentation for Structure View and Find Usages, so that Compile/Runtime time icons, and visibility are the same in both.
  • #1111 - Regression test for #1091 - @KronicDeth
  • #1120 - Add regression tests for #1116 that test that parameter and variables can be renamed. - @KronicDeth
  • #1124 - Update IntelliJ versions in build matrix to include 2018.1 and latest patch version of other versions. - @KronicDeth
  • #1126 - @KronicDeth
    • Add Elixir 1.6.X to build matrix
    • Update grammar and quoter to match native 1.6 behavior when SDK is >= 1.6.
    • New default SDK level is 1.7 to handle builds from master.
  • #1127 - Regression test for #1105 - @KronicDeth

Bug Fixes

  • #1056 - Certain .beam files in the OTP source are purposely invalid, so ignore them when trying to parse and don't log the expected error. - @KronicDeth
  • #1060 - Log available bytes and total size when header is not FOR1. - @KronicDeth
  • #1071 - erl_abstract_code format Dbgi chunks can now be navigated similar to how elixir_erl format Dbgi chunks can be navigated. Instead of converting the Erlang Abstract Code back to Erlang, which would not be highlighted if intellij-erlang and requires the user to know Erlang, the Erlang Abstract Code is translated back to Elixir source, so you can use the Dbgi chunk view to translate Erlang to Elixir. - @KronicDeth
  • #1111 - Allow zero or more new lines after the struct name before the opening curly brace ({). - @KronicDeth
  • #1112 - @KronicDeth
    • In order to prevent Access is allowed from event dispatch thread only errors when creating read-only code editor in subtabs of the BEAM Chunks editor, only create those editors when their parent tab is selected.

      Affected tabs:

      • Code (Elixir & Erlang)
      • ExDc
      • Dbgi (Elixir & Erlang)
  • #1114 - Check for suffix instead of full match to detect predefined macros when annotating. Location strings have become more complex, such as including the file path for root level modules, so the old exact matching on the module name no longer works. - @KronicDeth
  • #1120 - Restore parameter and variable rename. It broke because the changes to make Find Usages work and have Go To Declaration default to Find Usage when there is only one target disabled the default selected element code that the VariableInplaceRenameHandler used. - @KronicDeth
  • #1121 - @KronicDeth
    • Allow module attribute declaration to resolve to itself, so that unused module attributes don't say they can't find the declaration.
    • Restore rename module attributes.
  • #1127 - Allow true and false to be keyword keys. - @KronicDeth

v7.4.0

Enhancements

  • #1036 - @KronicDeth
    • Clean up debugger
      • mix format debugger
      • Restructure debugger.
      • Convert IDE-side to Kotlin
    • Allow files to skip interpreting in the debugger to be configured in Preferences > Build, Execution, Deployment > Debugger > Stepping. It is recommended to customize these settings instead of using INTELLIJ_ELIXIR_DEBUG_BLACKLIST environment variable. INTELLIJ_ELIXIR_DEBUG_BLACKLIST should be reserved to additional modules that need to not be interpreted only for specific runs.
      • Ship a set of patterns that excludes Elixir standard library by default and most mix phx.new dependencies, so that debugger boots faster for most users.
    • Support debugging .eex templates
      • Detect MFAs that refer to template functions in Phoenix view modules derived from .eex template files, to allow stepping through Elixir tags in those templates.
      • Allow setting breakpoints in .eex files when a .beam file using the template's relative can be found. This means that the Phoenix view module .beam file must exist in _build prior to setting a breakpoint. Run the Run Configuration once, before debugging to complete the build if setting a breakpoint does not work.
        • .beam files are now indexed by their Line chunk filenames subsection to power this feature.
    • Cache .beam Beam Cache on VirtualFile. Cache is invalidated and refreshed on modification of the VirtualFile. Cache is used for both BEAM Chunks read-only editors and Line chunk file name index.
  • #1037 - Each package manager uses a different root path and which directory to pick above the ebins varies by package manager, so document package manager install paths. - @KronicDeth
  • #1041 - @KronicDeth
    • Restructure JPS code to remove prefixes and suffixes in class names that redundant with package names.
    • Show warnings-as-errors checkbox as original blocker has been fixed for awhile and ProcessAdapter turns warning text into errors that IDE understands.
  • #1045 - @KronicDeth
    • When importing Mix projects, don't exclude compiler output from indexing because it is needed to resolve Elixir Line Breakpoints in EEx files.
      • For pre-existing Elixir modules, they will be converted to not exclude compiler output.
  • #1047 - @KronicDeth
    • Exclude known uninterpretable modules
      • Bcrypt.Base
      • :erocksdb
      • :lz4
      • :re2

Bug Fixes

  • #1036 - @KronicDeth
    • Turn off dbeug flag when starting IntelliJElixir.DebugServer, which removes the *DBG* statements that kept printing in the ExUnit output when using the debugger.
    • Fix conversion of Elixir module names to Erlang module names for INTELLIJ_ELIXIR_DEBUG_BLACKLIST environment variable.
    • Cache null SDK Release, so that when Elixir is configured, but the Erlang path is broken (such as after a brew unlink erlang, the Release calculating using elixir
    • Implement Macro.atomToString
    • Properly render improper lists
      • Show improper list with explicit | for presenation
      • Children of improper lists show head and tail instead of index.
    • Show Elixir indices (0-based) instead of Erlang indices (1-based`) for lists and tuples.
  • #1037 - Loosen check on the path suffix by looking for only lib and not lib/erlang/lib, so that it works for both Homebrew's ebin paths and ASDF's ebin paths. - @KronicDeth
  • #1041 - @KronicDeth
    • Remove unused MixBuilder because building with mix is just an option in ElixirBuilder.
    • Harmonize JPS compile server's invoking of mix to pattern used in Run Configuration runners.
      • Use mix path from SDK
    • No longer say the build succeeded when there are obvious mix errors
      • Parse mix compile output for compilation errors and warnings
        • When "warnings-as-errors" is enabled in "Elixir compiler" settings, IDE also shows warnings as errors.
        • IDE will know build failed if there are errors (or warnings treated as errors) and properly allow rebuild.
  • #1045 - @KronicDeth
    • Group alternatives in erlang_module_name_patterns_to_regex before pinning: I always forget that the | swallows the ^ and $ in regexes.
    • Reject vs filter accumulation got flipped when switching to Enum.reduce to track rejections.
  • #1047 - @KronicDeth
    • Some modules, like NIF modules, can't be loaded into the debugger. Individual modules not being debuggable shouldn't kill the debugger task, so rescue the known error and record it for later debugging of the debugger.
    • Add : to start of Erlang module names for included debugger excludes

v7.3.0

Enhancements

  • #988 - @KronicDeth
    • Update build matrix
      • Update IntelliJ IDEA version 2017.3 to 2017.3.2
      • Update Elixir version 1.5.2 to 1.5.3
  • #1015 - @KronicDeth
    • Add supplemental file editor for .beam files: "BEAM Chunks". The decompiled binary file will continue to be shown on the default "Text" editor tab. screen shot 2018-02-01 at 6 38 07 pm The BEAM Chunks editor is subdivided into further tabs, one for each chunk in the .beam file. screen shot 2018-02-01 at 6 45 23 pm The tabs are listed in the order that the chunks occur in the .beam file.
      • The Atom chunk holds LATIN-1 atoms while AtU8 holds UTF8 atoms. There will only be one of these atom-related chunks in any given .beam file. AtU8 is used in newer versions of OTP that support UTF8 atoms.

        The Atom/AtU8 tab shows a table with the columns

        Column Description Source
        Index Which is 1-based to match Erlang convention. In the Code chunk, atom(0) is reserved to always translate to nil Derived
        Byte Count The byte count for the atom's bytes Raw
        Characters From encoding the bytes as LATIN-1 for Atom chunk or UTF-8 for AtU8 chunk Derived

        screen shot 2018-02-01 at 7 01 43 pm

        Index 1 is always the module name for the .beam file. Since .beam is originally an Erlang format, for Elixir modules, you'll see the full atom name of with the Elixir. prefix instead of the Alias name used in Elixir source.

      • The Attr chunk holds the module attributes, but only those that are persisted.

        The Attr tab shows a table with the columns

        Column Description Source
        Key Attribute name Raw
        Value Attribute value. Note: The value always appears as a list as read from the binary format. I don't know why. Raw

        screen shot 2018-02-02 at 2 34 22 pm

        All modules will have a :vsn attribute that is either set explicitly or defaults to the MD5 of the module.

      • The CInf chunk is the Compilation Information for the Erlang or Erlang Core compiler. Even Elixir modules have it because Elixir code passes through this part of the Erlang Core compiler.

        The CInf tab shows a table with the columns

        Column Description Source
        Key Option name Raw
        Value Inspected value Raw

        screen shot 2018-02-02 at 3 19 50 pm

      • The Code chunk contains the byte code for the module. It is encoded in BEAM Compact Term Encoding, which differs from the binary format produced by term_to_binary.

        The Code tab shows a read-only editor with one byte code operation on each line. For ease of reading, operations are grouped by function and then label block with indentation indicating scope.

        screen shot 2018-02-02 at 9 35 59 pm

        By default as many references to other chunks and references to other parts of Code chunk are inlined to ease understanding. If you want to see the raw byte code operations, you can turn off the various inliners.

      • The Dbgi chunk contains Debug Info. It was introduced in OTP 20 as a replacement for the Abst chunk. While the Abst chunk was required to contain the Erlang AST, the Dbgi format can contain the debug info for other languages, such as Elixir quoted form AST.

        Because the format is language neutral, the format is a set of nested, versioned formats. The outer most layer is

        {:debug_info_v1, backend, metadata | :none}

        For :debug_info_v1, Elixir's backend is :elixir_erl. The metadata for :elixir_erl is further versioned: {:elixir_v1, map, specs}.

        map contains the bulk of the data.

        Key Value
        :attributes Attributes similar to the Attr chunk, but at the Elixir, instead of Core Erlang level. Usually they match with the exception that attributes doesn't contain vsn when Attr contains the MD5 version
        :compile_opts Compilation options similar to CInf chunk's options key, but at for Elixir, instead of Core Erlang level.
        :definitions The Elixir quoted AST for reach function clause.
        :file The name of the file the module was generated from.
        :line The line in :file where the module was defined, such as the line defmodule occurred.
        :module The name of the module as an atom
        :unreachable Unreachable functions

        The Dbgi tag show the single value map entries: :file, :line, and :module

        screen shot 2018-02-02 at 5 26 04 pm

        For the multi-value keys: :attributes, :compile_opts, and :definitions, there are individual tabs.

        screen shot 2018-02-02 at 5 27 29 pm

        The Attributes tab has the same format as the Attrs chunk

        screen shot 2018-02-02 at 6 47 49 pm

        The Compile Options tab is usually empty, much like the CInf options key for Erlang.

        screen shot 2018-02-02 at 6 48 34 pm

        The Definitions tab is split between a tree of Module, Function/Arity and clauses.

        screen shot 2018-02-02 at 6 50 14 pm

        Clicking on a clause will show only that clause, but clicking on a higher level in the tree will show all clauses in the function or the entire Module.

        screen shot 2018-02-02 at 6 53 17 pm

        screen shot 2018-02-02 at 8 47 05 pm

        screen shot 2018-02-02 at 8 47 20 pm

        The AST stored in the definitions tab and the process of converting it back to code is not format preserves, so it will not look precisely like the source code as the AST has undergone some macro expansion before its put in the Dbgi chunk. As common idioms are understood, reversals will be add to the renderer.

      • The ExDc chunk stores ExDoc. Not the rendered HTML from the ex_doc package, but the the @doc, @moduledoc, and @typedoc attribute values that work even without ex_doc installed. This chunk is what is consulted when the h helper is used in iex.

        The ExDc binary format is from term_to_binary, so it can be reversed with binary_to_term. The term format is a versioned as {version, versioned_format}. The current version tag is :elixir_docs_v1 and the versioned_format is a Keyword.t with :callback_docs, :docs, :moduledoc, and :type_docs keys.

        Like Dbgi, the ExDc tab is split between a tree to navigate and an editor to show the decompiled value.

        screen shot 2018-02-02 at 8 58 38 pm

        screen shot 2018-02-02 at 9 07 03 pm

        Node Description
        Root All docs
        Module @moduledoc
        Types All @typedocs
        Types child A specific @typedoc
        Callbacks All @callback @docs
        Callbacks child A specific @callback's @doc
        Functions/Macros All @docs for functions/macros
        Functions/Macros child A specific function/macro's @doc
      • The ExpT chunk is the Export Table. The name "Export" derives from the Erlang module attribute -export, which is used to "export" functions from a module. It is the equivalent of making a function or macro public with def and defmacro as opposed to making it private with defp and defmacrop in Elixir.

        The ExpT tab shows a table with the columns

        Column Description Source
        Atom Index Index into the Atom or AtU8 chunk for the function's name Raw
        Name The atom referenced by "Atom Index" Derived
        Arity The arity (argument count) of the function Raw
        Label Label index in the Code chunk where the function is defined. This label is usually immediately after the func_info operation and before the first pattern match or guard operation. Raw

        screen shot 2018-02-01 at 8 21 13 pm

        You'll notice the first entry starts with MACRO-. This is because the BEAM, being made for Erlang has no concept of macros. It only understands functions, so Elixir macros, like __using__/1 called by use are compiled to plain Erlang functions with MACRO- prefixed to their name and an extra argument (the __CALLER__ environment) as the first argument, which increases the arity, yielding a full MFA of MACRO-__using__/2 as seen above.

      • The ImpT chunk is the Import Table. It DOES NOT encode just the Erlang -import attributes or Elixir import macro calls: it tracks any external function or macro called from another module. call_ext_* operations in the Code chunk don't store the Module and Function (MF) of the function they will call directly in the bytecode, instead, one of the arguments is an index into the ImpT chunk. This way, all external calls are normalized into the ImpT chunk instead of being denormalized to the call site. The arity still appears at the call site to help with checking the argument count.

        The ImpT tab shows a table with the columns

        Column Description Source
        Index 0-based index used by references in the Code chunk. Derived
        Module Atom Index Index into the Atom or AtU8 chunk for the Module's name Raw
        Module Atom The atom referenced by "Module Atom Index". Derived
        Function Atom Index Index into the Atom or AtU8 chunk for the functon's name Raw
        Function Atom The atom referened by "Function Atom Index". Derived

        screen shot 2018-02-01 at 8 07 15 pm

        You may notice that erlang.byte_size/1 is included in the table. This is because even bifs are referenced by MFA and not a pre-assigned number as would be the case for system calls in operating systems like Linux. BEAM is like an Operation System, but not in all ways.

      • The LitT chunk contains literals loaded as arguments in Code chunk. Confusingly, in the Code chunk sometimes the literal(N) term is used to encode integer N, an index into another chunk, or an actual index into the LitT. How literal terms are handled is completely dependent on the specific operation, so without having outside knowledge about the bytecode operation arguments for BEAM, the best way to figure out if literal terms are an integer or an index is to toggle the various controls in the Code tab to see if literal with no inlining turns into a LitT literal, FunT function reference, ImpT function reference, or integer.

        The LitT tab shows a table with the columns

        Column Description Source
        # 0-based index used by references in the Code chunk. Derived
        Term The equivalent of `raw > binary_to_term()

        screen shot 2018-02-01 at 9 25 07 pm

      • The LocT chunk is the dual to the ExpT chunk: it contains all private functions and macros.

        The LocT tab shows a table with the columns

        Column Description Source
        Atom Index Index into the Atom or AtU8 chunk for the function's name Raw
        Name The atom referenced by "Atom Index" Derived
        Arity The arity (argument count) of the function Raw
        Label Label index in the Code chunk where the function is defined. This label is usually immediately after the func_info operation and before the first pattern match or guard operation. Raw

        screen shot 2018-02-01 at 9 27 49 pm

        You'll notice the first entry -__struct__/1-fun-0-, starts with - and have a / suffix with fun in it. This naming scheme is used for anonymous functions such as those defined with fn or the capture operator (&) in Elixir. Much like how macros don't really exist and use a MACRO- suffix, anonymous functions/lambdas don't exist, and instead use a distinct naming scheme -<PARENT_FUNCTION>/*fun*. Unlike MACRO-, which is an Elixir invention, anonymous functions/lambdas really being local named functions with derived names is also done in pure Erlang modules. Erlang's anonymous functions are defined with fun, which is where the fun part of the naming scheme comes from.

      • The StrT chunk contains a single contiguous pool of all Erlang strings (that is, Elixir charlists) used in the Code chunk. These strings are used for byte code operations like bs_put_string. Not all strings appear in StrT. Some strings, including most Elixir strings (Erlang binaries) appear in the LitT chunk that holds literals.

        screen shot 2018-02-01 at 7 56 15 pm

        The StrT is contiguous with no separation of strings. Instead of encoding the start and length of each string in the chunk itself, the start and length for any given string is passed as arguments to the byte code operations in the Code chunk. By doing this, shared substrings can be efficiently encoded in StrT.

  • #1021 - @KronicDeth
    • Support for https://github.com/elixir-lang/elixir/commit/23c7542d95683a497a7b93071b9ccbbeb9e45d2f

      Version Struct Started Event Finished Event %ExUnit.Test{} field
      < 1.6.0 %ExUnit.TestCase{} :case_started :case_finished case
      >= 1.6.0 %ExUnit.TestCase{} :module_started :module_finished module

      Because Elixir 1.6.0 could not introduce a breaking change, the < 1.6.0 event are fired, but resources/exunit/1.6.0/team_city_ex_unit_formatting.ex will ignore them and only convert the >= 1.6.0 event to TeamCity event used in the JetBrains Test Runner UI.

  • #1018 - Expose Declarations > Functions and Declarations > Macros in Color Settings - @dimcha

Bug Fixes

  • #1019 - Don't use StreamEx because support is inconsistent across IDEs - @KronicDeth
  • #999 - @ronanboiteau
    • Jetbrains' Gogland is now named GoLand, updated README accordingly
    • In donors list, Garrett Hart had his GitHub URL (@https://github.com/thirdshift) shown instead of his GitHub username (@thirdshift)

v7.2.1

Bug Fixes

  • #980 - Use documentionRootType to indirectly get the documentation OrderRootType in the Erlang SDK Type, so that it works in Small IDEs that have more than CLASSES and SOURCES root types installed. - @KronicDeth
  • #981 - @KronicDeth
    • The credo annotator is disabled by default as numerous users find running mix credo in the background has a negative impact on their system performance. If you like to try enabling the annotation, you can turn it on using the configuration.

      1. Preferences > Editor > Inspections > Elixir
      2. Check "Credo"
      3. Click OK to save and close Preferences

      If you notice a degradation the in the responsiveness of the editor, it is recommended you disable the annotator again.

      1. Preferences > Editor > Inspections > Elixir
      2. Uncheck "Credo"
      3. Click OK to save and close Preferences
  • #982 - Protect from PsiFile being null in Local credo inspector - @KronicDeth
  • #983 - Run Qualified#moduleName getText in Read Action. - @KronicDeth
  • #985 - Scratch Files have a Project, but not a Module, so change flow to use Project when Module is null in credo annotator. - @KronicDeth
  • #986 - Don't add .bat to mix on Windows. mix is never run as an executable. It is either run as a script to elixir.bat OR as an argument to erl.exe when erl.exe is running elixir. - @KronicDeth

v7.2.0

Enhancements

  • #963 - mix runs will be faster as they will no longer check to see if the SDK is updated. - @KronicDeth

Bug Fixes

  • #963 - Avoid problems with read and write locks when updating Elixir SDK on-demand by instead updating them when any project is open using a project converter. - @KronicDeth
  • #964 - JetBrains/intellij-community@9adbba0 added @NotNull to OrderRootType.getOrderRootType, which JavaDocRootType.getInstance calls, which means any Small IDE using intellij-community since 4 months ago, including the newest CLion cannot have JavadocOrderRootType.getInstance safely called. - @KronicDeth
  • #966 - Path changes were not being written back to disk because the projectSdksModel.apply() was being called before the editor.apply(), which would have copied to the editor's path changes to the projectSdksModel. - @KronicDeth

v7.1.0

Enhancements

  • #955 - @KronicDeth
    • Start using Kotlin for new development.
    • Elixir Facet in Small IDEs
      • Preferences > Languages & Frameworks > Elixir can set the Elixir Facet SDK for the Project Module used in Small IDEs as a per-project settings.
      • Preferences > Languages & Frameworks > Elixir> SDKs can add, delete, and configure Elixir SDKs as per-application settings.
      • Preferences > Languages * Frameworks > Elixir > Internal SDKs can add, delete, and configure Erlang SDK for Elixir SDKs as per-application settings.
    • Configure SDK before running mix when importing mix projects, so that the mix path does not need to be configured separately from the SDK path.
      • The mix path no longer needs to be setup independently from the Elixir SDK.
  • #957 - Add Local shared credo inspection, so the the credo inspection works for Code > Code Cleanup. - @KronicDeth
  • #958 - @KronicDeth
    • Show Mix ExUnit in context menu in Elixir Facets, so that

      • Run 'Mix ExUnit ...'
      • Debug 'Mix ExUnit ...'
      • "Create "Mix ExUnit ...'"

      appear in Rubymine when you right-click the test directory and it is Marked as a Test Sources Root. It will appear green in Rubymine if already marked. To mark it, do the following:

      1. Right-Click test directory
      2. Select "Mark Directory as > Test Sources Root"

Bug Fixes

  • #955 - @KronicDeth
    • Protect access to JavadocOrderRootType.getInstance() so that it doesn't cause an error in Small IDEs where its Extension Point is not defined.
    • If the explanation tooltip is empty, fallback to the message for the credo annotator instead.
  • #956 - Check if SdkAdditionalData is null before getting ErlangSDK as it can be null in certain scenarios in Rubymine. - @KronicDeth
  • #958 - @KronicDeth Fix isConfigurationFromContext, so that it works on Mix ExUnit Run Configurations generated from directories. Check if the programParameters and workingDirectory match by just generating another configuration from the context as this ensures the logic matches and includes support for PsiDirectory.

v7.0.0

Enhancements

  • #944 - @KronicDeth
    • Eliminate the majority of the eolStar parser rules around operators where they do not matter leaving only the eolStar after COMMA and the the ones that help differentiate unary and binary +/-. This simplifies the parser and under certain conditions should prevent reparsing when only WHITE_SPACE changes in size.
      • Look-ahead in the lexer, where it's cheaper than the parser to see if the next token does not care if there's an EOL or normal WHITE_SPACE.
      • After operators that don't care if they are followed by EOL, try to match all following WHITE_SPACE, ESCAPED_EOL and EOL.
  • #950 - @KronicDeth
    • If you want to limit the performance impact of the credo annotator because mix credo spikes your CPU, you can limit the number of mix credo runs to 1 per open file by disabling the Explanation tooltip

      1. Preferences > Editor > Inspections > Credo
      2. Uncheck "Include Explanation"

      If you don't want the annotator to run at all on open editors, then you can disable the paired inspection

      1. Preferences > Editor > Inspections
      2. Uncheck Elixir > Credo

      If you've unchecked the inspection, it disables both the annotation and the pair inspection when Analyze > Inspect Code... is run. You can still run the Credo inspection by name.

      1. Analyze > Run Inspection By Name... (⌥⇧⌘I)
      2. Type "Credo"
      3. Select "Credo" from the shortened list
      4. Hit Enter.

      You'll be presented with a "Run 'Credo'" dialog

      1. Change the "Inspection scope" from "Whole project", which would include the deps to "Custom scope"
      2. Select "Project Production Files" from the "Custom scope" dropdown
      3. Click "OK"
  • #951 - @KronicDeth
    • Setup VirtualFilePointerManager during ParsingTestCase
    • Put LineMarkerInfo on leaf elements for Method (Call Definition) Separators for a performance improvement.
    • Add IntelliJ IDEA 2017.3 to the build matrix

Bug Fixes

  • #947 - When the SDK changes, record what Release of Elixir is used indirectly, using a Level enum that only cares about the major and minor version. Changing the Level, will mark the open files and .beam files as invalidated, so that if the SDK is changed, the stubs and code Level will agree, so there isn't a stub incompatibility with the PSI. - @KronicDeth
  • #950 - Allow credo section to be empty when processing credo explanations - @KronicDeth
  • #951 - @KronicDeth
    • Prevent negative indent, not supported in 2017.3
    • Cleanup SDKs from MixProjectImportBuilderTest

Incompatible Changes

v6.7.0

Enhancements

  • #943 - @KronicDeth
    • Regression test for #580
    • {EOL}|. -> {ANY} in Elixir.flex
    • Convert (some) unimportant newlines from EOL to WHITE_SPACE token, as GrammarKit is smarter about reparsing when only WHITE_SPACE changes in size.
      • After
        • fn
        • do
        • ->
        • block identifier (after, catch, else, and rescue)
        • keyword pair colon
        • (
      • Before
        • Comments

Bug Fixes

  • #943 - @KronicDeth
    • Remove !stabOperationPrefix before expression, since stabOperationPrefix itself starts with expression and instead put a negative look-ahead, !(infixComma | stabInfixOperator) after expression. This now works when it previously didn't because COMMA was added to expressionRecoverUntil, which means both COMMA and STAB_OPERATOR are now in both not eaten by expression's error recovery.

      This drops Fn1 through Fn8 to ~176ms instead of the previous time of the last optimization of 13 seconds for Fn8. It started at 26 seconds and now it appears that the time no longer grows with the number of fn. It also eliminates the pause when hitting entering inside the fn nesting.

      Data and Chart

v6.6.0

Enhancements

  • #923 - @KronicDeth
    • EEx support
      • Lexer for EEx format
      • Parser for EEx format
      • EEx as a Template Language
        • Any file with .eex as the final extension will be treated as EEx. To determine the Template Data Language, the .eex extension will be stripped and any remaining extension will be looked up to get the File Type and its associated Language. For example, *.txt.eex will be EEx with Plain Text (.txt) as the Data Template Language. Likewise, *.html.eex will be EEx with HTML as the Data Template Language. There's no need to register *.txt.eex or *.html.eex or any other *.DATA_TEMPLATE_LANGUAGE_EXTENSION.eex pattern explicitly: the nested extension will be looked up using the normal extension setup.
    • Update Build Matrix
      • IDEA 2016.2 is dropped because it's over a year old. It is still supported, but not actively tested.
  • #931 - Decompile LocT chunk for private macros and functions and the derived names of anonymous functions. - @KronicDeth

Bug Fixes

  • #910 - mix hex.local --force -> mix local.hex --force in README - @bryanhuntesl-lowpriv
  • #930 - @KronicDeth
    • Parse HEAD-<SHA1> as 0.0.<SHA1> for sorting versions from homebrew homepath. It will almost always be last unless there is an unknown version, which uses 0.0.0.
    • Ensure any unparsable version sorts as 0.0.0 (UKNOWN_VERSION).
  • #932 - @KronicDeth
    • Look at parent of eexTag to resolve fn parameters
    • Ensure functions fn in eex tags don't error by looking at eex element parent.
    • Search above eexTag and eex to determine if variable.

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 event, so that only event 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.