What's New in IntelliJ Elixir 10.0.0
The big feature of 10.0.0 was automatic module and library dependency management.
Modules for Umbrella Project OTP Apps
- the root directory of umbrella projects
- each OTP Application in the
When you were in a file in an
apps/ application, searching for functions of module with Go To Symbol, you’d only see entries for the current IntelliJ module for the
apps/APP directory. Not being able to use Go To Symbol to search
in_umbrella: true functions was inconsistent with Go To Definition on the function call. Go To Definition did work because of the
_build being shared and decompiled across IntelliJ modules.
in_umbrella: true dependencies have their corresponding module added as a dependency in Project Structure Modules, which makes the scopes for Go To Symbol match the resolution rules used by
External Libraries for
in_umbrella: true dependencies in
deps no longer count as part of your project source code, so the “Include non-project symbols” works like JetBrains developed IDEs now.
This means that if you use common names for functions, you no longer need to wade through all the hits from your libraries and are only presented with results from the code you wrote. This uses the built-in support from the JetBrain’s OpenAPI, so if there are no in-project results, non-project results are automatically shown.
This separation of libraries is automatic because package management files are scanned when a project is imported and on any filesystem change.
Supported package manager files include:
rebar3if you’ve also installed the Erlang plugin (which I recommend so get all the features you like in Elixir in Erlang too.)
The deps in each format are then used to build a dependency tree and register all libraries in the Project Structure.
To make the libraries external
deps is automatically marked as Excluded.
Excluding the dependencies while also marking them as Libraries makes them appear in External Libraries at the bottom of the Project Pane, so now the SDK is no longer lonely.
This matches how Rubymine shows Rubygems.
Go To Module
Go To Class (Cmd+O on macOS / Ctrl+N on Windows/Linux) will search only module names.
So, you no longer have to wade through function, macro, and module names when you know you’re only looking for a module as is the case with Go To Symbol.
Hyperlinking Stacktraces from
In addition to
.exs files, now stacktraces involving
.eex files are linked too.
ExUnit.CliFormatter Output Format
Some of the newer features of the
ExUnit.CliFormatter are now ported to the Test Runner:
- rich diffs
- ANSI colors
- capture log output on failure
Support Elixir 1.7 ExUnit Changes
Elixir 1.7 and 1.6 have different names for categories of ignored tests. They differentiate between excluded tests with the
--exclude command line option and skipped test with the
@tag :skip. The test runner now converts both to JetBrains’s
ignored. The overall run will use the ignore icon, so you know you haven’t run all the tests too because of this change.
Count Test Compilation Failures as Test Failures
mix test has a slight weakness when interface with external tools: the ExUnit.Formatter is only called during tests runs, so if the body of a
test macro has a compilation error, the formatter is never called. Since the formatter is how
ExUnit is transformed into the
##teamCity messages that JetBrains Test Runners understand, the formatter not being called leads to the unhelpful “Test framework quit unexpectedly” message in the Test Runner.
mix test is running in an external process and all stdio is piped through the plugin before being displayed, I was able to detect when compilation errors happen and then fake test failures if a stacktrace appeared to be coming from inside a test file.
Debugger Filtered Modules
:crypto joins the growing list of NIF libraries that just really don’t want to be interpreted by the debugger, but don’t tell
:int until they’ve crashed the module’s supervision tree.
:crypto is now part of the default filtered modules list. If you have customized the list, you can add
:crypto to your filter list.
I recommend using IntelliJ IDEA (Community or Ultimate) edition if you’re using umbrella projects as only it can support the new multi-module project features.
All these new features weren’t developed at once. Each one was merged as a separate PR. If you want to get features as soon as they are available and not wait for the next stable release, automatic canary builds are now published as GitHub releases marked as pre-release and on the canary release channel which can be added inside of JetBrain IDEs with this URL:
DockYard is a digital product agency offering exceptional user experience, design, full stack engineering, web app development, software, Ember, Elixir, and Phoenix services, consulting, and training.