Skip to content

Commit 2916f20

Browse files
committed
Keep warnings on map/remote dispatch with/without parens
Closes #15219.
1 parent 03b9fde commit 2916f20

3 files changed

Lines changed: 30 additions & 23 deletions

File tree

lib/elixir/lib/module/types.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ defmodule Module.Types do
480480
def format_diagnostic({:unused_clause, kind, {fun, arity}}) do
481481
%{
482482
message:
483-
"this clause of #{kind} #{fun}/#{arity} is never used (or it will always fail when invoked)"
483+
"this clause of #{kind} #{fun}/#{arity} is never used (or it will always fail/warn when invoked)"
484484
}
485485
end
486486

lib/elixir/src/elixir_erl_pass.erl

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44

55
%% Translate Elixir quoted expressions to Erlang Abstract Format.
66
-module(elixir_erl_pass).
7-
-export([translate/3, translate_args/3, no_parens_error/2]).
8-
%% TODO: Remove me on Elixir v2.0.
9-
-export([parens_map_field/2, no_parens_remote/2]).
7+
-export([translate/3, translate_args/3, no_parens_remote/2, parens_map_field/2]).
108
-include("elixir.hrl").
119

1210
%% =
@@ -241,13 +239,15 @@ translate({{'.', _, [Left, Right]}, Meta, []}, _Ann, S)
241239
Ann = ?ann(Meta),
242240
{TLeft, SL} = translate(Left, Ann, S),
243241
TRight = {atom, Ann, Right},
242+
244243
Generated = erl_anno:set_generated(true, Ann),
244+
{InnerVar, SI} = elixir_erl_var:build('_', SL),
245+
TInnerVar = {var, Generated, InnerVar},
246+
{Var, SV} = elixir_erl_var:build('_', SI),
247+
TVar = {var, Generated, Var},
245248

246249
case proplists:get_value(no_parens, Meta, false) of
247250
true ->
248-
{Var, SV} = elixir_erl_var:build('_', SL),
249-
TVar = {var, Generated, Var},
250-
251251
{{'case', Generated, TLeft, [
252252
{clause, Generated,
253253
[{map, Ann, [{map_field_exact, Ann, TRight, TVar}]}],
@@ -256,13 +256,24 @@ translate({{'.', _, [Left, Right]}, Meta, []}, _Ann, S)
256256
{clause, Generated,
257257
[TVar],
258258
[],
259-
[?remote(Ann, erlang, error, [
260-
?remote(Generated, elixir_erl_pass, no_parens_error, [TVar, TRight])
261-
])]}
259+
[{'case', Generated, ?remote(Generated, elixir_erl_pass, no_parens_remote, [TVar, TRight]), [
260+
{clause, Generated,
261+
[{tuple, Generated, [{atom, Generated, ok}, TInnerVar]}], [], [TInnerVar]},
262+
{clause, Generated,
263+
[{tuple, Generated, [{atom, Generated, error}, TInnerVar]}], [], [?remote(Ann, erlang, error, [TInnerVar])]}
264+
]}]}
262265
]}, SV};
263-
264266
false ->
265-
{{call, Generated, {remote, Generated, TLeft, TRight}, []}, SL}
267+
{{'case', Generated, TLeft, [
268+
{clause, Generated,
269+
[{map, Ann, [{map_field_exact, Ann, TRight, TVar}]}],
270+
[],
271+
[?remote(Generated, elixir_erl_pass, parens_map_field, [TRight, TVar])]},
272+
{clause, Generated,
273+
[TVar],
274+
[],
275+
[{call, Generated, {remote, Generated, TVar, TRight}, []}]}
276+
]}, SV}
266277
end;
267278

268279
translate({{'.', _, [Left, Right]}, Meta, Args}, _Ann, S)
@@ -740,13 +751,9 @@ generate_struct_name_guard([{map_field_exact, Ann, {atom, _, '__struct__'} = Key
740751
generate_struct_name_guard([Field | Rest], Acc, S) ->
741752
generate_struct_name_guard(Rest, [Field | Acc], S).
742753

743-
no_parens_error(#{} = Map, Key) ->
744-
{badkey, Key, Map};
745-
no_parens_error(Other, _Key) ->
746-
{badmap, Other}.
747-
748-
%% TODO: Previous Elixir code was compiled with these functions,
749-
%% so we have to keep them.
754+
%% TODO: Make this a runtime error on Elixir v2.0
755+
%% Note we must keep these old functions around for
756+
%% a while as compiled code may still call them.
750757
no_parens_remote(nil, _Key) -> {error, {badmap, nil}};
751758
no_parens_remote(false, _Key) -> {error, {badmap, false}};
752759
no_parens_remote(true, _Key) -> {error, {badmap, true}};
@@ -774,4 +781,4 @@ parens_map_field(Key, Value) ->
774781
)
775782
end,
776783
'Elixir.IO':warn_once(?MODULE, Message, 3),
777-
Value.
784+
Value.

lib/elixir/test/elixir/module/types/integration_test.exs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,23 +416,23 @@ defmodule Module.Types.IntegrationTest do
416416

417417
warnings = [
418418
"""
419-
warning: this clause of defp private/1 is never used (or it will always fail when invoked)
419+
warning: this clause of defp private/1 is never used (or it will always fail/warn when invoked)
420420
421421
6 │ defp private(nil), do: nil
422422
│ ~
423423
424424
└─ a.ex:6:8: A.private/1
425425
""",
426426
"""
427-
warning: this clause of defp private/1 is never used (or it will always fail when invoked)
427+
warning: this clause of defp private/1 is never used (or it will always fail/warn when invoked)
428428
429429
7 │ defp private("foo"), do: "foo"
430430
│ ~
431431
432432
└─ a.ex:7:8: A.private/1
433433
""",
434434
"""
435-
warning: this clause of defp private/1 is never used (or it will always fail when invoked)
435+
warning: this clause of defp private/1 is never used (or it will always fail/warn when invoked)
436436
437437
10 │ defp private("bar"), do: "bar"
438438
│ ~

0 commit comments

Comments
 (0)