檢視原始碼 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 中。這是重新檢視和統一所有官方指南和參考的機會。

我們也整合並擴充了 了解 Elixir 函數式語言中的程式碼異味,作者為 ASERG/DCC/UFMG 的 Lucas Vegi 和 Marco Tulio Valente,以反模式的形式納入官方文件。反模式分為四類:與程式碼相關、與設計相關、與流程相關,以及元程式設計。我們的目標是提供所有開發人員潛在反模式的範例,並提供改善程式碼庫的背景和範例。

我們在此版本中整合的另一個 ExDoc 功能是加入備忘單,從 Enum 模組的備忘單 開始。如果您想為 Elixir 本身貢獻未來的備忘單,請隨時開始討論問題。

最後,我們已開始使用 Mermaid.js 圖表豐富我們的文件。您可以在 GenServerSupervisor 文件中找到範例。

v1.16.2 (2024-03-10)

1. 增強功能

Elixir

  • [Code] 在模組定義中發出 :defmodule 追蹤事件

Mix

2. 錯誤修正

Elixir

  • [Code] 修復單引號字元清單在跳脫雙引號字元時發生的格式化問題
  • [Path] 修復 Path.relative_to/2 處理輸入為「.」時的回歸問題

IEx

  • [IEx.Helpers] 從 ansi 文件中捨棄 mermaid 圍欄區塊

ExUnit

  • [ExUnit] 在建立差異時正確比較已固定的值

v1.16.1 (2024-01-31)

1. 錯誤修正

Elixir

  • [Code] 修復 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

  • [Code] 為 Code.string_to_quoted/2 新增 :emit_warnings
  • [Code] 自動在剖析選項中包含欄位
  • [Code] 引入 MismatchedDelimiterError 來處理不匹配分隔符例外
  • [Code.Fragment] 處理片段中的匿名呼叫
  • [Code.Formatter] 修剪使用 \r\n 的 here 文件尾端空白
  • [File] 為 File.stream!/2 新增 :offset 選項
  • [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] 為 Task.yield_many/2 新增 :limit 選項

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] 預設情況下,escript 現在會移除 .beam 檔案,這會產生較小的 escript。但是,如果您使用 escript 存取 Elixir 文件或編譯 Elixir 程式碼,則文件和不建議使用元資料將不再可用。在 mix.exs 中的 escript 組態中設定 strip_beams: false 以保留所有元資料
  • [mix escript.install] 支援 --sparse 選項
  • [mix 發行] 在發行中包含 include/ 目錄
  • [mix 測試] 允許同時測試多個檔案:行,例如 mix test test/foo_test.exs:13 test/bar_test.exs:27

2. 錯誤修正

Elixir

  • [程式碼] 保留格式化程式中原子鍵的引號
  • [程式碼片段] 修正 Code.Fragment.surround_context/2 在與 -> 匹配時崩潰的問題
  • [IO] 在終止裝置上使用 IO.binwrite/2 時引發錯誤(鏡像 IO.write/2
  • [核心] 不要遞迴展開別名(儲存在巨集環境中的別名已經展開)
  • [核心] 確保 dbg 模組是編譯時相依性
  • [核心] 當私有函式或巨集使用 unquote/1 且函式/巨集本身未被使用時發出警告
  • [核心] 重新啟用腳本中頂層函式的編譯器最佳化(在 v1.14.0 中停用,但不應影響大多數程式)
  • [核心] 不要定義在定義中以 Elixir. 開頭的巢狀模組的別名
  • [核心平行編譯器] 考慮在 @after_compile 回呼中定義模組,以避免死結
  • [巨集] 針對特定 AST 解決 Macro.to_string/1 的例外
  • [路徑] 在 File.cwd!/0Path.expand/1Path.absname/1 中延遲評估
  • [路徑] 確保當給定的引數與 cwd 沒有共用前置字元時,Path.relative_to/2 會傳回相對路徑

ExUnit

  • [ExUnit] 對縮排錯誤的文件測試引發錯誤

IEx

  • [IEx.Pry] 修復主體中只有文字的窺探函式

Mix

  • [mix archive.install] 在 mix archive.install 之後還原程式碼路徑
  • [mix 編譯] 確保每當任何檔案變更時,都會重新編譯具有重複模組的檔案
  • [mix 編譯] 更新 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
  • [Kernel] ~R/.../ 已棄用,改用 ~r/.../。這是因為 ~R/.../ 仍允許跳脫碼,這不符合大寫符號的定義
  • [String] 棄用在 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 分支中找到