Skip to content

Commit 6e018c5

Browse files
author
José Valim
committed
Ensure record args are evaluated in the parent context, closes #1065
1 parent 95377a3 commit 6e018c5

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

lib/elixir/lib/kernel.ex

+8-2
Original file line numberDiff line numberDiff line change
@@ -1485,8 +1485,14 @@ defmodule Kernel do
14851485
14861486
See `Record.import/2` and `defrecordp/2` documentation for more information
14871487
"""
1488-
defmacro defrecord(name, fields, opts // [], do_block // []) do
1489-
Record.defrecord(name, fields, Keyword.merge(opts, do_block))
1488+
1489+
defmacro defrecord(name, fields, do_block // [])
1490+
1491+
defmacro defrecord(name, fields, do_block) do
1492+
case is_list(fields) and Keyword.get(fields, :do, false) do
1493+
false -> Record.defrecord(name, fields, do_block)
1494+
other -> Record.defrecord(name, Keyword.delete(fields, :do), do: other)
1495+
end
14901496
end
14911497

14921498
@doc """

lib/elixir/lib/record.ex

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ defmodule Record do
2727
opts = Keyword.delete(opts, :do)
2828

2929
quote do
30+
values = unquote(values)
31+
3032
defmodule unquote(name) do
3133
@moduledoc false
3234
import Record.DSL
3335

3436
@record_fields []
3537
@record_types []
3638

37-
values = unquote(values)
38-
opts = unquote(opts)
3939
Record.deffunctions(values, __ENV__)
4040
value = unquote(block)
4141
Record.deftypes(values, @record_types, __ENV__)

lib/elixir/test/elixir/record_test.exs

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ defrecord name, a: 0, b: 1 do
3333
end
3434
end
3535

36+
defmodule RecordTest.DynamicOpts do
37+
@a [foo: 1..30]
38+
defrecord State, (lc {name, _interval} inlist @a, do: {name, nil})
39+
end
40+
3641
## With types
3742

3843
defrecord RecordTest.WithTypeOverriden, a: 0, b: 1 do

0 commit comments

Comments
 (0)