Исходный код Журнал изменений для 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, авторами которой являются Lucas Vegi и Marco Tulio Valente, из ASERG/DCC/UFMG, в официальный документ в виде антипаттернов. Антипаттерны разделены на четыре категории: связанные с кодом, связанные с проектированием, связанные с процессом и метапрограммированием. Наша цель — предоставить всем разработчикам примеры потенциальных антипаттернов, с контекстом и примерами того, как улучшить свои базы кода.
Ещё одна функция ExDoc, которую мы включили в этом релизе, — это добавление справочных листов, начиная со справочного листа для модуля Enum. Если вы хотите внести вклад в будущие справочные листы для Elixir, не стесняйтесь начать обсуждение с помощью задачи.
Наконец, мы начали обогащать нашу документацию диаграммами Mermaid.js. Примеры можно найти в документации GenServer и Supervisor.
v1.16.3 (2024-05-21)
1. Исправления ошибок
Elixir
- [bin/elixir] Правильная обработка флага
--dbgв командной строке Elixir - [Code.Formatter] Добавить скобки вокруг списков ключевых слов при форматировании левой части
when - [Kernel] Инференция размера в зафиксированной переменной в строках двоичных данных только при необходимости
- [System] Добавлено примечание о том, что аргументы небезопасны при вызове скриптов .bat/.com на Windows через
System.cmd/3 - [Port] Добавлено примечание о том, что аргументы небезопасны при вызове скриптов .bat/.com на Windows
- [URI] Убедиться, что поля
:undefinedправильно преобразуются вnilпри вызове API Erlang
Logger
- [Logger] Убедиться, что переводчики сохраняются при перезапуске логгера
Mix
- [mix compile] Убедиться, что пути к компиляции доступны во время компиляции
v1.16.2 (2024-03-10)
1. Улучшения
Elixir
- [Code] Отправка события отслеживания
:defmoduleпри определении модуля
Mix
- [Mix] Добавить
Mix.install_project_dir/0 - [Mix] Добавить переменную окружения для повторного использования установки
Mix.install/2 - [Mix.SCM] Добавить
Mix.SCM.delete/1
2. Исправления ошибок
Elixir
- [Code] Исправить проблему форматирования charlist, когда одиночная строка charlist экранирует символ двойной кавычки
- [Path] Исправить регрессию в том, как
Path.relative_to/2обрабатывал "." в качестве входных данных
IEx
- [IEx.Helpers] Отбрасывать блоки mermaid с ограждениями из ansi-документов
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] Обрабатывать компиляцию зависимостей rebar3, когда rebar3 находится на пути со пробелами в Unix
- [mix test] Правильно разрешать относительные пути при запуске тестов из отдельных файлов
- [mix test] Правильно разрешать пути Windows при запуске тестов из отдельных файлов
v1.16.0 (2023-12-22)
1. Улучшения
EEx
- [EEx] Включать информацию об относительном файле в диагностике
Elixir
- [Code] Добавить
:emit_warningsдляCode.string_to_quoted/2 - [Code] Автоматически включать столбцы в параметры парсинга
- [Code] Ввести
MismatchedDelimiterErrorдля обработки исключений несовпадающих разделителей - [Code.Fragment] Обрабатывать анонимные вызовы в фрагментах
- [Code.Formatter] Удалять хвостовые пробелы в heredocs с
\r\n - [File] Добавить
:offsetпараметр кFile.stream!/2 - [Kernel] Автоматически определять размер сопоставленной переменной в bitstring
- [Kernel] Сохранять информацию о столбце при переводе типов
- [Kernel] Предлагать имена модулей на основе ошибок суффикса и регистров, когда модуль отсутствует в
UndefinedFunctionError - [Kernel.ParallelCompiler] Ввести
Kernel.ParallelCompiler.pmap/2для компиляции нескольких дополнительных записей параллельно - [Kernel.SpecialForms] Выдавать предупреждение, если
True/False/Nilиспользуются в качестве псевдонимов, и такого псевдонима нет - [Macro] Добавить
Macro.compile_apply/4 - [Module] Добавить поддержку аннотации
@nifsиз Erlang/OTP 25 - [Module] Добавить поддержку отсутствующей конфигурации
@dialyzer - [String] Обновить до Unicode 15.1.0
- [String] Добавить
String.replace_invalid/2 - [Task] Добавить
:limitпараметр кTask.yield_many/2
Logger
- [Logger] Добавить
Logger.levels/0
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 для доступа к документации Elixir или компиляции кода Elixir, метаданные документации и устаревших функций больше недоступны. Установите
strip_beams: falseв вашей конфигурации escript вmix.exsдля сохранения всех метаданных - [mix escript.install] Поддержка
--sparseпараметра - [mix release] Включить каталог
include/в релизы - [mix test] Разрешить одновременное тестирование нескольких файлов:строка, например
mix test test/foo_test.exs:13 test/bar_test.exs:27
2. Исправления ошибок
Elixir
- [Code] Сохранять кавычки для атомных ключей в форматировщике
- [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] Исправить исключение в
Macro.to_string/1для определённых AST - [Path] Лениво вычислять
File.cwd!/0вPath.expand/1иPath.absname/1 - [Path] Убедиться, что
Path.relative_to/2возвращает относительный путь, когда заданный аргумент не имеет общего префикса сcwd
ExUnit
- [ExUnit] Выдать ошибку при неправильно отступах doctests
IEx
- [IEx.Pry] Исправить функции prying с только литералами в своём теле
Mix
- [mix archive.install] Восстановить пути к коду после
mix archive.install - [mix compile] Убедиться, что файлы с дублирующими модулями перекомпилируются всякий раз, когда любой из файлов изменяется
- [mix compile] Обновить документацию и типы Mix-компилятора диагностики для соответствия поведению Elixir-компилятора, где и строки, и столбцы начинаются с единицы (раньше неточно утверждалось, что столбцы начинаются с нуля)
- [mix escript.install] Восстановить пути к коду после
mix escript.install
3. Мягкие устаревания (без вывода предупреждений)
Elixir
- [File] Устаревший
File.stream!(file, options, line_or_bytes)в пользу сохранения опций в качестве последнего аргумента, как вFile.stream!(file, line_or_bytes, options) - [Kernel.ParallelCompiler] Устаревший
Kernel.ParallelCompiler.async/1в пользуKernel.ParallelCompiler.pmap/2 - [Path] Устаревший
Path.safe_relative_to/2в пользуPath.safe_relative/2
Mix
- [mix compile] Возвращение кортежа из четырёх элементов в качестве позиции в
Mix.Task.Compiler.Diagnostic
4. Жёсткие устаревания
Elixir
- [Date] Устарело выведение диапазона с отрицательным шагом, вызовите
Date.range/3с отрицательным шагом вместо этого - [Enum] Устарело передача диапазона с отрицательным шагом в
Enum.slice/2, используйтеfirst..last//1вместо - [Kernel]
~R/.../устарел в пользу~r/.../. Это связано с тем, что~R/.../всё ещё допускал escape-коды, которые не соответствовали определению заглавных сигилов - [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 можно найти в ветке v1.15.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/changelog.html