diff --git a/lib/elixir/src/elixir_fn.erl b/lib/elixir/src/elixir_fn.erl index 668b201909d..fafdbd8207a 100644 --- a/lib/elixir/src/elixir_fn.erl +++ b/lib/elixir/src/elixir_fn.erl @@ -112,6 +112,10 @@ capture_expr(Meta, Expr, S, E, Escaped, Sequential) -> case escape(Expr, E, Escaped) of {_, []} when not Sequential -> invalid_capture(Meta, Expr, E); + {{{'.', _, [_, _]} = Dot, _, Args}, []} -> + Meta2 = lists:keydelete(no_parens, 1, Meta), + Fn = {fn, Meta2, [{'->', Meta2, [[], {Dot, Meta2, Args}]}]}, + {expand, Fn, S, E}; {EExpr, EDict} -> EVars = validate(Meta, EDict, 1, E), Fn = {fn, Meta, [{'->', Meta, [EVars, EExpr]}]}, diff --git a/lib/elixir/test/elixir/kernel/expansion_test.exs b/lib/elixir/test/elixir/kernel/expansion_test.exs index 81b0a65a70b..4e08384a5b0 100644 --- a/lib/elixir/test/elixir/kernel/expansion_test.exs +++ b/lib/elixir/test/elixir/kernel/expansion_test.exs @@ -1203,6 +1203,11 @@ defmodule Kernel.ExpansionTest do [{:->, [{:line, 1}], [[{:capture, [line: 1], nil}], {:capture, [line: 1], nil}]}]} end + test "removes no_parens when expanding 0-arity capture to fn" do + assert expand(quote(do: &foo().bar/0)) == + quote(do: fn -> foo().bar() end) + end + test "expands remotes" do assert expand(quote(do: &List.flatten/2)) == quote(do: &:"Elixir.List".flatten/2) diff --git a/lib/elixir/test/elixir/kernel/fn_test.exs b/lib/elixir/test/elixir/kernel/fn_test.exs index 1304d753577..0d0e8471994 100644 --- a/lib/elixir/test/elixir/kernel/fn_test.exs +++ b/lib/elixir/test/elixir/kernel/fn_test.exs @@ -95,6 +95,12 @@ defmodule Kernel.FnTest do assert (&mod.flatten/1) == (&List.flatten/1) end + test "capture with module from local call" do + assert (&math_mod().pi/0).() == :math.pi() + end + + defp math_mod, do: :math + test "local partial application" do assert (&atb(&1, :utf8)).(:a) == "a" assert (&atb(List.to_atom(&1), :utf8)).(~c"a") == "a"