Official announcement: Elixir v1.16 released - The Elixir programming language
1. Enhancements
EEx
- [EEx] Include relative file information in diagnostics
Elixir
- [Code] Add
:emit_warnings
forCode.string_to_quoted/2
- [Code] Automatically include columns in parsing options
- [Code] Introduce
MismatchedDelimiterError
for handling mismatched delimiter exceptions - [Code.Fragment] Handle anonymous calls in fragments
- [Code.Formatter] Trim trailing whitespace on heredocs with
\r\n
- [File] Add
:offset
option toFile.stream!/2
- [Kernel] Auto infer size of matched variable in bitstrings
- [Kernel] Preserve column information when translating typespecs
- [Kernel] Suggest module names based on suffix and casing errors when the module does not exist in
UndefinedFunctionError
- [Kernel.ParallelCompiler] Introduce
Kernel.ParallelCompiler.pmap/2
to compile multiple additional entries in parallel - [Kernel.SpecialForms] Warn if
True
/False
/Nil
are used as aliases and there is no such alias - [Macro] Add
Macro.compile_apply/4
- [Module] Add support for
@nifs
annotation from Erlang/OTP 25 - [Module] Add support for missing
@dialyzer
configuration - [String] Update to Unicode 15.1.0
- [String] Add
String.replace_invalid/2
- [Task] Add
:limit
option toTask.yield_many/2
Logger
- [Logger] Add
Logger.levels/0
Mix
- [mix] Add
MIX_PROFILE
to profile a list of comma separated tasks - [mix archive.install] Support
--sparse
option - [mix compile.app] Warn if both
:applications
and:extra_applications
are used - [mix compile.elixir] Pass original exception down to diagnostic
:details
when possible - [mix compile.elixir] Optimize scenario where there are thousands of files in
lib/
and one of them is changed - [mix deps.clean] Emit a warning instead of crashing when a dependency cannot be removed
- [mix escript.install] Support
--sparse
option - [mix release] Include
include/
directory in releases - [mix test] Allow testing multiple file:line at once, such as
mix test test/foo_test.exs:13 test/bar_test.exs:27
2. Bug fixes
Elixir
- [Code] Keep quotes for atom keys in formatter
- [Code.Fragment] Fix crash in
Code.Fragment.surround_context/2
when matching on->
- [IO] Raise when using
IO.binwrite/2
on terminated device (mirroringIO.write/2
) - [Kernel] Do not expand aliases recursively (the alias stored in Macro.Env is already expanded)
- [Kernel] Ensure
dbg
module is a compile-time dependency - [Kernel] Warn when a private function or macro uses
unquote/1
and the function/macro itself is unused - [Kernel] Re-enabled compiler optimizations for top level functions in scripts (disabled in v1.14.0 but shouldn’t impact most programs)
- [Kernel] Do not define an alias for nested modules starting with
Elixir.
in their definition - [Kernel.ParallelCompiler] Consider a module has been defined in
@after_compile
callbacks to avoid deadlocks - [Macro] Address exception on
Macro.to_string/1
for certain ASTs - [Path] Lazily evaluate
File.cwd!/0
inPath.expand/1
andPath.absname/1
- [Path] Ensure
Path.relative_to/2
returns a relative path when the given argument does not share a common prefix withcwd
ExUnit
- [ExUnit] Raise on incorrectly dedented doctests
IEx
- [IEx.Pry] Fix prying functions with only literals in their body
Mix
- [mix archive.install] Restore code paths after
mix archive.install
- [mix compile] Ensure files with duplicate modules are recompiled whenever any of the files change
- [mix compile] Update Mix compiler diagnostics documentation and typespecs to match the Elixir compiler behaviour where both lines and columns start from one (before it inaccurately said that columns started from zero)
- [mix escript.install] Restore code paths after
mix escript.install
3. Soft deprecations (no warnings emitted)
Elixir
- [File] Deprecate
File.stream!(file, options, line_or_bytes)
in favor of keeping the options as last argument, as inFile.stream!(file, line_or_bytes, options)
- [Kernel.ParallelCompiler] Deprecate
Kernel.ParallelCompiler.async/1
in favor ofKernel.ParallelCompiler.pmap/2
- [Path] Deprecate
Path.safe_relative_to/2
in favor ofPath.safe_relative/2
Mix
- [mix compile] Returning a four-element tuple as a position in
Mix.Task.Compiler.Diagnostic
4. Hard deprecations
Elixir
- [Date] Deprecate inferring a range with negative step, call
Date.range/3
with a negative step instead - [Enum] Deprecate passing a range with negative step on
Enum.slice/2
, givefirst..last//1
instead - [Kernel]
~R/.../
is deprecated in favor of~r/.../
. This is because~R/.../
still allowed escape codes, which did not fit the definition of uppercase sigils - [String] Deprecate passing a range with negative step on
String.slice/2
, givefirst..last//1
instead
ExUnit
- [ExUnit.Formatter] Deprecate
format_time/2
, useformat_times/1
instead
Mix
- [mix compile.leex] Require
:leex
to be added as a compiler to run theleex
compiler - [mix compile.yecc] Require
:yecc
to be added as a compiler to run theyecc
compiler