@@ -268,11 +268,11 @@ defmodule ElixirSense.Core.MetadataBuilder do
268
268
end
269
269
270
270
defp pre (
271
- { :@ , [ line: line , column: _column ] , [ { :behaviour , _ , [ { :__aliases__ , _ , module_atoms } ] } ] } =
272
- ast ,
271
+ { :@ , [ line: line , column: _column ] ,
272
+ [ { :behaviour , _ , [ { :__aliases__ , _ , module_expression } ] } ] } = ast ,
273
273
state
274
274
) do
275
- module = module_atoms |> Module . concat ( )
275
+ module = concat_module_expression ( state , module_expression )
276
276
pre_behaviour ( ast , state , line , module )
277
277
end
278
278
@@ -288,10 +288,10 @@ defmodule ElixirSense.Core.MetadataBuilder do
288
288
# import with v1.2 notation
289
289
defp pre (
290
290
{ :import , [ line: line , column: _column ] ,
291
- [ { { :. , _ , [ { :__aliases__ , _ , prefix_atoms } , :{} ] } , _ , imports } ] } = ast ,
291
+ [ { { :. , _ , [ prefix_expression , :{} ] } , _ , imports } ] } = ast ,
292
292
state
293
293
) do
294
- imports_modules = modules_from_12_syntax ( imports , prefix_atoms )
294
+ imports_modules = modules_from_12_syntax ( state , imports , prefix_expression )
295
295
296
296
pre_import ( ast , state , line , imports_modules )
297
297
end
@@ -303,12 +303,11 @@ defmodule ElixirSense.Core.MetadataBuilder do
303
303
304
304
# import with options
305
305
defp pre (
306
- { :import , [ line: line , column: _column ] , [ { _ , _ , module_atoms = [ mod | _ ] } , _opts ] } =
306
+ { :import , [ line: line , column: _column ] , [ { _ , _ , module_expression = [ _ | _ ] } , _opts ] } =
307
307
ast ,
308
308
state
309
- )
310
- when is_atom ( mod ) do
311
- module = module_atoms |> Module . concat ( )
309
+ ) do
310
+ module = concat_module_expression ( state , module_expression )
312
311
pre_import ( ast , state , line , module )
313
312
end
314
313
@@ -321,10 +320,10 @@ defmodule ElixirSense.Core.MetadataBuilder do
321
320
# require with v1.2 notation
322
321
defp pre (
323
322
{ :require , [ line: line , column: _column ] ,
324
- [ { { :. , _ , [ { :__aliases__ , _ , prefix_atoms } , :{} ] } , _ , requires } ] } = ast ,
323
+ [ { { :. , _ , [ prefix_expression , :{} ] } , _ , requires } ] } = ast ,
325
324
state
326
325
) do
327
- requires_modules = modules_from_12_syntax ( requires , prefix_atoms )
326
+ requires_modules = modules_from_12_syntax ( state , requires , prefix_expression )
328
327
329
328
pre_require ( ast , state , line , requires_modules )
330
329
end
@@ -337,12 +336,12 @@ defmodule ElixirSense.Core.MetadataBuilder do
337
336
# require with `as` option
338
337
defp pre (
339
338
{ :require , [ line: line , column: _column ] ,
340
- [ { _ , _ , module_atoms = [ mod | _ ] } , [ as: alias_expression ] ] } = ast ,
339
+ [ { _ , _ , module_expression = [ _ | _ ] } , [ as: alias_expression ] ] } = ast ,
341
340
state
342
- )
343
- when is_atom ( mod ) do
344
- alias_tuple = alias_tuple ( Module . concat ( module_atoms ) , alias_expression )
345
- module = module_atoms |> Module . concat ( )
341
+ ) do
342
+ module = concat_module_expression ( state , module_expression )
343
+ alias_tuple = alias_tuple ( module , alias_expression )
344
+
346
345
{ _ , new_state } = pre_alias ( ast , state , line , alias_tuple )
347
346
pre_require ( ast , new_state , line , module )
348
347
end
@@ -357,12 +356,11 @@ defmodule ElixirSense.Core.MetadataBuilder do
357
356
358
357
# require with options
359
358
defp pre (
360
- { :require , [ line: line , column: _column ] , [ { _ , _ , module_atoms = [ mod | _ ] } , _opts ] } =
359
+ { :require , [ line: line , column: _column ] , [ { _ , _ , module_expression = [ _ | _ ] } , _opts ] } =
361
360
ast ,
362
361
state
363
- )
364
- when is_atom ( mod ) do
365
- module = module_atoms |> Module . concat ( )
362
+ ) do
363
+ module = concat_module_expression ( state , module_expression )
366
364
pre_require ( ast , state , line , module )
367
365
end
368
366
@@ -374,9 +372,11 @@ defmodule ElixirSense.Core.MetadataBuilder do
374
372
# alias with v1.2 notation
375
373
defp pre (
376
374
{ :alias , [ line: line , column: _column ] ,
377
- [ { { :. , _ , [ { :__aliases__ , _ , prefix_atoms } , :{} ] } , _ , aliases } ] } = ast ,
375
+ [ { { :. , _ , [ prefix_expression , :{} ] } , _ , aliases } ] } = ast ,
378
376
state
379
377
) do
378
+ prefix_atoms = split_module_expression ( state , prefix_expression )
379
+
380
380
aliases_tuples =
381
381
aliases
382
382
|> Enum . map ( fn
@@ -389,23 +389,23 @@ defmodule ElixirSense.Core.MetadataBuilder do
389
389
390
390
# alias without options
391
391
defp pre (
392
- { :alias , [ line: line , column: _column ] , [ { :__aliases__ , _ , module_atoms = [ mod | _ ] } ] } =
392
+ { :alias , [ line: line , column: _column ] , [ { :__aliases__ , _ , module_expression = [ _ | _ ] } ] } =
393
393
ast ,
394
394
state
395
- )
396
- when is_atom ( mod ) do
397
- alias_tuple = { Module . concat ( [ List . last ( module_atoms ) ] ) , Module . concat ( module_atoms ) }
395
+ ) do
396
+ module = concat_module_expression ( state , module_expression )
397
+ alias_tuple = { Module . concat ( [ List . last ( module_expression ) ] ) , module }
398
398
pre_alias ( ast , state , line , alias_tuple )
399
399
end
400
400
401
401
# alias with `as` option
402
402
defp pre (
403
403
{ :alias , [ line: line , column: _column ] ,
404
- [ { _ , _ , module_atoms = [ mod | _ ] } , [ as: alias_expression ] ] } = ast ,
404
+ [ { _ , _ , module_expression = [ _ | _ ] } , [ as: alias_expression ] ] } = ast ,
405
405
state
406
- )
407
- when is_atom ( mod ) do
408
- alias_tuple = alias_tuple ( Module . concat ( module_atoms ) , alias_expression )
406
+ ) do
407
+ module = concat_module_expression ( state , module_expression )
408
+ alias_tuple = alias_tuple ( module , alias_expression )
409
409
pre_alias ( ast , state , line , alias_tuple )
410
410
end
411
411
@@ -734,11 +734,19 @@ defmodule ElixirSense.Core.MetadataBuilder do
734
734
{ Module . concat ( alias_atoms ) , module }
735
735
end
736
736
737
- defp modules_from_12_syntax ( expressions , prefix_atoms ) do
737
+ defp modules_from_12_syntax ( state , expressions , prefix_expression ) do
738
+ prefix_atoms = split_module_expression ( state , prefix_expression )
739
+
738
740
expressions
739
- |> Enum . map ( fn
740
- { :__aliases__ , _ , mods } -> Module . concat ( prefix_atoms ++ mods )
741
- mod when is_atom ( mod ) -> Module . concat ( prefix_atoms ++ [ mod ] )
742
- end )
741
+ |> Enum . map ( & Module . concat ( prefix_atoms ++ split_module_expression ( state , & 1 ) ) )
743
742
end
743
+
744
+ defp split_module_expression ( _state , { :__aliases__ , _ , mods } ) , do: mods
745
+ defp split_module_expression ( _state , mod ) when is_atom ( mod ) , do: [ mod ]
746
+ defp split_module_expression ( state , { :__MODULE__ , _ , nil } ) , do: [ state |> get_current_module ]
747
+
748
+ defp concat_module_expression ( state , [ { :__MODULE__ , _ , nil } | rest ] ) ,
749
+ do: Module . concat ( [ state |> get_current_module ] ++ rest )
750
+
751
+ defp concat_module_expression ( _state , rest ) , do: Module . concat ( rest )
744
752
end
0 commit comments