v1.21.0-dev
1. Enhancements
EEx
- [EEx] Support splitting middle expressions across EEx clauses
Elixir
- [Access] Add support for keyword lists in
Access.key/2andAccess.key!/1 - [Code] Add support for the
:erlc_optionscompiler option - [Code.Formatter] Add a
:migrate_atom_interpolationsoption - [Code.Typespec] Handle Erlang/OTP 28 nominal types in
Code.Typespec.fetch_types/1 - [Kernel] Improve performance of type constructors and complex intersections
- [Kernel] Warn on binary patterns with segments that are not byte-aligned
- [Keyword] Optimize
Keyword.pop/3,Keyword.pop!/2, andKeyword.pop_lazy/3 - [List] Add
List.to_existing_atom/2andList.to_unsafe_atom/1 - [MapSet] Optimize
MapSet.symmetric_difference/2when set sizes differ - [Registry] Optimize exact key matching in lookups
- [String] Optimize
String.bag_distance/2 - [String] Add
String.to_existing_atom/2andString.to_unsafe_atom/1 - [URI] Optimize percent-decoding and
URI.to_string/1
ExUnit
- [ExUnit.Assertions] Add
trace/3helper
2. Bug fixes
Elixir
- [Code.Fragment] Fix cursor completion when operator keywords such as
in,when,and,or, andnotfollow another operator - [Date.Range] Fix slicing date ranges with stepped ranges
- [Duration] Reject duplicate seconds in
Duration.from_iso8601/1 - [Enum] Fix
Enum.min/2,3andEnum.max/2,3with custom sorters on ranges - [IO.ANSI.Docs] Recognize additional punctuation delimiters when rendering Markdown
- [Kernel] Fix expansion of rebound variables in bitstring size expressions
- [Kernel] Expand
defguardmacros separately in guard and body contexts, preservingand/orerror semantics outside guards - [Kernel] Fix variables defined in one default argument leaking into subsequent default arguments
- [Kernel.Typespec] Preserve metadata when proxying to Elixir typespecs
- [Keyword] Delete duplicate keys when
Keyword.get_and_update/3andKeyword.get_and_update!/3return:pop - [NaiveDateTime] Fix
NaiveDateTime.diff/3over-counting incomplete units - [Range] Fix
Range.disjoint?/2for single-element ranges with a negative step - [String] Return
1.0fromString.bag_distance/2for two empty strings
ExUnit
- [ExUnit.Assertions] Fix
refute_in_delta/4at the delta boundary and with negative deltas - [ExUnit.CaptureIO] Stop
StringIOprocesses when capturing a named device fails
IEx
- [IEx.Autocomplete] Fix completion crashes on maps with non-atom keys
- [IEx.Evaluator] Recognize
**as a continuation operator - [IEx.Helpers] Fix
r/1when multiple modules are defined in the same file - [IEx.Helpers] Fix heap and stack memory calculations in
process_info/1
Mix
- [Mix.Release] Accept chardata paths in
Mix.Release.make_boot_script/4 - [Mix.SCM.Git] Raise if Git refspecs start with
- - [mix deps] Recompile path and fetchable dependencies when one of the dependencies they were compiled with is removed
- [mix deps] Mark fetchable dependencies for compilation when their build exists but their SCM manifest is missing
- [mix deps.compile] Preserve code paths and compiler options across OS partitions
3. Hard deprecations
Elixir
- [Macro.Env]
Macro.Env.fetch_alias/2andMacro.Env.fetch_macro_alias/2are deprecated, useMacro.Env.expand_alias/4instead
4. Soft deprecations
Elixir
- [Kernel] Atom interpolation (
:"foo_#{bar}") is deprecated in favor of explicitString.to_unsafe_atom/1 - [List]
List.to_atom/1is deprecated in favor ofList.to_unsafe_atom/1 - [String]
String.to_atom/1is deprecated in favor ofString.to_unsafe_atom/1
v1.20
The CHANGELOG for v1.20 releases can be found in the v1.20 branch.