Elixir release

1.12.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

68 changes

Tool: EEx Module: EEx.Engine

Add c:EEx.Engine.handle_text/3 callback that receives text metadata

Tool: EEx Module: EEx.Engine

Emit warnings for unused "do" expression in EEx

Tool: Elixir Module: Code

Add Code.cursor_context/2 to return the context of a code snippet

Tool: Elixir Module: Code

Do not add newlines around interpolation on code formatting. Note this means formatted code that has interpolation after the line length on Elixir v1.12 won't be considered as formatted on earlier Elixir versions

Tool: Elixir Module: Code

Do not add brackets when keywords is used in the access syntax

Tool: Elixir Module: Calendar

Support basic datetime format in Calendar.ISO parsing functions

Tool: Elixir Module: Code

Improve evaluation performance on systems running on Erlang/OTP 24+

Tool: Elixir Module: Date

Support steps via Date.range/3

Tool: Elixir Module: DateTime

Add offset to DateTime.to_iso8601/2 (now to_iso8601/3)

Tool: Elixir Module: Enum

Add Enum.count_until/2 and Enum.count_until/3

Tool: Elixir Module: Enum

Add Enum.product/1

Tool: Elixir Module: Enum

Add Enum.zip_with/2, Enum.zip_with/3, Enum.zip_reduce/3, and Enum.zip_reduce/4

Tool: Elixir Module: Enum

Add support for functions as the second argument of Enum.with_index/2

Tool: Elixir Module: Exception

Show error_info data for exceptions coming from Erlang

Tool: Elixir Module: Float

Add Float.pow/2

Tool: Elixir Module: Integer

Add Integer.pow/2 and Integer.extended_gcd/2

Tool: Elixir Module: IO

Add IO.stream/0 and IO.binstream/0 which default to STDIO with line orientation

Tool: Elixir Module: List

Add default value for List.first/1 and List.last/1

Tool: Elixir Module: Kernel

Add first..last//step as support for stepped ranges

Tool: Elixir Module: Kernel

Also warn for literal structs on min/2 and max/2

Tool: Elixir Module: Kernel

Add Kernel.tap/2 and Kernel.then/2

Tool: Elixir Module: Kernel

Do not add runtime dependencies to remotes in typespecs

Tool: Elixir Module: Kernel

When there is an unused variable warning and there is a variable with the same name previously defined, suggest the user may have wanted to use the pin operator

Tool: Elixir Module: Kernel

Improve error messages on invalid character right after a number

Tool: Elixir Module: Kernel

Show removal and deprecated tips from Erlang/OTP

Tool: Elixir Module: Macro

Add export dependencies on Macro.struct!/2

Tool: Elixir Module: Macro

Support :newline to customize newlines escaping in Macro.unescape_string/2

Tool: Elixir Module: Module

Raise on invalid @dialyzer attributes

Tool: Elixir Module: Module

Add Module.get_definition/2 and Module.delete_definition/2

Tool: Elixir Module: Module

Allow @on_load to be a private function

Tool: Elixir Module: Module

Validate @dialyzer related module attributes

Tool: Elixir Module: Module

Add Module.reserved_attributes/0 to list all reserved attributes by the language

Tool: Elixir Module: Range

Add Range.new/3 and Range.size/1

Tool: Elixir Module: Regex

Add offset option to Regex.scan/3 and Regex.run/3

Tool: Elixir Module: Registry

Support :compression on Registry tables

Tool: Elixir Module: Registry

Support Registry.values/3 for reading values under a given key-pid pair

Tool: Elixir Module: Stream

Add Stream.zip_with/2 and Stream.zip_with/3

Tool: Elixir Module: String

Add :turkic mode option to String case functions

Tool: Elixir Module: String

Update to Unicode 13.0

Tool: Elixir Module: System

Add System.trap_signal/3 and System.untrap_signal/2

Tool: Elixir Module: System

Add System.shell/2 to invoke a command that is interpreted by the shell

Tool: Elixir Module: Tuple

Add Tuple.sum/1 and Tuple.product/1

Tool: Elixir Module: URI

Support RFC3986 compliant encoding and decoding of queries via the :rfc3986 option

Tool: ExUnit Module: ExUnit

Intercept SIGQUIT (via Ctrl+\) and show a list of all aborted tests as well as intermediate test results

Tool: ExUnit Module: ExUnit

Interpolate module attributes in match assertions diffs

Tool: ExUnit Module: ExUnit

Print how much time is spent on async vs sync tests

Tool: ExUnit Module: ExUnit

Improve error messages for doctests

Tool: ExUnit Module: ExUnit

Compile doctests faster (often by two times)

Tool: ExUnit Module: ExUnit

Add ExUnit.async_run/0 and ExUnit.await_run/1

Tool: IEx Module: IEx

Make IEx' parser configurable to allow special commands

Tool: IEx Module: IEx

Show function signature when pressing tab after the opening parens of a function

Tool: IEx Module: IEx

If an IEx expression starts with a binary operator, such as |>, automatically pipe in the result of the last expression

Tool: Mix Module: Mix

Add Mix.install/2 for dynamically installing a list of dependencies

Tool: Mix Module: Mix

Support :exit_code option in Mix.raise/2

Tool: Mix Module: Mix

Discard MIX_ENV and MIX_TARGET values if they are empty strings

Tool: Mix Module: Mix

Print the time taken to execute a task with on MIX_DEBUG=1

Tool: Mix Module: mix compile.erlang

Compile multiple files in parallel

Tool: Mix Module: mix escript.build

Deep merge configuration and ensure argv is set when executing config/runtime.exs

Tool: Mix Module: mix release

Add RELEASE_PROG to releases with the name of the executable starting the release

Tool: Mix Module: mix release

Support remote.vm.args to customize how the connecting VM boots

Tool: Mix Module: mix test

Run all available tests if there are no pending --failed tests. This provides a better workflow as you no longer need to toggle the --failed flag between runs

Tool: Elixir Module: Kernel

Using first..last to match on ranges is soft-deprecated and will warn on future Elixir versions. Use first..last//step instead

Tool: Elixir Module: Kernel

Using first..last to create decreasing ranges is soft-deprecated and will warn on future versions. Use first..last//-1 instead

Tool: EEx Module: EEx.Engine

use EEx.Engine is deprecated in favor of explicit delegation

Tool: Elixir Module: Kernel

The binary operator ^^^ is deprecated. If you are using Bitwise.^^^/2, use Bitwise.bxor/2 instead

Tool: Elixir Module: Kernel

Deprecate @foo() in favor of @foo

Tool: Elixir Module: System

Deprecate System.stacktrace/0 (it was already deprecated outside of catch/rescue and now it is deprecated everywhere)

Tool: Mix Module: mix compile

The :xref compiler is deprecated and it has no effect. Please remove it from your mix.exs file.

Bugfix

30 changes

Tool: Elixir Module: CLI

Ensure -e "" (with an empty string) parses correctly on Windows

Tool: Elixir Module: Inspect

Do not override user supplied :limit option for derived implementations

Tool: Elixir Module: Kernel

Allow heredoc inside a heredoc interpolation

Tool: Elixir Module: Kernel

Preserve CRLF on heredocs

Tool: Elixir Module: Kernel

Public functions without documentation now appear as an empty map on Code.fetch_docs/1, unless they start with underscore, where they remain as :none. This aligns Elixir's implementation with EEP48

Tool: Elixir Module: Kernel

Do not crash when complex literals (binaries and maps) are used in guards

Tool: Elixir Module: Kernel

Properly parse keywords (such as end) followed by the :: operator

Tool: Elixir Module: Kernel

Do not ignore unimplemented signatures from generated functions

Tool: Elixir Module: Kernel

Improve error message when an expression follows a keyword list without brackets

Tool: Elixir Module: Macro

Macro.decompose_call/1 now also consider tuples with more than 2 elements to not be valid calls

Tool: Elixir Module: Macro

Fix Macro.to_string/1 double-escaping of escape characters in sigils

Tool: Elixir Module: Macro

Fix Macro.underscore/1 on digits preceded by capitals: "FOO10" now becomes "foo10" instead of "fo_o10"

Tool: Elixir Module: Macro

Preserve underscores between digits on Macro.underscore/1

Tool: Elixir Module: OptionParser

Properly parse when numbers follow-up aliases, for example, -ab3 is now parsed as -a -b 3

Tool: Elixir Module: Path

Fix Path.relative_to/2 when referencing self

Tool: Elixir Module: Path

Do not crash when a volume is given to Path.absname/1, such as "c:"

Tool: Elixir Module: Task

Ensure Task.async_stream/2 with ordered: false discard results as they are emitted, instead of needlessly accumulating inside the stream manager

Tool: Elixir Module: Task

Raise if :max_concurrency is set to 0 on streaming operations

Tool: Elixir Module: URI

Do not discard empty paths on URI.merge/2

Tool: ExUnit Module: ExUnit.Case

Make @tag tmp_dir an absolute directory, avoiding inconsistencies if the test changes the current working directory

Tool: ExUnit Module: ExUnit.Diff

Fix cases where the diffing algorithm would fail to print a pattern correct

Tool: IEx Module: IEx

Fix auto-completion inside remote shells

Tool: Mix Module: mix app.config

Do not emit false positive warnings when configured dependencies that have runtime: false set

Tool: Mix Module: mix compile.elixir

Ensure that a manifest is generated even with no source code

Tool: Mix Module: mix compile.elixir

Make sure export dependencies trigger recompilation when the dependency is removed as well as when the whole file is removed

Tool: Mix Module: mix compile.elixir

Do not emit false positive warnings when a path dependency adds a module that is then used by the current application in the same mix compile cycle

Tool: Mix Module: mix test

Ensure protocols within the current project are consolidated when --cover is given

Tool: Mix Module: mix release

Improve compliance of release scripts with stripped down Linux installations

Tool: Mix Module: mix release

Preserve file mode when copying non-beam ebin files

Tool: Mix Module: mix xref

Ensure args are passed to the underlying mix compile call