@@ -95,4 +95,158 @@ defmodule ElixirSense.Providers.Definition.LocatorTest do
9595 assert location . line == 4
9696 assert location . column == 11
9797 end
98+
99+ test "finds definition when using Kernel.use qualified call" do
100+ code = """
101+ defmodule MyModule do
102+ Kernel.use(ElixirSense.Providers.Definition.LocatorTest.MyBehaviour)
103+
104+ def test do
105+ my_function()
106+ end
107+ end
108+ """
109+
110+ { line , column } = { 5 , 5 }
111+
112+ location = Locator . definition ( code , line , column )
113+
114+ assert location != nil
115+ assert location . type == :function
116+ assert location . line == 4
117+ assert location . column == 11
118+ end
119+
120+ test "finds definition when using module alias" do
121+ code = """
122+ defmodule MyModule do
123+ alias ElixirSense.Providers.Definition.LocatorTest.MyBehaviour
124+
125+ use MyBehaviour
126+
127+ def test do
128+ my_function()
129+ end
130+ end
131+ """
132+
133+ { line , column } = { 7 , 5 }
134+
135+ location = Locator . definition ( code , line , column )
136+
137+ assert location != nil
138+ assert location . type == :function
139+ assert location . line == 4
140+ assert location . column == 11
141+ end
142+
143+ test "finds definition when using module with custom alias" do
144+ code = """
145+ defmodule MyModule do
146+ alias ElixirSense.Providers.Definition.LocatorTest.MyBehaviour, as: MyB
147+
148+ use MyB
149+
150+ def test do
151+ my_function()
152+ end
153+ end
154+ """
155+
156+ { line , column } = { 7 , 5 }
157+
158+ location = Locator . definition ( code , line , column )
159+
160+ assert location != nil
161+ assert location . type == :function
162+ assert location . line == 4
163+ assert location . column == 11
164+ end
165+
166+ test "no false positive when local function named use exists" do
167+ code = """
168+ defmodule MyModule do
169+ defp use(_module), do: nil
170+
171+ use ElixirSense.Providers.Definition.LocatorTest.MyBehaviour
172+
173+ def test do
174+ use(SomeModule)
175+ my_function()
176+ end
177+ end
178+ """
179+
180+ { line , column } = { 8 , 5 }
181+
182+ location = Locator . definition ( code , line , column )
183+
184+ assert location != nil
185+ assert location . type == :function
186+ # should find the function from __using__ macro, not be confused by local use/1
187+ assert location . line == 4
188+ assert location . column == 11
189+ end
190+
191+ describe "modules in external file" do
192+ test "finds definition via external module using Kernel.use qualified call" do
193+ code = """
194+ defmodule MyModule do
195+ def test do
196+ ElixirSenseExample.ModuleUsingKernelUse.using_macro_function()
197+ end
198+ end
199+ """
200+
201+ { line , column } = { 3 , 45 }
202+
203+ location = Locator . definition ( code , line , column )
204+
205+ assert location != nil
206+ assert location . type == :function
207+ assert location . file =~ "using_macro_example.ex"
208+ assert location . line == 4
209+ assert location . column == 11
210+ end
211+
212+ test "finds definition via external module using aliased module" do
213+ code = """
214+ defmodule MyModule do
215+ def test do
216+ ElixirSenseExample.ModuleUsingAlias.using_macro_function()
217+ end
218+ end
219+ """
220+
221+ { line , column } = { 3 , 42 }
222+
223+ location = Locator . definition ( code , line , column )
224+
225+ assert location != nil
226+ assert location . type == :function
227+ assert location . file =~ "using_macro_example.ex"
228+ assert location . line == 4
229+ assert location . column == 11
230+ end
231+
232+ test "finds definition via external module that has other local functions" do
233+ code = """
234+ defmodule MyModule do
235+ def test do
236+ ElixirSenseExample.ModuleWithLocalUse.using_macro_function()
237+ end
238+ end
239+ """
240+
241+ { line , column } = { 3 , 44 }
242+
243+ location = Locator . definition ( code , line , column )
244+
245+ assert location != nil
246+ assert location . type == :function
247+ assert location . file =~ "using_macro_example.ex"
248+ assert location . line == 4
249+ assert location . column == 11
250+ end
251+ end
98252end
0 commit comments