From cfb8b737357a0a615d5ffac216e7fe5d8448a88d Mon Sep 17 00:00:00 2001 From: eksperimental Date: Thu, 23 Feb 2017 03:40:00 +0700 Subject: [PATCH 01/13] WIP: Add Deprecations page --- Makefile | 2 +- RELEASE.md | 10 ------ lib/elixir/pages/Deprecations.md | 57 ++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 lib/elixir/pages/Deprecations.md diff --git a/Makefile b/Makefile index ad39d7dc99d..7391bc1f8c3 100644 --- a/Makefile +++ b/Makefile @@ -139,7 +139,7 @@ docs: compile ../ex_doc/bin/ex_doc docs_elixir docs_eex docs_mix docs_iex docs_e docs_elixir: compile ../ex_doc/bin/ex_doc @ echo "==> ex_doc (elixir)" $(Q) rm -rf doc/elixir - $(call COMPILE_DOCS,Elixir,elixir,Kernel,-e "lib/elixir/pages/Behaviours.md" -e "lib/elixir/pages/Guards.md" -e "lib/elixir/pages/Naming Conventions.md" -e "lib/elixir/pages/Operators.md" -e "lib/elixir/pages/Syntax Reference.md" -e "lib/elixir/pages/Typespecs.md" -e "lib/elixir/pages/Writing Documentation.md") + $(call COMPILE_DOCS,Elixir,elixir,Kernel,-e "lib/elixir/pages/Behaviours.md" -e "lib/elixir/pages/Deprecations.md" -e "lib/elixir/pages/Guards.md" -e "lib/elixir/pages/Naming Conventions.md" -e "lib/elixir/pages/Operators.md" -e "lib/elixir/pages/Syntax Reference.md" -e "lib/elixir/pages/Typespecs.md" -e "lib/elixir/pages/Writing Documentation.md") docs_eex: compile ../ex_doc/bin/ex_doc @ echo "==> ex_doc (eex)" diff --git a/RELEASE.md b/RELEASE.md index cca327f963c..b47fdacad59 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -31,13 +31,3 @@ This document simply outlines the release process: * VERSION * CHANGELOG.md * src/elixir.app.src (not lib/elixir/src/elixir.app.src) - -## Deprecation policy - -Elixir deprecations happens in 3 steps: - - 1. The feature is soft-deprecated. It means both CHANGELOG and documentation must list the feature as deprecated but no warning is effectively emitted by running the code. There is no requirement to soft-deprecate a feature. - - 2. The feature is effectively deprecated by emitting warnings on usage. In order to deprecate a feature, the proposed alternative MUST exist for AT LEAST two versions. For example, `Enum.uniq/2` was soft-deprecated in favor of `Enum.uniq_by/2` in Elixir v1.1. This means a deprecation warning may only be emitted by Elixir v1.3 or later. - - 3. The feature is removed. This can only happen on major releases. This means deprecated features in Elixir v1.x shall only be removed by Elixir v2.x. diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md new file mode 100644 index 00000000000..5d05f28f202 --- /dev/null +++ b/lib/elixir/pages/Deprecations.md @@ -0,0 +1,57 @@ +# Deprecations + +## Deprecation policy + +Elixir deprecations happens in 3 steps: + + 1. The feature is soft-deprecated. It means both CHANGELOG and documentation must list the feature as deprecated but no warning is effectively emitted by running the code. There is no requirement to soft-deprecate a feature. + + 2. The feature is effectively deprecated by emitting warnings on usage. In order to deprecate a feature, the proposed alternative MUST exist for AT LEAST two versions. For example, `Enum.uniq/2` was soft-deprecated in favor of `Enum.uniq_by/2` in Elixir v1.1. This means a deprecation warning may only be emitted by Elixir v1.3 or later. + + 3. The feature is removed. This can only happen on major releases. This means deprecated features in Elixir v1.x shall only be removed by Elixir v2.x. + + +## Table of deprecated features: modules, functions, behaviours, protocols, typespecs, attributes and arguments + +Deprecated feature | Deprecated in | Replaced by | Replacement available since +:------------------------ | :------------ | :---------------------- | :--------------------------- +`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor and GenServer`); v1.3 (GenStage); OTP v17.0 (`:gen_server`) +`()` to mean `nil` | [v1.5] | `nil` | v1.0 +`@compile {:parse_transform, _}` in `Module` | [v1.5] | __???__ | __???__ +`Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 +`Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 +`Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 +`Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 +`String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 +`t:char_list/0` typespec | [v1.5] | `t:charlist/0` typespec | v1.3 +`Access.key/1` | [v1.4] | `Access.key/2` | v1.3 +`Behaviour` module | [v1.4] | `@callback` | v1.0 +`Enum.uniq/2` | [v1.4] | `Enum.uniq_by/2` | v1.2 +`Float.to_char_list/2` | [v1.4] | `:erlang.float_to_list/2` | OTP v17.0 +`Float.to_string/2` | [v1.4] | `:erlang.float_to_binary/2` | OTP v17.0 +`Set` module | [v1.4] | `MapSet` | v1.1 +`Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 +`IEx.Helpers.import_file/2` | [v1.4] | `IEx.Helpers.import_file_if_available/2` | v1.3 +`Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 +`Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 +`Dict` behaviour | [v1.3] | __???__ `Keyword`; `Map` | __???__ v1.0 (Keyword); v1.2 (Map) +`\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 +Map/dictionary as second arg. in `Enum.group_by/3` | [v1.3] | *n/a* | *n/a* +`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *n/a* | *n/a* +`Keyword.size/1` | [v1.3] | `Kernel.length/1` | v1.0 +`Map.size/1` | [v1.3] | `Kernel.map_size/1` | v1.0 +`/r` option in `Regex` | [v1.3] | `/U` | v1.1 +`Set` behaviour | [v1.3] | __???__ | __???__ +`String.valid_character?/1` | [v1.3] | `String.valid?/1` | v1.0 +`Task.find/2` | [v1.3] | Direct message matching | v1.0 +Non-map as second arg. in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 +`Access` protocol | [v1.1] | `Access` behaviour | v1.1 +`?\xHEX` | [v1.1] | `0xHEX` | __???__ (EDITOR'S NOTE: this has been completely deprecated and it shouldn't have been until v2.0) +`as: true \| false` in `alias/2` and `require/2` | [v1.1] | __???__ *n/a* | *n/a* +Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3*| [v1.1] to [v1.2] | *n/a* | *n/a* + +[v1.1]: https://github.com/elixir-lang/elixir/blob/v1.1/CHANGELOG.md#4-deprecations +[v1.2]: https://github.com/elixir-lang/elixir/blob/v1.2/CHANGELOG.md#changelog-for-elixir-v12 +[v1.3]: https://github.com/elixir-lang/elixir/blob/v1.3/CHANGELOG.md#4-deprecations +[v1.4]: https://github.com/elixir-lang/elixir/blob/v1.4/CHANGELOG.md#4-deprecations +[v1.5]: https://github.com/elixir-lang/elixir/blob/v1.5/CHANGELOG.md#4-deprecations From c995b466da35a1e38f4ddb1974a718a04f91867e Mon Sep 17 00:00:00 2001 From: eksperimental Date: Sun, 26 Feb 2017 10:25:37 +0700 Subject: [PATCH 02/13] Deprecation page: corrections --- lib/elixir/pages/Deprecations.md | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index 5d05f28f202..30cc747b0fd 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -1,6 +1,6 @@ # Deprecations -## Deprecation policy +## Policy Elixir deprecations happens in 3 steps: @@ -11,44 +11,49 @@ Elixir deprecations happens in 3 steps: 3. The feature is removed. This can only happen on major releases. This means deprecated features in Elixir v1.x shall only be removed by Elixir v2.x. -## Table of deprecated features: modules, functions, behaviours, protocols, typespecs, attributes and arguments +## Table of deprecations Deprecated feature | Deprecated in | Replaced by | Replacement available since :------------------------ | :------------ | :---------------------- | :--------------------------- -`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor and GenServer`); v1.3 (GenStage); OTP v17.0 (`:gen_server`) +`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_events`) `()` to mean `nil` | [v1.5] | `nil` | v1.0 -`@compile {:parse_transform, _}` in `Module` | [v1.5] | __???__ | __???__ +`@compile {:parse_transform, _}` in `Module` | [v1.5] | *None* | *None* `Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 `Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 `Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 `Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 `String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 -`t:char_list/0` typespec | [v1.5] | `t:charlist/0` typespec | v1.3 +`:char_lists` key in `t:Inspect.Opts.t/0` type | [v1.5] | `:charlists` | v1.3 +`:as_char_lists` value in `t:Inspect.Opts.t/0` type | [v1.5] | `:as_charlists` | v1.3 +`t:char_list/0` type | [v1.5] | `t:charlist/0` type | v1.3 `Access.key/1` | [v1.4] | `Access.key/2` | v1.3 `Behaviour` module | [v1.4] | `@callback` | v1.0 `Enum.uniq/2` | [v1.4] | `Enum.uniq_by/2` | v1.2 -`Float.to_char_list/2` | [v1.4] | `:erlang.float_to_list/2` | OTP v17.0 -`Float.to_string/2` | [v1.4] | `:erlang.float_to_binary/2` | OTP v17.0 +`Float.to_char_list/2` | [v1.4] | `:erlang.float_to_list/2` | OTP 17 +`Float.to_string/2` | [v1.4] | `:erlang.float_to_binary/2` | OTP 17 +`HashDict` module | [v1.4] | `Map` | v1.2 +`HashSet` module | [v1.4] | `MapSet` | v1.1 `Set` module | [v1.4] | `MapSet` | v1.1 `Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 `IEx.Helpers.import_file/2` | [v1.4] | `IEx.Helpers.import_file_if_available/2` | v1.3 `Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 `Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 -`Dict` behaviour | [v1.3] | __???__ `Keyword`; `Map` | __???__ v1.0 (Keyword); v1.2 (Map) +`Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) `\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 -Map/dictionary as second arg. in `Enum.group_by/3` | [v1.3] | *n/a* | *n/a* -`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *n/a* | *n/a* +Map/dictionary as second arg. in `Enum.group_by/3` | [v1.3] | *None* | *None* +`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* `Keyword.size/1` | [v1.3] | `Kernel.length/1` | v1.0 `Map.size/1` | [v1.3] | `Kernel.map_size/1` | v1.0 `/r` option in `Regex` | [v1.3] | `/U` | v1.1 -`Set` behaviour | [v1.3] | __???__ | __???__ +`Set` behaviour | [v1.3] | *None* | *None* `String.valid_character?/1` | [v1.3] | `String.valid?/1` | v1.0 `Task.find/2` | [v1.3] | Direct message matching | v1.0 Non-map as second arg. in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 +`Dict` behaviour | [v1.2] | *None* | *None* `Access` protocol | [v1.1] | `Access` behaviour | v1.1 -`?\xHEX` | [v1.1] | `0xHEX` | __???__ (EDITOR'S NOTE: this has been completely deprecated and it shouldn't have been until v2.0) -`as: true \| false` in `alias/2` and `require/2` | [v1.1] | __???__ *n/a* | *n/a* -Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3*| [v1.1] to [v1.2] | *n/a* | *n/a* +`?\xHEX` | [v1.1] | `0xHEX` | v1.0 +`as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* | *None* +Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3*| [v1.1] to [v1.2] | *None* | *None* [v1.1]: https://github.com/elixir-lang/elixir/blob/v1.1/CHANGELOG.md#4-deprecations [v1.2]: https://github.com/elixir-lang/elixir/blob/v1.2/CHANGELOG.md#changelog-for-elixir-v12 From b978cda6aecb85846d437997a21bcdd26995a22d Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 05:38:28 +0700 Subject: [PATCH 03/13] WIP: Deprecations page: sort table --- lib/elixir/pages/Deprecations.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index 30cc747b0fd..e6dd79fd8e5 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -15,17 +15,17 @@ Elixir deprecations happens in 3 steps: Deprecated feature | Deprecated in | Replaced by | Replacement available since :------------------------ | :------------ | :---------------------- | :--------------------------- -`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_events`) -`()` to mean `nil` | [v1.5] | `nil` | v1.0 -`@compile {:parse_transform, _}` in `Module` | [v1.5] | *None* | *None* `Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 `Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 +`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_events`) `Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 `Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 `String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 -`:char_lists` key in `t:Inspect.Opts.t/0` type | [v1.5] | `:charlists` | v1.3 +`()` to mean `nil` | [v1.5] | `nil` | v1.0 `:as_char_lists` value in `t:Inspect.Opts.t/0` type | [v1.5] | `:as_charlists` | v1.3 +`:char_lists` key in `t:Inspect.Opts.t/0` type | [v1.5] | `:charlists` | v1.3 `t:char_list/0` type | [v1.5] | `t:charlist/0` type | v1.3 +`@compile {:parse_transform, _}` in `Module` | [v1.5] | *None* | *None* `Access.key/1` | [v1.4] | `Access.key/2` | v1.3 `Behaviour` module | [v1.4] | `@callback` | v1.0 `Enum.uniq/2` | [v1.4] | `Enum.uniq_by/2` | v1.2 @@ -36,23 +36,23 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen `Set` module | [v1.4] | `MapSet` | v1.1 `Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 `IEx.Helpers.import_file/2` | [v1.4] | `IEx.Helpers.import_file_if_available/2` | v1.3 -`Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 `Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 +`Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 `Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) -`\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 -Map/dictionary as second arg. in `Enum.group_by/3` | [v1.3] | *None* | *None* -`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* `Keyword.size/1` | [v1.3] | `Kernel.length/1` | v1.0 `Map.size/1` | [v1.3] | `Kernel.map_size/1` | v1.0 -`/r` option in `Regex` | [v1.3] | `/U` | v1.1 `Set` behaviour | [v1.3] | *None* | *None* `String.valid_character?/1` | [v1.3] | `String.valid?/1` | v1.0 `Task.find/2` | [v1.3] | Direct message matching | v1.0 +`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* +`/r` option in `Regex` | [v1.3] | `/U` | v1.1 +`\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 +Map/dictionary as second arg. in `Enum.group_by/3` | [v1.3] | *None* | *None* Non-map as second arg. in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 `Dict` behaviour | [v1.2] | *None* | *None* `Access` protocol | [v1.1] | `Access` behaviour | v1.1 -`?\xHEX` | [v1.1] | `0xHEX` | v1.0 `as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* | *None* +`?\xHEX` | [v1.1] | `0xHEX` | v1.0 Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3*| [v1.1] to [v1.2] | *None* | *None* [v1.1]: https://github.com/elixir-lang/elixir/blob/v1.1/CHANGELOG.md#4-deprecations From 528a1e1a153d6efba60ae22ad30ab16c66768167 Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 06:20:26 +0700 Subject: [PATCH 04/13] Use "argument" instead of "arg." --- lib/elixir/pages/Deprecations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index e6dd79fd8e5..57a4696fa1e 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -47,8 +47,8 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen `:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* `/r` option in `Regex` | [v1.3] | `/U` | v1.1 `\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 -Map/dictionary as second arg. in `Enum.group_by/3` | [v1.3] | *None* | *None* -Non-map as second arg. in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 +Map/dictionary as second argument in `Enum.group_by/3` | [v1.3] | *None* | *None* +Non-map as second argument in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 `Dict` behaviour | [v1.2] | *None* | *None* `Access` protocol | [v1.1] | `Access` behaviour | v1.1 `as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* | *None* From f6c714fe83b185d087996185d03cc6141d117b70 Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 16:06:45 +0700 Subject: [PATCH 05/13] remove from types --- lib/elixir/pages/Deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index 57a4696fa1e..3fb6f591faa 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -24,7 +24,7 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen `()` to mean `nil` | [v1.5] | `nil` | v1.0 `:as_char_lists` value in `t:Inspect.Opts.t/0` type | [v1.5] | `:as_charlists` | v1.3 `:char_lists` key in `t:Inspect.Opts.t/0` type | [v1.5] | `:charlists` | v1.3 -`t:char_list/0` type | [v1.5] | `t:charlist/0` type | v1.3 +`char_list/0` type | [v1.5] | `charlist/0` type | v1.3 `@compile {:parse_transform, _}` in `Module` | [v1.5] | *None* | *None* `Access.key/1` | [v1.4] | `Access.key/2` | v1.3 `Behaviour` module | [v1.4] | `@callback` | v1.0 From 4dfb9ac1449e864a1a841748f3e1363fa2187649 Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 16:10:20 +0700 Subject: [PATCH 06/13] Correct :gen_event spelling --- lib/elixir/pages/Deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index 3fb6f591faa..e4dc09b043b 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -17,7 +17,7 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen :------------------------ | :------------ | :---------------------- | :--------------------------- `Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 `Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 -`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_events`) +`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_event`) `Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 `Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 `String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 From 90a9b8593636709f4a3f93c0c31269a9ecbe4f31 Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 16:19:41 +0700 Subject: [PATCH 07/13] Correct arity in IEx.Helpers.import_file_if_available/1 --- lib/elixir/pages/Deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index e4dc09b043b..e635f4c178d 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -35,7 +35,7 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen `HashSet` module | [v1.4] | `MapSet` | v1.1 `Set` module | [v1.4] | `MapSet` | v1.1 `Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 -`IEx.Helpers.import_file/2` | [v1.4] | `IEx.Helpers.import_file_if_available/2` | v1.3 +`IEx.Helpers.import_file/2` | [v1.4] | `IEx.Helpers.import_file_if_available/1` | v1.3 `Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 `Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 `Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) From 1c69020f5dcf1f8609f1c89fa6b7e2f7f37878b0 Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 17:26:54 +0700 Subject: [PATCH 08/13] Add external links --- lib/elixir/pages/Deprecations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index e635f4c178d..964cf67c76f 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -17,7 +17,7 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen :------------------------ | :------------ | :---------------------- | :--------------------------- `Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 `Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 -`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; `GenStage`; `:gen_event` | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_event`) +`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; [`GenStage`](https://hex.pm/packages/gen_stage); [`:gen_event`](http://www.erlang.org/doc/man/gen_event.html) | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_event`) `Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 `Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 `String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 @@ -35,7 +35,7 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen `HashSet` module | [v1.4] | `MapSet` | v1.1 `Set` module | [v1.4] | `MapSet` | v1.1 `Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 -`IEx.Helpers.import_file/2` | [v1.4] | `IEx.Helpers.import_file_if_available/1` | v1.3 +`IEx.Helpers.import_file/2` | [v1.4] | [`IEx.Helpers.import_file_if_available/1`](https://hexdocs.pm/iex/IEx.Helpers.html#import_file_if_available/1) | v1.3 `Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 `Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 `Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) From df34f00a7e431c63feb00bcd2ee4591a31deaaa1 Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 17:32:58 +0700 Subject: [PATCH 09/13] Align table --- lib/elixir/pages/Deprecations.md | 44 ++++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index 964cf67c76f..0294794d1b4 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -15,36 +15,36 @@ Elixir deprecations happens in 3 steps: Deprecated feature | Deprecated in | Replaced by | Replacement available since :------------------------ | :------------ | :---------------------- | :--------------------------- -`Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 -`Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 -`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; [`GenStage`](https://hex.pm/packages/gen_stage); [`:gen_event`](http://www.erlang.org/doc/man/gen_event.html) | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_event`) -`Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 -`Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 -`String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 -`()` to mean `nil` | [v1.5] | `nil` | v1.0 +`Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 +`Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 +`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; [`GenStage`](https://hex.pm/packages/gen_stage); [`:gen_event`](http://www.erlang.org/doc/man/gen_event.html) | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_event`) +`Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 +`Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 +`String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 +`()` to mean `nil` | [v1.5] | `nil` | v1.0 `:as_char_lists` value in `t:Inspect.Opts.t/0` type | [v1.5] | `:as_charlists` | v1.3 `:char_lists` key in `t:Inspect.Opts.t/0` type | [v1.5] | `:charlists` | v1.3 -`char_list/0` type | [v1.5] | `charlist/0` type | v1.3 +`char_list/0` type | [v1.5] | `charlist/0` type | v1.3 `@compile {:parse_transform, _}` in `Module` | [v1.5] | *None* | *None* -`Access.key/1` | [v1.4] | `Access.key/2` | v1.3 -`Behaviour` module | [v1.4] | `@callback` | v1.0 -`Enum.uniq/2` | [v1.4] | `Enum.uniq_by/2` | v1.2 -`Float.to_char_list/2` | [v1.4] | `:erlang.float_to_list/2` | OTP 17 -`Float.to_string/2` | [v1.4] | `:erlang.float_to_binary/2` | OTP 17 -`HashDict` module | [v1.4] | `Map` | v1.2 -`HashSet` module | [v1.4] | `MapSet` | v1.1 -`Set` module | [v1.4] | `MapSet` | v1.1 -`Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 +`Access.key/1` | [v1.4] | `Access.key/2` | v1.3 +`Behaviour` module | [v1.4] | `@callback` | v1.0 +`Enum.uniq/2` | [v1.4] | `Enum.uniq_by/2` | v1.2 +`Float.to_char_list/2` | [v1.4] | `:erlang.float_to_list/2` | OTP 17 +`Float.to_string/2` | [v1.4] | `:erlang.float_to_binary/2` | OTP 17 +`HashDict` module | [v1.4] | `Map` | v1.2 +`HashSet` module | [v1.4] | `MapSet` | v1.1 +`Set` module | [v1.4] | `MapSet` | v1.1 +`Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 `IEx.Helpers.import_file/2` | [v1.4] | [`IEx.Helpers.import_file_if_available/1`](https://hexdocs.pm/iex/IEx.Helpers.html#import_file_if_available/1) | v1.3 -`Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 -`Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 -`Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) +`Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 +`Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 +`Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) `Keyword.size/1` | [v1.3] | `Kernel.length/1` | v1.0 `Map.size/1` | [v1.3] | `Kernel.map_size/1` | v1.0 `Set` behaviour | [v1.3] | *None* | *None* `String.valid_character?/1` | [v1.3] | `String.valid?/1` | v1.0 `Task.find/2` | [v1.3] | Direct message matching | v1.0 -`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* +`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* `/r` option in `Regex` | [v1.3] | `/U` | v1.1 `\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 Map/dictionary as second argument in `Enum.group_by/3` | [v1.3] | *None* | *None* @@ -53,7 +53,7 @@ Non-map as second argument in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 `Access` protocol | [v1.1] | `Access` behaviour | v1.1 `as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* | *None* `?\xHEX` | [v1.1] | `0xHEX` | v1.0 -Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3*| [v1.1] to [v1.2] | *None* | *None* +Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3* | [v1.1] to [v1.2] | *None* | *None* [v1.1]: https://github.com/elixir-lang/elixir/blob/v1.1/CHANGELOG.md#4-deprecations [v1.2]: https://github.com/elixir-lang/elixir/blob/v1.2/CHANGELOG.md#changelog-for-elixir-v12 From 7c91700a9a7394008bd004a127557908a8dd27ee Mon Sep 17 00:00:00 2001 From: eksperimental Date: Mon, 27 Feb 2017 17:36:35 +0700 Subject: [PATCH 10/13] Improve wording --- lib/elixir/pages/Deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index 0294794d1b4..b97c1625dd0 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -47,7 +47,7 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen `:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* `/r` option in `Regex` | [v1.3] | `/U` | v1.1 `\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 -Map/dictionary as second argument in `Enum.group_by/3` | [v1.3] | *None* | *None* +Map or dictionary as second argument in `Enum.group_by/3` | [v1.3] | *None* | *None* Non-map as second argument in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 `Dict` behaviour | [v1.2] | *None* | *None* `Access` protocol | [v1.1] | `Access` behaviour | v1.1 From 69f9c6e92f8e3b5de3c4949948424da09cd1b662 Mon Sep 17 00:00:00 2001 From: eksperimental Date: Fri, 3 Mar 2017 23:31:15 +0700 Subject: [PATCH 11/13] =?UTF-8?q?Include=20suggestions=20by=20Jos=C3=A9=20?= =?UTF-8?q?Valim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/elixir/pages/Deprecations.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index b97c1625dd0..48d19fa9f86 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -38,22 +38,24 @@ Deprecated feature | Deprecated in | Replaced by | Replacemen `IEx.Helpers.import_file/2` | [v1.4] | [`IEx.Helpers.import_file_if_available/1`](https://hexdocs.pm/iex/IEx.Helpers.html#import_file_if_available/1) | v1.3 `Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 `Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 +Variable used as function call | [v1.4] | Use parentheses | v1.0 +Anoymous functions with no expression after `->` | [v1.4] | Use an expression or explicitely return `nil` | v1.0 `Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) `Keyword.size/1` | [v1.3] | `Kernel.length/1` | v1.0 `Map.size/1` | [v1.3] | `Kernel.map_size/1` | v1.0 -`Set` behaviour | [v1.3] | *None* | *None* +`Set` behaviour | [v1.3] | `MapSet` data structure | v1.1 `String.valid_character?/1` | [v1.3] | `String.valid?/1` | v1.0 -`Task.find/2` | [v1.3] | Direct message matching | v1.0 -`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | *None* | *None* +`Task.find/2` | [v1.3] | Use direct message matching | v1.0 +`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | Define the function explicitely | *None* `/r` option in `Regex` | [v1.3] | `/U` | v1.1 `\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 -Map or dictionary as second argument in `Enum.group_by/3` | [v1.3] | *None* | *None* +Map or dictionary as second argument in `Enum.group_by/3` | [v1.3] | Pass a function | v1.3 Non-map as second argument in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 `Dict` behaviour | [v1.2] | *None* | *None* `Access` protocol | [v1.1] | `Access` behaviour | v1.1 `as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* | *None* `?\xHEX` | [v1.1] | `0xHEX` | v1.0 -Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3* | [v1.1] to [v1.2] | *None* | *None* +Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3* | [v1.1] to [v1.2] | Explicitely check for `""` beforehand | v1.0 [v1.1]: https://github.com/elixir-lang/elixir/blob/v1.1/CHANGELOG.md#4-deprecations [v1.2]: https://github.com/elixir-lang/elixir/blob/v1.2/CHANGELOG.md#changelog-for-elixir-v12 From eef7d89dd186cc9db360c8031704b1657067323d Mon Sep 17 00:00:00 2001 From: eksperimental Date: Sat, 4 Mar 2017 09:56:33 +0700 Subject: [PATCH 12/13] Add Dict behaviour alternative --- lib/elixir/pages/Deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index 48d19fa9f86..e689d1cdbd5 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -51,7 +51,7 @@ Anoymous functions with no expression after `->` | [v1.4] | Use an expression or `\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 Map or dictionary as second argument in `Enum.group_by/3` | [v1.3] | Pass a function | v1.3 Non-map as second argument in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 -`Dict` behaviour | [v1.2] | *None* | *None* +`Dict` behaviour | [v1.2] | `MapSet` data structure | v1.1 `Access` protocol | [v1.1] | `Access` behaviour | v1.1 `as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* | *None* `?\xHEX` | [v1.1] | `0xHEX` | v1.0 From 9e0d711e174eae933af40d989ef14436a412777e Mon Sep 17 00:00:00 2001 From: eksperimental Date: Sat, 4 Mar 2017 10:41:47 +0700 Subject: [PATCH 13/13] Join last two columns in deprecation table --- lib/elixir/pages/Deprecations.md | 86 ++++++++++++++++---------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/lib/elixir/pages/Deprecations.md b/lib/elixir/pages/Deprecations.md index e689d1cdbd5..8f791a7b842 100644 --- a/lib/elixir/pages/Deprecations.md +++ b/lib/elixir/pages/Deprecations.md @@ -13,49 +13,49 @@ Elixir deprecations happens in 3 steps: ## Table of deprecations -Deprecated feature | Deprecated in | Replaced by | Replacement available since -:------------------------ | :------------ | :---------------------- | :--------------------------- -`Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` | v1.3 -`Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` | v1.3 -`GenEvent` module | [v1.5] | `Supervisor` and `GenServer`; [`GenStage`](https://hex.pm/packages/gen_stage); [`:gen_event`](http://www.erlang.org/doc/man/gen_event.html) | v1.0 (`Supervisor` and `GenServer`); v1.3 (`GenStage`); OTP 17 (`:gen_event`) -`Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` | v1.3 -`Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` | v1.3 -`String.to_char_list/1` | [v1.5] | `String.to_charlist/1` | v1.3 -`()` to mean `nil` | [v1.5] | `nil` | v1.0 -`:as_char_lists` value in `t:Inspect.Opts.t/0` type | [v1.5] | `:as_charlists` | v1.3 -`:char_lists` key in `t:Inspect.Opts.t/0` type | [v1.5] | `:charlists` | v1.3 -`char_list/0` type | [v1.5] | `charlist/0` type | v1.3 -`@compile {:parse_transform, _}` in `Module` | [v1.5] | *None* | *None* -`Access.key/1` | [v1.4] | `Access.key/2` | v1.3 -`Behaviour` module | [v1.4] | `@callback` | v1.0 -`Enum.uniq/2` | [v1.4] | `Enum.uniq_by/2` | v1.2 -`Float.to_char_list/2` | [v1.4] | `:erlang.float_to_list/2` | OTP 17 -`Float.to_string/2` | [v1.4] | `:erlang.float_to_binary/2` | OTP 17 -`HashDict` module | [v1.4] | `Map` | v1.2 -`HashSet` module | [v1.4] | `MapSet` | v1.1 -`Set` module | [v1.4] | `MapSet` | v1.1 -`Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` | v1.2 -`IEx.Helpers.import_file/2` | [v1.4] | [`IEx.Helpers.import_file_if_available/1`](https://hexdocs.pm/iex/IEx.Helpers.html#import_file_if_available/1) | v1.3 -`Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` | v1.2 -`Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` | v1.2 -Variable used as function call | [v1.4] | Use parentheses | v1.0 -Anoymous functions with no expression after `->` | [v1.4] | Use an expression or explicitely return `nil` | v1.0 -`Dict` module | [v1.3] | `Keyword`; `Map` | v1.0 (`Keyword`); v1.2 (`Map`) -`Keyword.size/1` | [v1.3] | `Kernel.length/1` | v1.0 -`Map.size/1` | [v1.3] | `Kernel.map_size/1` | v1.0 -`Set` behaviour | [v1.3] | `MapSet` data structure | v1.1 -`String.valid_character?/1` | [v1.3] | `String.valid?/1` | v1.0 -`Task.find/2` | [v1.3] | Use direct message matching | v1.0 -`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | Define the function explicitely | *None* -`/r` option in `Regex` | [v1.3] | `/U` | v1.1 -`\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX`; `\u{X*}` | v1.1 -Map or dictionary as second argument in `Enum.group_by/3` | [v1.3] | Pass a function | v1.3 -Non-map as second argument in `URI.decode_query/2` | [v1.3] | Use a map | v1.0 -`Dict` behaviour | [v1.2] | `MapSet` data structure | v1.1 -`Access` protocol | [v1.1] | `Access` behaviour | v1.1 -`as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* | *None* -`?\xHEX` | [v1.1] | `0xHEX` | v1.0 -Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3* | [v1.1] to [v1.2] | Explicitely check for `""` beforehand | v1.0 +Deprecated feature | Deprecated in | Replaced by (available since) +:----------------------------------------------- | :------------ | :---------------------------- +`Atom.to_char_list/1` | [v1.5] | `Atom.to_charlist/1` (v1.3) +`Float.to_char_list/1` | [v1.5] | `Float.to_charlist/1` (v1.3) +`GenEvent` module | [v1.5] | `Supervisor` and `GenServer` (v1.0);
[`GenStage`](https://hex.pm/packages/gen_stage) (v1.3);
[`:gen_event`](http://www.erlang.org/doc/man/gen_event.html) (OTP 17) +`Integer.to_char_list/1` | [v1.5] | `Integer.to_charlist/1` (v1.3) +`Kernel.to_char_list/1` | [v1.5] | `Kernel.to_charlist/1` (v1.3) +`String.to_char_list/1` | [v1.5] | `String.to_charlist/1` (v1.3) +`()` to mean `nil` | [v1.5] | `nil` (v1.0) +`:as_char_lists` value in `t:Inspect.Opts.t/0` type | [v1.5] | `:as_charlists` (v1.3) +`:char_lists` key in `t:Inspect.Opts.t/0` type | [v1.5] | `:charlists` (v1.3) +`char_list/0` type | [v1.5] | `charlist/0` type (v1.3) +`@compile {:parse_transform, _}` in `Module` | [v1.5] | *None* +`Access.key/1` | [v1.4] | `Access.key/2` (v1.3) +`Behaviour` module | [v1.4] | `@callback` (v1.0) +`Enum.uniq/2` | [v1.4] | `Enum.uniq_by/2` (v1.2) +`Float.to_char_list/2` | [v1.4] | `:erlang.float_to_list/2` (OTP 17) +`Float.to_string/2` | [v1.4] | `:erlang.float_to_binary/2` (OTP 17) +`HashDict` module | [v1.4] | `Map` (v1.2) +`HashSet` module | [v1.4] | `MapSet` (v1.1) +`Set` module | [v1.4] | `MapSet` (v1.1) +`Stream.uniq/2` | [v1.4] | `Stream.uniq_by/2` (v1.2) +`IEx.Helpers.import_file/2` | [v1.4] | [`IEx.Helpers.import_file_if_available/1`](https://hexdocs.pm/iex/IEx.Helpers.html#import_file_if_available/1) (v1.3) +`Mix.Utils.camelize/1` | [v1.4] | `Macro.camelize/1` (v1.2) +`Mix.Utils.underscore/1` | [v1.4] | `Macro.underscore/1` (v1.2) +Variable used as function call | [v1.4] | Use parentheses (v1.0) +Anoymous functions with no expression after `->` | [v1.4] | Use an expression or explicitely return `nil` (v1.0) +`Dict` module | [v1.3] | `Keyword` (v1.0);
`Map` (v1.2) +`Keyword.size/1` | [v1.3] | `Kernel.length/1` (v1.0) +`Map.size/1` | [v1.3] | `Kernel.map_size/1` (v1.0) +`Set` behaviour | [v1.3] | `MapSet` data structure (v1.1) +`String.valid_character?/1` | [v1.3] | `String.valid?/1` (v1.0) +`Task.find/2` | [v1.3] | Use direct message matching (v1.0) +`:append_first` option in `Kernel.defdelegate/2` | [v1.3] | Define the function explicitely (v1.0) +`/r` option in `Regex` | [v1.3] | `/U` (v1.1) +`\x{X*}` inside strings/sigils/charlists | [v1.3] | `\uXXXX` or `\u{X*}` (v1.1) +Map or dictionary as second argument in `Enum.group_by/3` | [v1.3] | Pass a function (v1.3) +Non-map as second argument in `URI.decode_query/2` | [v1.3] | Use a map (v1.0) +`Dict` behaviour | [v1.2] | `MapSet` data structure (v1.1) +`Access` protocol | [v1.1] | `Access` behaviour (v1.1) +`as: true \| false` in `alias/2` and `require/2` | [v1.1] | *None* +`?\xHEX` | [v1.1] | `0xHEX` (v1.0) +Empty string in `String.starts_with?/2`, `String.ends_with?/2`, `String.contains?/2`. *__NOTE__: Feature made back available in v1.3* | [v1.1] to [v1.2] | Explicitely check for `""` beforehand (v1.0) [v1.1]: https://github.com/elixir-lang/elixir/blob/v1.1/CHANGELOG.md#4-deprecations [v1.2]: https://github.com/elixir-lang/elixir/blob/v1.2/CHANGELOG.md#changelog-for-elixir-v12