|
19 | 19 | * [Access] Add support for keyword lists in `Access.key/2` and `Access.key!/1` |
20 | 20 | * [Code] Add support for the `:erlc_options` compiler option |
21 | 21 | * [Code.Formatter] Add a `:migrate_atom_interpolations` option |
| 22 | + * [File] Accept an open IO device in `File.stat/2`, `File.stat!/2`, `File.regular?/2`, `File.dir?/2`, and `File.exists?/2` |
| 23 | + * [IO.ANSI] Add `bold/0`, `bold_off/0`, `dim/0`, `dim_off/0`, `blink/0`, `invisible/0`, `invisible_off/0`, `strikethrough/0`, `strikethrough_off/0`, `italic_off/0`, `underline_off/0`, `overline/0`, `overline_off/0`, `cursor_forward/0`, `cursor_backward/0`, and `cursor_home/0`, aligning names with Erlang/OTP |
22 | 24 | * [Kernel] Improve performance of type constructors and complex intersections |
| 25 | + * [Kernel] Warn on aliases that are never used because a later alias shadows them |
23 | 26 | * [Kernel] Warn on binary patterns with segments that are not byte-aligned |
24 | 27 | * [Kernel.ParallelCompiler] Add a hint when spawned processes cannot load modules defined during compilation |
25 | 28 | * [Keyword] Optimize `Keyword.pop/3`, `Keyword.pop!/2`, and `Keyword.pop_lazy/3` |
26 | 29 | * [List] Add `List.to_existing_atom/2` and `List.to_unsafe_atom/1` |
27 | 30 | * [MapSet] Optimize `MapSet.symmetric_difference/2` when set sizes differ |
28 | 31 | * [Path] Add `Path.safe_join/2` |
| 32 | + * [Protocol] Add the `:skip_consolidated` option to `Protocol.extract_protocols/2` |
| 33 | + * [Protocol] Warn when implementing a protocol for a module that does not define a struct |
| 34 | + * [Registry] Add the `:spawn_opt` option to `Registry.start_link/1` |
29 | 35 | * [Registry] Optimize exact key matching in lookups |
30 | 36 | * [String] Optimize `String.bag_distance/2` |
31 | 37 | * [String] Add `String.to_existing_atom/2` and `String.to_unsafe_atom/1` |
|
34 | 40 | #### ExUnit |
35 | 41 |
|
36 | 42 | * [ExUnit.Assertions] Add `trace/3` helper |
| 43 | + * [ExUnit.CLIFormatter] Improve rendering of test locations in some terminals |
| 44 | + |
| 45 | +#### Mix |
| 46 | + |
| 47 | + * [mix test] Add `--coverage-format` to emit coverage reports as `html` (the default) or `text` |
37 | 48 |
|
38 | 49 | ### 2. Bug fixes |
39 | 50 |
|
|
44 | 55 | * [Calendar.ISO] Fix `Calendar.ISO.valid_time?/4` to reject non-integer microsecond precision |
45 | 56 | * [Calendar.ISO] Reject negative zero UTC offsets in basic formats |
46 | 57 | * [Code.Formatter] Fix rendering calls where `do` is followed by non-block keyword arguments |
| 58 | + * [Code.Formatter] Keep comments written after do-end block keywords (such as `rescue` and `after`) or after the right side of an operator close to where they were written, instead of moving them before the whole expression |
47 | 59 | * [Code.Fragment] Fix cursor completion when operator keywords such as `in`, `when`, `and`, `or`, and `not` follow another operator |
48 | 60 | * [Date] Preserve the `:format` option in `Date.to_iso8601/2` with custom calendars |
49 | 61 | * [Date.Range] Fix slicing date ranges with stepped ranges |
| 62 | + * [DateTime] Keep the calendar of the given map in `DateTime.convert/2` and `DateTime.truncate/2` |
| 63 | + * [DateTime] Truncate fractional differences towards zero in `DateTime.diff/3` |
50 | 64 | * [Duration] Reject duplicate seconds in `Duration.from_iso8601/1` |
51 | 65 | * [Enum] Fix `Enum.min/2,3` and `Enum.max/2,3` with custom sorters on ranges |
52 | 66 | * [IO.ANSI.Docs] Recognize additional punctuation delimiters when rendering Markdown |
|
59 | 73 | * [Kernel] Fix variables defined in one default argument leaking into subsequent default arguments |
60 | 74 | * [Kernel] Improve the error message for non-atom struct keys |
61 | 75 | * [Kernel] Raise when `|` is used in guards |
62 | | - * [Kernel.Typespec] Preserve metadata when proxying to Elixir typespecs |
| 76 | + * [Kernel] Raise on duplicate keys in `@enforce_keys` |
| 77 | + * [Kernel] Fix parsing precedence of unary operators applied to do-end blocks, such as `!if a do b end || c` |
| 78 | + * [Kernel] Do not accept empty tuples in `elem/2` and other tuple operations during type checking |
| 79 | + * [Kernel] Fix inferred types of comprehensions using `:into` with binaries and bitstrings |
| 80 | + * [Kernel] Fix type checker crash on functions with impossible clauses |
| 81 | + * [Kernel] Fix type checker crash on `defimpl` for modules that are not Elixir structs |
| 82 | + * [Kernel] Fix unsound type refinement of `min/2` and `max/2` arguments |
| 83 | + * [Kernel] Improve type precision of `--/2` |
| 84 | + * [Kernel] Improve type precision of `case` when some of its clauses always raise |
| 85 | + * [Kernel] Make pin patterns with singleton types precise, so subsequent redundant clauses are detected |
| 86 | + * [Kernel] Report applying empty function types as bad functions instead of bad arities |
63 | 87 | * [Keyword] Delete duplicate keys when `Keyword.get_and_update/3` and `Keyword.get_and_update!/3` return `:pop` |
64 | 88 | * [Macro] Properly escape C1 control characters and Unicode noncharacters |
| 89 | + * [Macro] Respect the disabled ANSI setting in `Macro.dbg/3` |
| 90 | + * [Macro] Return `true` from `Macro.quoted_literal?/1` for literals wrapped in `__block__` |
65 | 91 | * [NaiveDateTime] Fix `NaiveDateTime.diff/3` over-counting incomplete units |
| 92 | + * [OptionParser] Report missing and invalid arguments for switches with `:keep` |
66 | 93 | * [Range] Fix `Range.disjoint?/2` for ranges beyond floating-point precision |
67 | 94 | * [Range] Fix `Range.disjoint?/2` for single-element ranges with a negative step |
| 95 | + * [Regex] Escape U+0085, U+200E, U+200F, U+2028, and U+2029 in `Regex.escape/1`, as Erlang/OTP 28+ ignores them in extended mode |
68 | 96 | * [String] Fix `String.reverse/1` grapheme ordering around invalid UTF-8 bytes |
69 | 97 | * [String] Return `1.0` from `String.bag_distance/2` for two empty strings |
70 | 98 | * [Time] Validate microseconds in `Time.from_seconds_after_midnight/3` |
|
73 | 101 |
|
74 | 102 | * [ExUnit.Assertions] Fix `refute_in_delta/4` at the delta boundary and with negative deltas |
75 | 103 | * [ExUnit.CaptureIO] Stop `StringIO` processes when capturing a named device fails |
| 104 | + * [ExUnit.CLIFormatter] Report failures whose messages contain invalid UTF-8 |
| 105 | + * [ExUnit.FailuresManifest] Do not overlap failures of sibling parameterized tests |
| 106 | + * [ExUnit.Runner] Give each parameter set of parameterized tests its own random seed |
| 107 | + * [ExUnit.Runner] Preserve the order of async modules across `--repeat-until-failure` runs |
76 | 108 |
|
77 | 109 | #### IEx |
78 | 110 |
|
79 | 111 | * [IEx.Autocomplete] Fix completion crashes on maps with non-atom keys |
| 112 | + * [IEx.Autocomplete] Do not split Unicode codepoints when completing map keys |
80 | 113 | * [IEx.Evaluator] Recognize `**` and `not in` as continuation operators |
81 | 114 | * [IEx.Helpers] Fix `r/1` when multiple modules are defined in the same file |
82 | 115 | * [IEx.Helpers] Fix heap and stack memory calculations in `process_info/1` |
| 116 | + * [IEx.Helpers] Fix showing macro specs in `h/1` |
83 | 117 |
|
84 | 118 | #### Mix |
85 | 119 |
|
86 | 120 | * [Mix] Prevent synchronization lock files from being overwritten with empty contents |
87 | 121 | * [Mix.Release] Accept chardata paths in `Mix.Release.make_boot_script/4` |
88 | 122 | * [Mix.SCM.Git] Raise if Git refspecs start with `-` |
| 123 | + * [mix compile] Compile optional dependencies that non-optional dependencies require when `--no-optional-deps` is given |
89 | 124 | * [mix deps] Recompile path and fetchable dependencies when one of the dependencies they were compiled with is removed |
90 | 125 | * [mix deps] Mark fetchable dependencies for compilation when their build exists but their SCM manifest is missing |
91 | 126 | * [mix deps.compile] Preserve code paths and compiler options across OS partitions |
92 | 127 | * [mix format] Pass `:sigils` to plugins invoked for sigils, allowing nested sigils to be formatted |
| 128 | + * [mix local.hex] Install Hex with `--if-missing` when the installed version is older than the requested one |
93 | 129 | * [mix new] Avoid trailing whitespace in generated files |
| 130 | + * [mix release] Keep `:erts` in the release applications |
94 | 131 |
|
95 | 132 | ### 3. Hard deprecations |
96 | 133 |
|
97 | 134 | #### Elixir |
98 | 135 |
|
99 | 136 | * [Macro.Env] `Macro.Env.fetch_alias/2` and `Macro.Env.fetch_macro_alias/2` are deprecated, use `Macro.Env.expand_alias/4` instead |
| 137 | + * [Path] `Path.safe_relative_to/2` is deprecated, use `Path.safe_relative/2` instead |
100 | 138 |
|
101 | 139 | ### 4. Soft deprecations |
102 | 140 |
|
103 | 141 | #### Elixir |
104 | 142 |
|
| 143 | + * [IO.ANSI] `blink_slow/0`, `conceal/0`, `crossed_out/0`, `cursor_left/0`, `cursor_right/0`, `home/0`, `no_underline/0`, `not_crossed_out/0`, `not_italic/0`, `not_overlined/0`, `overlined/0`, `reveal/0`, `reverse/0`, and `reverse_off/0` are deprecated in favor of the names aligned with Erlang/OTP |
105 | 144 | * [Kernel] Atom interpolation (`:"foo_#{bar}"`) is deprecated in favor of explicit `String.to_unsafe_atom/1` |
106 | 145 | * [List] `List.to_atom/1` is deprecated in favor of `List.to_unsafe_atom/1` |
107 | 146 | * [String] `String.to_atom/1` is deprecated in favor of `String.to_unsafe_atom/1` |
|
0 commit comments