Skip to content

Commit 9595fb1

Browse files
author
José Valim
committed
Raise KeyError for now in map.bad_field
1 parent d2530e4 commit 9595fb1

File tree

10 files changed

+37
-26
lines changed

10 files changed

+37
-26
lines changed

lib/elixir/lib/dict.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,6 @@ defmodule Dict do
191191
iex> d = Enum.into([a: 1], dict_impl.new)
192192
iex> Dict.fetch!(d, :a)
193193
1
194-
iex> Dict.fetch!(d, :b)
195-
** (KeyError) key not found: :b
196194
197195
"""
198196
@spec fetch!(t, key) :: value | no_return

lib/elixir/lib/dict/behaviour.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ defmodule Dict.Behaviour do
7979
def fetch!(dict, key) do
8080
case fetch(dict, key) do
8181
{ :ok, value } -> value
82-
:error -> raise KeyError, key: key
82+
:error -> raise KeyError, key: key, term: dict
8383
end
8484
end
8585

lib/elixir/lib/exception.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ defexception ErlangError, [original: nil] do
111111
end
112112
end
113113

114-
defexception KeyError, key: nil do
114+
defexception KeyError, key: nil, term: nil do
115115
def message(exception) do
116-
"key not found: #{inspect exception.key}"
116+
"key #{inspect exception.key} not found in: #{inspect exception.term}"
117117
end
118118
end
119119

lib/elixir/lib/hash_dict.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ defmodule HashDict do
6060
trie(root: root, size: size + counter)
6161
end
6262

63-
def update!(trie(root: root, size: size), key, fun) when is_function(fun, 1) do
64-
{ root, counter } = do_update(root, key, fn -> raise KeyError, key: key end, fun, key_hash(key))
63+
def update!(trie(root: root, size: size) = dict, key, fun) when is_function(fun, 1) do
64+
{ root, counter } = do_update(root, key, fn -> raise KeyError, key: key, term: dict end,
65+
fun, key_hash(key))
6566
trie(root: root, size: size + counter)
6667
end
6768

lib/elixir/lib/keyword.ex

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,14 @@ defmodule Keyword do
160160
1
161161
162162
iex> Keyword.fetch!([a: 1], :b)
163-
** (KeyError) key not found: :b
163+
** (KeyError) key :b not found in: [a: 1]
164164
165165
"""
166166
@spec fetch!(t, key) :: value | no_return
167167
def fetch!(keywords, key) when is_list(keywords) and is_atom(key) do
168168
case :lists.keyfind(key, 1, keywords) do
169169
{ ^key, value } -> value
170-
false -> raise(KeyError, key: key)
170+
false -> raise(KeyError, key: key, term: keywords)
171171
end
172172
end
173173

@@ -401,20 +401,24 @@ defmodule Keyword do
401401
[a: 2]
402402
403403
iex> Keyword.update!([a: 1], :b, &(&1 * 2))
404-
** (KeyError) key not found: :b
404+
** (KeyError) key :b not found in: [a: 1]
405405
406406
"""
407407
@spec update!(t, key, (value -> value)) :: t | no_return
408-
def update!([{key, value}|keywords], key, fun) do
408+
def update!(keywords, key, fun) do
409+
update!(keywords, key, fun, keywords)
410+
end
411+
412+
defp update!([{key, value}|keywords], key, fun, dict) do
409413
[{key, fun.(value)}|delete(keywords, key)]
410414
end
411415

412-
def update!([{_, _} = e|keywords], key, fun) do
413-
[e|update!(keywords, key, fun)]
416+
defp update!([{_, _} = e|keywords], key, fun, dict) do
417+
[e|update!(keywords, key, fun, dict)]
414418
end
415419

416-
def update!([], key, _fun) when is_atom(key) do
417-
raise(KeyError, key: key)
420+
defp update!([], key, _fun, dict) when is_atom(key) do
421+
raise(KeyError, key: key, term: dict)
418422
end
419423

420424
@doc """

lib/elixir/lib/list_dict.ex

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ defmodule ListDict do
5757
def fetch!(dict, key) do
5858
case fetch(dict, key) do
5959
{ :ok, value } -> value
60-
:error -> raise(KeyError, key: key)
60+
:error -> raise(KeyError, key: key, term: dict)
6161
end
6262
end
6363

@@ -109,16 +109,20 @@ defmodule ListDict do
109109
for { k, _ } = tuple <- dict, not k in keys, do: tuple
110110
end
111111

112-
def update!([{key, value}|dict], key, fun) do
113-
[{key, fun.(value)}|delete(dict, key)]
112+
def update!(list, key, fun) do
113+
update!(list, key, fun, list)
114+
end
115+
116+
defp update!([{key, value}|list], key, fun, dict) do
117+
[{key, fun.(value)}|delete(list, key)]
114118
end
115119

116-
def update!([{_, _} = e|dict], key, fun) do
117-
[e|update!(dict, key, fun)]
120+
defp update!([{_, _} = e|list], key, fun, dict) do
121+
[e|update!(list, key, fun, dict)]
118122
end
119123

120-
def update!([], key, _fun) do
121-
raise(KeyError, key: key)
124+
defp update!([], key, _fun, dict) do
125+
raise(KeyError, key: key, term: dict)
122126
end
123127

124128
def update([{key, value}|dict], key, _initial, fun) do

lib/elixir/lib/map.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ defmodule Map do
8989
def update!(map, key, fun) do
9090
case :maps.find(key, map) do
9191
:error ->
92-
raise(KeyError, key: key)
92+
raise(KeyError, key: key, term: map)
9393
{ :ok, val } ->
9494
:maps.put(key, fun.(val), map)
9595
end

lib/elixir/lib/record.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ defmodule Record do
8383
iex> Record.record?(record)
8484
true
8585
iex> integer = 13
86-
iex> Record.record?(13)
86+
iex> Record.record?(integer)
8787
false
8888
8989
"""

lib/elixir/src/elixir_translator.erl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,11 @@ translate({ { '.', _, [Left, Right] }, Meta, Args }, S)
229229
true ->
230230
{ Var, _, SV } = elixir_scope:build_var('_', SC),
231231
TVar = { var, Line, Var },
232-
TMap = { tuple, Line, [{ atom, Line, badarg }, TVar] },
232+
TMap = { tuple, Line, [
233+
{ atom, Line, 'Elixir.KeyError' },
234+
{ atom, Line, '__exception__' },
235+
TRight,
236+
TVar] },
233237

234238
{ { 'case', -1, TLeft, [
235239
{ clause, -1,

lib/elixir/test/elixir/map_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ defmodule MapTest do
9393
test "map access" do
9494
assert two_items_map.a == 1
9595

96-
assert_raise ArgumentError, fn ->
96+
assert_raise KeyError, fn ->
9797
two_items_map.c
9898
end
9999
end

0 commit comments

Comments
 (0)