Compatible with: IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion GoLand DataGrip Rider MPS Android Studio
Mar 18, 2019
199 191


Elixir support for JetBrains IDEs

  • IntelliJ IDEA
  • AppCode
  • CLion
  • Gogland
  • PhpStorm
  • PyCharm
  • Rubymine
  • WebStorm
  • Elixir SDK with Internal Erlang SDK
  • Syntax highlighting and semantic annotation
  • Grammar Parsing (So good, it found bugs in the native Elixir tokenizer and parser)
  • Inspections with Quick Fixes
  • Code Folding
  • Commenter
  • File Templates
  • Graphical Debugger - works on all Run Configurations
    • Breakpoints (in .ex and .eex file)
    • Stepping
    • Stack Frames
      • Go up and Down stack without stepping program
      • Collapse and expanded nested data structures in local variables
      • Evaluate code in any frame in Evaluator
    • Customizable Module Filters
  • Delimiter/Brace Auto-insertion
  • Delimiter/Brace Matching
  • Embedded Elixir (EEx) Templates
  • Compilation
  • Decompilation
  • Dissassembly
  • BEAM Chunks viewer
  • Run Configurations
    • Distillery Release CLI
    • Elixir
    • Elixir Mix
    • Elixir Mix ExUnit
    • IEx
    • IEx Mix
  • Completion
    • Module Names
      • Aliases in Elixir Source
      • Atoms in Elixir Source
      • Decompiled Aliases from .beam files (Elixir SDK, Erlang SDK, and _build)
      • Decompiled Atoms from .beam files (Elixir SDK, Erlang SDK, and _build)
    • Function and Macro Names
      • Elixir Source
      • Decompiled from .beam files (Elixir SDK, Erlang SDK, and _build)
    • Module Attributes
    • Parameters and Variables
  • Formatting
  • Go To
    • Definition (of macro or function from usage)
    • Symbol
    • Module Aliases (Source or Decompiled)
    • Function and Macro Names (Source or Decompiled)
    • Test
    • Test Subject
  • Find Usage
  • Refactor
    • Rename
      • Moduel Attribute
      • Parameters and Variables
  • Spellchecking

    Dictionaries for common dependencies:

    • Elixir
    • Ecto

  • Structure View

Recent change notes


  • Enhancements

    • ESpec Test Runner
    • ESpec Graphical Test Results
  • Bug Fixes

    • Only show Run/Debug ExUnit when *_test.exs files exist.
    • Only show Run/Debug Espec when *_spec.exs files exist.
    • Wrap UnqualifiedNoArgumentCall.quote identifier.text in runReadAction.


  • Enhancements

    • Add Type Specifications to Dbgi tab for :elixir_erl backend Debug Info.
    • Add Bug Report issue template.
  • Bug Fixes

    • 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 and has affected all later versions.


  • Enhancements

    • Improve support for umbrella projects in Small IDEs like Rubymine by create 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.
    • 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 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

    • Prevent ConcurrentModificationExceptions when updating gradle by using allprojects less.
    • Remove unused variables in Elixir debugger server.
    • Protect from AssertionError when VirtualFilePointerContainer is disposed.
    • 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.
    • Ignore :ref when finding path to dep.


  • Enhancements

    • Add IntelliJ Elixir Help to Help menu that opens link in browser using plugin version to link to on GitHub.

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

    • 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

    • Fix deadlinks to Run Configurations, which broke when section was renamed Run/Debug Configurations and auto-anchor changed name.
    • Fix image links in README.
    • Ensure defmodule one-liner isn't mistaken for call definition head in Go To Symbol.
    • Wrap packagePisToDepSet in read action because checking the validity of the dependencies requires a read action.
    • Ignore :tag when finding path to dep.
    • 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.


  • Bug Fixes

    • 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.
    • 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.


  • Enhancements

    • 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.
    • 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.

    • Handle commit and override for Mix.Dep.
    • Add .eex to .ex and .exs for accepted file extensions used to hyperlink files in stacktraces.
    • 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.
    • 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.
    • Regression test for #1270.
    • 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.
    • Canary, pre-release builds (vMAJOR.MINOR.PATCH-pre+YYYYMMDDHHMMSS) from master branch
  • Bug Fixes

    • Don't include null useCall as __MODULE__ dependency.
    • Wrap LibraryTable#removeLibrary in write action.
    • Wrap Library#modifiableModule#commit in write action.
    • Check if Mix.Dep has already been seen to prevent recursive loops.
    • 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.
    • 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.
    • 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.
    • 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.
    • 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.
    • Remove @2x and @3x SVG icons that render wrong size in 2018.3 EAP.
    • Fix unused variables in TeamCityExUnitFormatting
      • reason was completely unused.
      • details should have been used.
    • 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.
    • 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.
    • 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.
    • Don't interpret :crypto by default: :crypto includes NIFs that can't be reloaded and so kills the debugger.
    • Protect from null containingFile for modular names during completion.
    • Wrap syncPublisher(JDK_TABLE_TOPIC) in invokeLater runWriteAction.
  • Incompatible Changes

    • 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.
    • 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.


  • Enhancements

    • 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
    • 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

    • Specify that Kotlin Plugin is needed in, so IntelliJ plays nice.
    • 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]).
    • 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.
    • Ensures 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.
    • 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 Changes

    • 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.


  • Enhancements

    • Flat icons to match IntelliJ IDEA 2018.2 design rules . Thanks to @nk8 for consulting on the design and showing me how to use Figma.
    • Regression test for #1228
    • Use icon provided by Lidiya Chernigovskaya (@LChernigovskaya) and created by JetBrains UX (Alina Mishina) for pluginIcon compatibility with IntelliJ IDEA 2018.3.
  • Bug Fixes

    • Look above Enum.reduce for enclosing macro call.
    • 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.
    • 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.

    • Run createLibrary inside runWriteAction.
    • Remove test that leaks threads and so causes builds to fail.


  • Enhancements

    • 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.
    • 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
    • Spell checking for identifiers, aliases, comments, and literals (charlists, strings, and sigils).
      • Dictionaries for common dependencies
        • Elixir
        • Ecto
    • 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.
    • TerminalExecutionConsole itself echos input in 2018.2 and 2018.2.1, which was introduced in JetBrains/intellij-community@fd7bbd0#diff-5acc2eb2e78fe52d7458d4a48b0eac9f , but it was reverted in JetBrains/intellij-community@5f4465b , so this uses that version to maintain compatibility across supported versions.
    • Regression test for #1141.
    • 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."
  • Bug Fixes

    • Show ... for module name when Dbgi has no module name as happens for instrumented modules from IEx.break/4.
    • Don't assume callDefinitionClause is non-null.
    • Don't assume parent of list access expression is QuotableKeywordPair
    • Don't assume parent of keywords is a list
    • Update 2018.2 to 2018.2.1 in build matrix.
    • 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 |.
    • Treat EEx tag the same as StabBody for use scope.
    • Use ATOM for keyword keys instead of IDENTIFIER_TOKEN as ATOM allows for @, which is needed for correctness.
    • 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 ASDF, there are non-OTP-app files in <SDK_HOME_PATH>/lib, so filter <SDK_HOME_PATH>/lib/<APP> to only directories.
    • 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.
    • 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.
    • Use / in paths passed to Erlang, even on Windows
    • Convert mix and mix test run configurations to new format.
  • Incompatible Changes

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


  • Enhancements

    • Refactor ElixirPsiImplUtil into separate files tied to specific classes or interfaces to shrink its size.
    • Complete #{ with }.
    • 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.
    • Regression test for #1091.
    • Add regression tests for #1116 that test that parameter and variables can be renamed.
    • Update IntelliJ versions in build matrix to include 2018.1 and latest patch version of other versions.
    • 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.
    • Regression test for #1105
  • Bug Fixes

    • Certain .beam files in the OTP source are purposely invalid, so ignore them when trying to parse and don't log the expected error.
    • Log available bytes and total size when header is not FOR1.
    • 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.
    • Allow zero or more new lines after the struct name before the opening curly brace ({).
    • 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)
    • 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.
    • 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.
    • 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.
    • Allow true and false to be keyword keys.


  • Enhancements

    • 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 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.
    • 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.
    • 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.
    • 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.
    • Exclude known uninterpretable modules
      • Bcrypt.Base
      • :erocksdb
      • :lz4
      • :re2
  • Bug Fixes

    • 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.
    • 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.
    • 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.
    • 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.
    • 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