Elixir release

1.16.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

32 changes

Tool: EEx Module: EEx

Include relative file information in diagnostics

Tool: Elixir Module: Code

Add :emit_warnings for Code.string_to_quoted/2

Tool: Elixir Module: Code

Automatically include columns in parsing options

Tool: Elixir Module: Code

Introduce MismatchedDelimiterError for handling mismatched delimiter exceptions

Tool: Elixir Module: Code.Fragment

Handle anonymous calls in fragments

Tool: Elixir Module: Code.Formatter

Trim trailing whitespace on heredocs with \r\n

Tool: Elixir Module: File

Add :offset option to File.stream!/2

Tool: Elixir Module: Kernel

Auto infer size of matched variable in bitstrings

Tool: Elixir Module: Kernel

Preserve column information when translating typespecs

Tool: Elixir Module: Kernel

Suggest module names based on suffix and casing errors when the module does not exist in UndefinedFunctionError

Tool: Elixir Module: Kernel.ParallelCompiler

Introduce Kernel.ParallelCompiler.pmap/2 to compile multiple additional entries in parallel

Tool: Elixir Module: Kernel.SpecialForms

Warn if True/False/Nil are used as aliases and there is no such alias

Tool: Elixir Module: Macro

Add Macro.compile_apply/4

Tool: Elixir Module: Module

Add support for @nifs annotation from Erlang/OTP 25

Tool: Elixir Module: Module

Add support for missing @dialyzer configuration

Tool: Elixir Module: String

Update to Unicode 15.1.0

Tool: Elixir Module: String

Add String.replace_invalid/2

Tool: Elixir Module: Task

Add :limit option to Task.yield_many/2

Tool: Logger Module: Logger

Add Logger.levels/0

Tool: Mix Module: mix

Add MIX_PROFILE to profile a list of comma separated tasks

Tool: Mix Module: mix archive.install

Support --sparse option

Tool: Mix Module: mix compile.app

Warn if both :applications and :extra_applications are used

Tool: Mix Module: mix compile.elixir

Pass original exception down to diagnostic :details when possible

Tool: Mix Module: mix compile.elixir

Optimize scenario where there are thousands of files in lib/ and one of them is changed

Tool: Mix Module: mix deps.clean

Emit a warning instead of crashing when a dependency cannot be removed

Tool: Mix Module: mix escript.install

Support --sparse option

Tool: Mix Module: mix release

Include include/ directory in releases

Tool: Mix Module: mix test

Allow testing multiple file:line at once, such as mix test test/foo_test.exs:13 test/bar_test.exs:27

Tool: Elixir Module: File

Deprecate File.stream!(file, options, line_or_bytes) in favor of keeping the options as last argument, as in File.stream!(file, line_or_bytes, options)

Tool: Elixir Module: Kernel.ParallelCompiler

Deprecate Kernel.ParallelCompiler.async/1 in favor of Kernel.ParallelCompiler.pmap/2

Tool: Elixir Module: Path

Deprecate Path.safe_relative_to/2 in favor of Path.safe_relative/2

Tool: Mix Module: mix compile

Returning a four-element tuple as a position in Mix.Task.Compiler.Diagnostic

Bugfix

18 changes

Tool: Elixir Module: Code

Keep quotes for atom keys in formatter

Tool: Elixir Module: Code.Fragment

Fix crash in Code.Fragment.surround_context/2 when matching on ->

Tool: Elixir Module: IO

Raise when using IO.binwrite/2 on terminated device (mirroring IO.write/2)

Tool: Elixir Module: Kernel

Do not expand aliases recursively (the alias stored in Macro.Env is already expanded)

Tool: Elixir Module: Kernel

Ensure dbg module is a compile-time dependency

Tool: Elixir Module: Kernel

Warn when a private function or macro uses unquote/1 and the function/macro itself is unused

Tool: Elixir Module: Kernel

Re-enabled compiler optimizations for top level functions in scripts (disabled in v1.14.0 but shouldn't impact most programs)

Tool: Elixir Module: Kernel

Do not define an alias for nested modules starting with Elixir. in their definition

Tool: Elixir Module: Kernel.ParallelCompiler

Consider a module has been defined in @after_compile callbacks to avoid deadlocks

Tool: Elixir Module: Macro

Address exception on Macro.to_string/1 for certain ASTs

Tool: Elixir Module: Path

Lazily evaluate File.cwd!/0 in Path.expand/1 and Path.absname/1

Tool: Elixir Module: Path

Ensure Path.relative_to/2 returns a relative path when the given argument does not share a common prefix with cwd

Tool: ExUnit Module: ExUnit

Raise on incorrectly dedented doctests

Tool: IEx Module: IEx.Pry

Fix prying functions with only literals in their body

Tool: Mix Module: mix archive.install

Restore code paths after mix archive.install

Tool: Mix Module: mix compile

Ensure files with duplicate modules are recompiled whenever any of the files change

Tool: Mix Module: 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)

Tool: Mix Module: mix escript.install

Restore code paths after mix escript.install

Hard Deprecation

7 changes

Tool: Elixir Module: Date

Deprecate inferring a range with negative step, call Date.range/3 with a negative step instead

Tool: Elixir Module: Enum

Deprecate passing a range with negative step on Enum.slice/2, give first..last//1 instead

Tool: Elixir Module: 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

Tool: Elixir Module: String

Deprecate passing a range with negative step on String.slice/2, give first..last//1 instead

Tool: ExUnit Module: ExUnit.Formatter

Deprecate format_time/2, use format_times/1 instead

Tool: Mix Module: mix compile.leex

Require :leex to be added as a compiler to run the leex compiler

Tool: Mix Module: mix compile.yecc

Require :yecc to be added as a compiler to run the yecc compiler