Skip to content

Commit d90c7bb

Browse files
author
José Valim
committed
Translate built-in Elixir apps sources, closes #6562
1 parent 5b3e13c commit d90c7bb

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

lib/iex/lib/iex/introspection.ex

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ defmodule IEx.Introspection do
114114
defp open_mfa(module, fun, arity) do
115115
with {:module, _} <- Code.ensure_loaded(module),
116116
source when is_list(source) <- module.module_info(:compile)[:source] do
117-
open_abstract_code(module, fun, arity, List.to_string(source))
117+
source = rewrite_elixir_source(module, source)
118+
open_abstract_code(module, fun, arity, source)
118119
else
119120
_ -> :error
120121
end
@@ -158,6 +159,21 @@ defmodule IEx.Introspection do
158159
end
159160
end
160161

162+
defp rewrite_elixir_source(module, source) do
163+
case :application.get_application(module) do
164+
{:ok, app} when app in [:eex, :elixir, :ex_unit, :iex, :logger, :mix] ->
165+
{in_app, [lib_or_src | _]} =
166+
source
167+
|> Path.split()
168+
|> Enum.reverse()
169+
|> Enum.split_while(& &1 not in ["lib", "src"])
170+
171+
Application.app_dir(app, Path.join([lib_or_src | Enum.reverse(in_app)]))
172+
_ ->
173+
List.to_string(source)
174+
end
175+
end
176+
161177
@doc """
162178
Prints documentation.
163179
"""

lib/iex/test/iex/helpers_test.exs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ defmodule IEx.HelpersTest do
123123
end
124124

125125
describe "open" do
126-
@iex_helpers Path.expand("../../lib/iex/helpers.ex", __DIR__)
127-
@elixir_erl Path.expand("../../../elixir/src/elixir.erl", __DIR__)
126+
@iex_helpers "iex/lib/iex/helpers.ex"
127+
@elixir_erl "elixir/src/elixir.erl"
128128
@editor System.get_env("ELIXIR_EDITOR")
129129

130130
test "opens __FILE__ and __LINE__" do
@@ -137,48 +137,48 @@ defmodule IEx.HelpersTest do
137137

138138
test "opens Elixir module" do
139139
assert capture_iex("open(IEx.Helpers)") |> maybe_trim_quotes() =~
140-
~r/#{@iex_helpers}:1/
140+
~r/#{@iex_helpers}:1$/
141141
end
142142

143143
test "opens function" do
144144
assert capture_iex("open(h)") |> maybe_trim_quotes() =~
145-
~r/#{@iex_helpers}:\d+/
145+
~r/#{@iex_helpers}:\d+$/
146146
end
147147

148148
test "opens function/arity" do
149149
assert capture_iex("open(b/1)") |> maybe_trim_quotes() =~
150-
~r/#{@iex_helpers}:\d+/
150+
~r/#{@iex_helpers}:\d+$/
151151
assert capture_iex("open(h/0)") |> maybe_trim_quotes() =~
152-
~r/#{@iex_helpers}:\d+/
152+
~r/#{@iex_helpers}:\d+$/
153153
end
154154

155155
test "opens module.function" do
156156
assert capture_iex("open(IEx.Helpers.b)") |> maybe_trim_quotes() =~
157-
~r/#{@iex_helpers}:\d+/
157+
~r/#{@iex_helpers}:\d+$/
158158
assert capture_iex("open(IEx.Helpers.h)") |> maybe_trim_quotes() =~
159-
~r/#{@iex_helpers}:\d+/
159+
~r/#{@iex_helpers}:\d+$/
160160
end
161161

162162
test "opens module.function/arity" do
163163
assert capture_iex("open(IEx.Helpers.b/1)") |> maybe_trim_quotes() =~
164-
~r/#{@iex_helpers}:\d+/
164+
~r/#{@iex_helpers}:\d+$/
165165
assert capture_iex("open(IEx.Helpers.h/0)") |> maybe_trim_quotes() =~
166-
~r/#{@iex_helpers}:\d+/
166+
~r/#{@iex_helpers}:\d+$/
167167
end
168168

169169
test "opens Erlang module" do
170170
assert capture_iex("open(:elixir)") |> maybe_trim_quotes() =~
171-
~r/#{@elixir_erl}:\d+/
171+
~r/#{@elixir_erl}:\d+$/
172172
end
173173

174174
test "opens Erlang module.function" do
175175
assert capture_iex("open(:elixir.start)") |> maybe_trim_quotes() =~
176-
~r/#{@elixir_erl}:\d+/
176+
~r/#{@elixir_erl}:\d+$/
177177
end
178178

179179
test "opens Erlang module.function/arity" do
180180
assert capture_iex("open(:elixir.start/2)") |> maybe_trim_quotes() =~
181-
~r/#{@elixir_erl}:\d+/
181+
~r/#{@elixir_erl}:\d+$/
182182
end
183183

184184
test "errors if module is not available" do

0 commit comments

Comments
 (0)