Skip to content

Commit 5309843

Browse files
author
José Valim
committed
Unify testing of evaluator related functionality
Signed-off-by: José Valim <jose.valim@plataformatec.com.br>
1 parent 1a2c2dc commit 5309843

File tree

4 files changed

+38
-40
lines changed

4 files changed

+38
-40
lines changed

lib/iex/lib/iex/autocomplete.ex

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ defmodule IEx.Autocomplete do
185185

186186
defp expand_alias([name | rest] = list, server) do
187187
module = Module.concat(Elixir, name)
188-
Enum.find_value env_aliases(server), list, fn {alias, mod} ->
188+
Enum.find_value aliases_from_env(server), list, fn {alias, mod} ->
189189
if alias === module do
190190
case Atom.to_string(mod) do
191191
"Elixir." <> mod ->
@@ -197,12 +197,8 @@ defmodule IEx.Autocomplete do
197197
end
198198
end
199199

200-
defp env_aliases(server), do: server.current_env.aliases
201-
202-
defp get_evaluator(server), do: server.evaluator
203-
204200
defp match_aliases(hint, server) do
205-
for {alias, _mod} <- env_aliases(server),
201+
for {alias, _mod} <- aliases_from_env(server),
206202
[name] = Module.split(alias),
207203
starts_with?(name, hint) do
208204
%{kind: :module, type: :alias, name: name}
@@ -386,8 +382,17 @@ defmodule IEx.Autocomplete do
386382
:binary.part(name, hint_size, byte_size(name) - hint_size)
387383
end
388384

385+
defp aliases_from_env(server) do
386+
with evaluator when is_pid(evaluator) <- server.evaluator,
387+
{:ok, aliases} <- IEx.Evaluator.value_from_env(evaluator, :aliases) do
388+
aliases
389+
else
390+
_ -> []
391+
end
392+
end
393+
389394
defp value_from_binding(ast_node, server) do
390-
with evaluator when is_pid(evaluator) <- get_evaluator(server),
395+
with evaluator when is_pid(evaluator) <- server.evaluator(),
391396
{var, map_key_path} <- extract_from_ast(ast_node, []) do
392397
IEx.Evaluator.value_from_binding(evaluator, var, map_key_path)
393398
else

lib/iex/lib/iex/evaluator.ex

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,29 @@ defmodule IEx.Evaluator do
4040
end
4141
end
4242

43+
@doc """
44+
Returns the current session environment if a session exists.
45+
"""
46+
@spec value_from_env(pid, atom) :: {:ok, term} | :error
47+
def value_from_env(evaluator, key) do
48+
ref = make_ref()
49+
send evaluator, {:value_from_env, ref, self(), key}
50+
51+
receive do
52+
{^ref, result} -> result
53+
after
54+
5000 -> :error
55+
end
56+
end
57+
4358
defp loop(server, history, state) do
4459
receive do
4560
{:eval, ^server, code, iex_state} ->
4661
{result, history, state} = eval(code, iex_state, history, state)
4762
send server, {:evaled, self(), result}
4863
loop(server, history, state)
49-
{:peek_env, receiver} ->
50-
send receiver, {:peek_env, state.env}
64+
{:value_from_env, ref, receiver, key} ->
65+
send receiver, {ref, Map.fetch(state.env, key)}
5166
loop(server, history, state)
5267
{:value_from_binding, ref, receiver, var_name, map_key_path} ->
5368
value = traverse_binding(state.binding, var_name, map_key_path)

lib/iex/lib/iex/server.ex

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,6 @@ defmodule IEx.Server do
5555
end
5656
end
5757

58-
@doc """
59-
Returns the current session environment if a session exists.
60-
"""
61-
@spec current_env :: Macro.Env.t
62-
def current_env() do
63-
case IEx.Server.whereis() do
64-
nil -> %Macro.Env{}
65-
server ->
66-
send(server, {:peek_env, self()})
67-
receive do
68-
{:peek_env, %Macro.Env{} = env} -> env
69-
after
70-
5000 -> %Macro.Env{}
71-
end
72-
end
73-
end
74-
7558
@doc """
7659
Requests to take over the given shell from the
7760
current process.
@@ -209,9 +192,6 @@ defmodule IEx.Server do
209192
exit_loop(evaluator, evaluator_ref)
210193
{:input, ^input, {:error, :terminated}} ->
211194
exit_loop(evaluator, evaluator_ref)
212-
{:peek_env, receiver} ->
213-
send evaluator, {:peek_env, receiver}
214-
wait_input(state, evaluator, evaluator_ref, input)
215195
msg ->
216196
handle_take_over(msg, evaluator, evaluator_ref, input, fn ->
217197
wait_input(state, evaluator, evaluator_ref, input)

lib/iex/test/iex/autocomplete_test.exs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,14 @@ defmodule IEx.AutocompleteTest do
1818
:ok
1919
end
2020

21+
defmodule MyServer do
22+
def evaluator do
23+
Process.get(:evaluator)
24+
end
25+
end
26+
2127
def expand(expr) do
22-
IEx.Autocomplete.expand(Enum.reverse(expr), __MODULE__.MyServer)
28+
IEx.Autocomplete.expand(Enum.reverse(expr), MyServer)
2329
end
2430

2531
test "Erlang module completion" do
@@ -207,22 +213,14 @@ defmodule IEx.AutocompleteTest do
207213
assert expand('IEx.AutocompleteTest.SublevelTest.') == {:yes, 'LevelA', []}
208214
end
209215

210-
defmodule MyServer do
211-
def current_env do
212-
%Macro.Env{aliases: [{MyList, List}, {EList, :lists}]}
213-
end
214-
215-
def evaluator do
216-
Process.get(:evaluator)
217-
end
218-
end
219-
216+
@tag previous_line: "alias List, as: MyList"
220217
test "complete aliases of Elixir modules" do
221218
assert expand('MyL') == {:yes, 'ist', []}
222219
assert expand('MyList') == {:yes, '.', []}
223220
assert expand('MyList.to_integer') == {:yes, [], ['to_integer/1', 'to_integer/2']}
224221
end
225222

223+
@tag previous_line: "alias :lists, as: EList"
226224
test "complete aliases of Erlang modules" do
227225
assert expand('EL') == {:yes, 'ist', []}
228226
assert expand('EList') == {:yes, '.', []}

0 commit comments

Comments
 (0)