Skip to content

Commit 203ddd0

Browse files
author
José Valim
committed
Merge pull request #1837 from zambal/decompose_call
Add Macro.decompose_call/1
2 parents ab91165 + 5cf7f22 commit 203ddd0

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

lib/elixir/lib/macro.ex

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,31 @@ defmodule Macro do
103103
:elixir_clauses.extract_args(expr)
104104
end
105105

106+
@doc """
107+
Decomposes a local or remote call into its module alias (when a remote
108+
call is provided), function name and argument list.
109+
Returns :error when an invalid call syntax is provied.
110+
111+
## Examples
112+
113+
decompose_call(quote do: foo) == { :foo, [] }
114+
decompose_call(quote do: foo()) == { :foo, [] }
115+
decompose_call(quote do: foo(1, 2, 3)) == { :foo, [1, 2, 3] }
116+
decompose_call(quote do: M.N.foo(1, 2, 3)) ==
117+
{ { :__aliases__, [alias: false], [:M, :N] }, :foo, [1, 2, 3] }
118+
decompose_call(quote do: 42) == :error
119+
120+
"""
121+
@spec decompose_call(Macro.t) :: { atom, [Macro.t] } | { Macro.t, atom, [Macro.t] } | :error
122+
def decompose_call(expr) do
123+
case expr do
124+
{ { :., _, [{ :__aliases__, meta, atoms }, f] }, _, args } ->
125+
{ { :__aliases__, meta, atoms }, f, args }
126+
_local ->
127+
:elixir_clauses.extract_args(expr)
128+
end
129+
end
130+
106131
@doc """
107132
Recursively escapes a value so it can be inserted
108133
into a syntax tree.

lib/elixir/test/elixir/macro_test.exs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,19 @@ defmodule MacroTest do
406406
assert Macro.extract_args(quote do: 1.(1, 2, 3)) == :error
407407
end
408408

409+
## decompose_call
410+
411+
test :decompose_call do
412+
assert Macro.decompose_call(quote do: foo) == { :foo, [] }
413+
assert Macro.decompose_call(quote do: foo()) == { :foo, [] }
414+
assert Macro.decompose_call(quote do: :foo.()) == { :foo, [] }
415+
assert Macro.decompose_call(quote do: foo(1, 2, 3)) == { :foo, [1, 2, 3] }
416+
assert Macro.decompose_call(quote do: M.N.foo(1, 2, 3)) ==
417+
{ { :__aliases__, [alias: false], [:M, :N] }, :foo, [1, 2, 3] }
418+
assert Macro.decompose_call(quote do: 1.(1, 2, 3)) == :error
419+
assert Macro.decompose_call(quote do: "some string") == :error
420+
end
421+
409422
## env
410423

411424
test :env_stacktrace do

0 commit comments

Comments
 (0)