查看源代码 Elixir v1.16 的变更日志

诊断中的代码片段

Elixir v1.15 引入了一种新的编译器诊断格式,并能够在每次编译时打印多个错误诊断(除了多个警告)。

在 Elixir v1.16 中,我们还在编译器引发的异常和诊断中包含代码片段。例如,语法错误现在包括一个指向错误发生位置的指针。

** (SyntaxError) invalid syntax found on lib/my_app.ex:1:17:
    error: syntax error before: '*'
    │
  1  [1, 2, 3, 4, 5, *]
                     ^
    
     lib/my_app.ex:1:17

对于不匹配的定界符,现在会显示两个定界符。

** (MismatchedDelimiterError) mismatched delimiter found on lib/my_app.ex:1:18:
    error: unexpected token: )
    │
  1  [1, 2, 3, 4, 5, 6)
                      mismatched closing delimiter (expected "]")
      unclosed delimiter
    
     lib/my_app.ex:1:18

对于未关闭的定界符,现在会显示未关闭定界符的起始位置。

** (TokenMissingError) token missing on lib/my_app:8:23:
    error: missing terminator: )
    │
  1  my_numbers = (1, 2, 3, 4, 5, 6
                   unclosed delimiter
 ...
  8  IO.inspect(my_numbers)
                            missing closing delimiter (expected ")")
    
     lib/my_app:8:23

错误和警告诊断也包含代码片段。在可能的情况下,我们会显示精确的跨度,例如在未定义的变量上。

  error: undefined variable "unknown_var"
  
5      a - unknown_var
           ^^^^^^^^^^^
  
   lib/sample.ex:5:9: Sample.foo/1

否则,整行将被下划线。

error: function names should start with lowercase characters or underscore, invalid name CamelCase
  
3    def CamelCase do
     ^^^^^^^^^^^^^^^^
  
   lib/sample.ex:3

衷心感谢 Vinícius Müller 为新的诊断做出的努力。

改进的文档

Elixir 的入门指南已成为 Elixir 仓库的一部分,并已整合到 ExDoc 中。这为我们提供了一个重新审视和统一所有官方指南和参考资料的机会。

我们还将 Lucas Vegi 和 Marco Tulio Valente 在 理解 Elixir 函数式语言中的代码异味 中的工作整合并扩展到官方文档中,以反模式的形式呈现。反模式分为四类:代码相关、设计相关、流程相关和元编程。我们的目标是为所有开发者提供潜在的反模式示例,并提供改进其代码库的上下文和示例。

我们在这个版本中整合的另一个 ExDoc 功能是添加了速查表,从 Enum 模块的速查表 开始。如果您想为 Elixir 本身贡献未来的速查表,请随时通过 issue 开始讨论。

最后,我们开始用 Mermaid.js 图表来丰富我们的文档。您可以在 GenServerSupervisor 文档中找到示例。

v1.16.2 (2024-03-10)

1. 改进

Elixir

  • [代码] 在模块定义时发出 :defmodule 跟踪事件

Mix

2. 错误修复

Elixir

  • [代码] 修复当单引号字符列表转义双引号字符时的字符列表格式问题
  • [Path] 修复 Path.relative_to/2 处理 "." 作为输入的回归

IEx

  • [IEx.Helpers] 从 ansi 文档中丢弃 mermaid 围栏块

ExUnit

  • [ExUnit] 在构建差异时正确比较固定值

v1.16.1 (2024-01-31)

1. 错误修复

Elixir

  • [代码] 修复 Code.quoted_to_algebra/2 中以 :do 键作为操作数的操作符
  • [Kernel.ParallelCompiler] 当从附加代码评估中接收诊断时,不要使并行编译器崩溃
  • [Kernel.ParallelCompiler] 始终在编译结束时记录错误
  • [String] 修复 String.capitalize/1 中的单个代码点

IEx

  • [IEx] 修复 Erlang/OTP 26 上函数签名的自动完成
  • [IEx] 不要假设 $HOME 已设置

Mix

  • [mix deps.compile] 在 Unix 上处理 rebar3 依赖项的编译,即使 rebar3 位于带空格的路径中
  • [mix test] 在从单个文件运行测试时,正确解析相对路径
  • [mix test] 在从单个文件运行测试时,正确解析 Windows 路径

v1.16.0 (2023-12-22)

1. 改进

EEx

  • [EEx] 在诊断中包含相对文件信息

Elixir

  • [代码] 添加 :emit_warnings 用于 Code.string_to_quoted/2
  • [代码] 在解析选项中自动包含列
  • [代码] 引入 MismatchedDelimiterError 用于处理不匹配定界符异常
  • [Code.Fragment] 处理片段中的匿名调用
  • [Code.Formatter] 使用 \r\n 修剪 heredocs 的尾随空格
  • [File] 添加 :offset 选项到 File.stream!/2
  • [Kernel] 自动推断匹配变量在位字符串中的大小
  • [Kernel] 在翻译类型规范时保留列信息
  • [Kernel] 当模块不存在于 UndefinedFunctionError 中时,根据后缀和大小写错误建议模块名称
  • [Kernel.ParallelCompiler] 引入 Kernel.ParallelCompiler.pmap/2 用于并行编译多个附加条目
  • [Kernel.SpecialForms] 如果 True/False/Nil 用作别名,并且没有这样的别名,则发出警告
  • [Macro] 添加 Macro.compile_apply/4
  • [Module] 添加对 Erlang/OTP 25 中的 @nifs 注释的支持
  • [Module] 添加对缺少 @dialyzer 配置的支持
  • [String] 更新到 Unicode 15.1.0
  • [String] 添加 String.replace_invalid/2
  • [Task] 添加 :limit 选项到 Task.yield_many/2

Logger

Mix

  • [mix] 添加 MIX_PROFILE 以分析逗号分隔的任务列表
  • [mix archive.install] 支持 --sparse 选项
  • [mix compile.app] 如果同时使用 :applications:extra_applications,则发出警告
  • [mix compile.elixir] 在可能的情况下,将原始异常传递到诊断 :details
  • [mix compile.elixir] 优化在 lib/ 中存在数千个文件,其中一个文件发生更改的情况
  • [mix deps.clean] 当无法删除依赖项时,发出警告而不是崩溃
  • [mix escript.build] Escripts 现在默认情况下会剥离 .beam 文件,这会导致更小的 escript。但是,如果您使用 escript 来访问 Elixir 文档或编译 Elixir 代码,则文档和弃用元数据将不再可用。在您的 mix.exs 中的 escript 配置中设置 strip_beams: false 以保留所有元数据
  • [mix escript.install] 支持 --sparse 选项
  • [mix release] 在发布中包含 include/ 目录
  • [mix test] 允许同时测试多个 file:line,例如 mix test test/foo_test.exs:13 test/bar_test.exs:27

2. 错误修复

Elixir

  • [代码] 在格式化程序中保留原子键的引号
  • [Code.Fragment] 修复 Code.Fragment.surround_context/2 中匹配 -> 时的崩溃
  • [IO] 在终止设备上使用 IO.binwrite/2 时引发错误(镜像 IO.write/2
  • [Kernel] 不要递归地扩展别名(存储在 Macro.Env 中的别名已经扩展)
  • [Kernel] 确保 dbg 模块是编译时依赖项
  • [Kernel] 当私有函数或宏使用 unquote/1 并且函数/宏本身未被使用时发出警告
  • [Kernel] 重新启用脚本中顶层函数的编译器优化(在 v1.14.0 中禁用,但不会影响大多数程序)
  • [Kernel] 不要为以 Elixir. 开头的嵌套模块在其定义中定义别名
  • [Kernel.ParallelCompiler] 考虑模块已在 @after_compile 回调中定义以避免死锁
  • [Macro] 解决特定 AST 上 Macro.to_string/1 的异常
  • [Path] 在 Path.expand/1Path.absname/1 中延迟评估 File.cwd!/0
  • [Path] 确保 Path.relative_to/2 在给定参数与 cwd 没有公共前缀时返回相对路径

ExUnit

  • [ExUnit] 对不正确缩进的 doctest 引发错误

IEx

  • [IEx.Pry] 修复仅在其主体中包含字面量的 pry 函数

Mix

  • [mix archive.install] 在 mix archive.install 之后恢复代码路径
  • [mix compile] 确保包含重复模块的文件在任何文件更改时都会重新编译
  • [mix compile] 更新 Mix 编译器诊断文档和类型规范以匹配 Elixir 编译器行为,其中行和列都从 1 开始(之前不正确地说列从 0 开始)
  • [mix escript.install] 在 mix escript.install 之后恢复代码路径

3. 软弃用(不会发出警告)

Elixir

Mix

4. 硬弃用

Elixir

  • [Date] 弃用推断负步长的范围,建议改为使用负步长调用 Date.range/3
  • [Enum] 弃用在 Enum.slice/2 上传递负步长的范围,建议改为使用 first..last//1
  • [内核] ~R/.../ 已被弃用,建议使用 ~r/.../。这是因为 ~R/.../ 仍然允许使用转义码,这与大写符号的定义不符。
  • [字符串] 弃用在 String.slice/2 中传递具有负步长的范围,建议使用 first..last//1 代替。

ExUnit

  • [ExUnit.Formatter] 弃用 format_time/2,建议使用 format_times/1 代替。

Mix

  • [mix compile.leex] 要求将 :leex 添加为编译器才能运行 leex 编译器。
  • [mix compile.yecc] 要求将 :yecc 添加为编译器才能运行 yecc 编译器。

v1.15

v1.15 版本的 CHANGELOG 可以 在 v1.15 分支中找到