Skip to content

Commit d68726a

Browse files
committed
More reporting
1 parent 8ed68d0 commit d68726a

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

lib/elixir/lib/inspect.ex

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -571,20 +571,26 @@ defimpl Inspect, for: Any do
571571
|> Enum.reject(&(&1 in except))
572572
|> Enum.filter(&(&1 in only))
573573

574-
optional? =
574+
filtered_guard =
575+
quote do
576+
var!(field) in unquote(filtered_fields)
577+
end
578+
579+
field_guard =
575580
if optional == [] do
576-
false
581+
filtered_guard
577582
else
578583
optional_map = for field <- optional, into: %{}, do: {field, Map.fetch!(struct, field)}
579584

580585
quote do
581-
case unquote(Macro.escape(optional_map)) do
582-
%{^var!(field) => var!(default)} ->
583-
var!(default) == Map.get(var!(struct), var!(field))
584-
585-
%{} ->
586-
false
587-
end
586+
unquote(filtered_guard) and
587+
not case unquote(Macro.escape(optional_map)) do
588+
%{^var!(field) => var!(default)} ->
589+
var!(default) == Map.get(var!(struct), var!(field))
590+
591+
%{} ->
592+
false
593+
end
588594
end
589595
end
590596

@@ -593,7 +599,7 @@ defimpl Inspect, for: Any do
593599
def inspect(var!(struct), var!(opts)) do
594600
var!(infos) =
595601
for %{field: var!(field)} = var!(info) <- unquote(module).__info__(:struct),
596-
var!(field) in unquote(filtered_fields) and not unquote(optional?),
602+
unquote(field_guard),
597603
do: var!(info)
598604

599605
var!(name) = Macro.inspect_atom(:literal, unquote(module))

lib/elixir/src/elixir_expand.erl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,15 @@ expand_case(Meta, Expr, Opts, S, E) ->
732732
end,
733733

734734
{EOpts, SO, EO} = elixir_clauses:'case'(Meta, ROpts, SE, EE),
735-
{{'case', Meta, [EExpr, EOpts]}, SO, EO}.
735+
736+
case prune_case_clauses(EExpr, EOpts) of
737+
{ok, Pruned} -> {Pruned, SO, EO};
738+
error -> {{'case', Meta, [EExpr, EOpts]}, SO, EO}
739+
end.
740+
741+
prune_case_clauses(false, [{do, [{'->', _, [[false], Body]}, {'->', _, [[true], _]}]}]) -> {ok, Body};
742+
prune_case_clauses(true, [{do, [{'->', _, [[false], _]}, {'->', _, [[true], Body]}]}]) -> {ok, Body};
743+
prune_case_clauses(_, _) -> error.
736744

737745
rewrite_case_clauses([{do, [
738746
{'->', FalseMeta, [

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,16 @@ defmodule Module.Types.ExprTest do
10511051
end
10521052
end
10531053

1054+
describe "conditionals" do
1055+
test "if does not report on literal booleans" do
1056+
assert typecheck!(
1057+
if true do
1058+
:ok
1059+
end
1060+
) == atom([:ok])
1061+
end
1062+
end
1063+
10541064
describe "receive" do
10551065
test "returns unions of all clauses" do
10561066
assert typecheck!(

0 commit comments

Comments
 (0)