Skip to content

Commit ba1ec1b

Browse files
committed
Fix derive with _ key
Summary: Test Plan:
1 parent e5ccbcc commit ba1ec1b

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

lib/encoder.ex

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ end
7777
defimpl Jason.Encoder, for: Any do
7878
defmacro __deriving__(module, struct, opts) do
7979
fields = fields_to_encode(struct, opts)
80-
kv = Enum.map(fields, &{&1, generated_var(&1, __MODULE__)})
80+
kv = Enum.map(fields, &{&1, generated_var(&1)})
8181
escape = quote(do: escape)
8282
encode_map = quote(do: encode_map)
8383
encode_args = [escape, encode_map]
@@ -94,9 +94,12 @@ defimpl Jason.Encoder, for: Any do
9494
end
9595
end
9696

97-
# The same as Macro.var/2 except it sets generated: true
98-
defp generated_var(name, context) do
99-
{name, [generated: true], context}
97+
# The same as Macro.var/2 except it sets generated: true and handles _ key
98+
defp generated_var(:_) do
99+
{:__, [generated: true], __MODULE__.Underscore}
100+
end
101+
defp generated_var(name) do
102+
{name, [generated: true], __MODULE__}
100103
end
101104

102105
def encode(%_{} = struct, _opts) do

test/encode_test.exs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ defmodule Jason.EncoderTest do
135135
defstruct name: "", size: 0
136136
end
137137

138+
defmodule DerivedWeirdKey do
139+
@derive Encoder
140+
defstruct [:_]
141+
end
142+
138143
defmodule NonDerived do
139144
defstruct name: ""
140145
end
@@ -154,6 +159,9 @@ defmodule Jason.EncoderTest do
154159

155160
derived_using_except = %DerivedUsingExcept{name: "derived using :except", size: 10}
156161
assert to_json(derived_using_except) == ~s({"size":10})
162+
163+
derived_weird_key = %DerivedWeirdKey{}
164+
assert to_json(derived_weird_key) == ~s({"_":null})
157165
end
158166

159167
test "@derive validate `except:`" do

0 commit comments

Comments
 (0)