Skip to content

Commit 54c25a5

Browse files
committed
Add compile time optimisation to record fields macro
1 parent 69b78da commit 54c25a5

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

lib/elixir/lib/record.ex

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,15 @@ defmodule Record do
195195
Keyword.keyword?(args) ->
196196
create(atom, fields, args, caller)
197197
true ->
198-
quote do: Record.__keyword__(unquote(atom), unquote(fields), unquote(args))
198+
case Macro.expand(args, caller) do
199+
{:{}, _, [^atom|list]} when length(list) == length(fields) ->
200+
record = List.to_tuple([atom|list])
201+
Macro.escape(Record.__keyword__(atom, fields, record))
202+
{^atom, arg} when length(fields) == 1 ->
203+
Macro.escape(Record.__keyword__(atom, fields, {atom, arg}))
204+
_ ->
205+
quote do: Record.__keyword__(unquote(atom), unquote(fields), unquote(args))
206+
end
199207
end
200208
end
201209

@@ -291,7 +299,7 @@ defmodule Record do
291299
[_tag|values] = Tuple.to_list(record)
292300
join_keyword(fields, values, [])
293301
else
294-
msg = "expected argument to be a literal atom, literal keyword or a #{atom}() record, got runtime: #{inspect record}"
302+
msg = "expected argument to be a literal atom, literal keyword or a #{inspect atom} record, got runtime: #{inspect record}"
295303
raise ArgumentError, msg
296304
end
297305
end

lib/elixir/test/elixir/record_test.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ defmodule RecordTest do
8181

8282
record = user()
8383
assert user(record) == [name: "José", age: 25]
84+
assert user(user()) == [name: "José", age: 25]
8485

85-
msg = "expected argument to be a literal atom, literal keyword or a file_info() record, " <>
86+
msg = "expected argument to be a literal atom, literal keyword or a :file_info record, " <>
8687
"got runtime: {RecordTest, \"José\", 25}"
8788
assert_raise ArgumentError, msg, fn ->
8889
file_info(record)

0 commit comments

Comments
 (0)