1
1
defmodule ElixirSense.Core.Normalized.Macro.Env do
2
+ def expand_import ( env , meta , name , arity , opts \\ [ ] )
3
+ when is_list ( meta ) and is_atom ( name ) and is_integer ( arity ) and is_list ( opts ) do
4
+ local_for_callback =
5
+ Keyword . get ( opts , :local_for_callback , fn meta , name , arity , kinds , e ->
6
+ if Version . match? ( System . version ( ) , ">= 1.14.0-dev" ) do
7
+ :elixir_def . local_for ( meta , name , arity , kinds , e )
8
+ else
9
+ :elixir_def . local_for ( e . module , name , arity , kinds )
10
+ end
11
+ end )
12
+
13
+ case Macro . special_form? ( name , arity ) do
14
+ true ->
15
+ { :error , :not_found }
16
+
17
+ false ->
18
+ allow_locals = Keyword . get ( opts , :allow_locals , true )
19
+ trace = Keyword . get ( opts , :trace , true )
20
+ # module = env.module
21
+
22
+ # elixir version passes module.__info__(:macros) as extra, we do not need that
23
+ # instead we override local_for_callback
24
+ extra = [ ]
25
+ # case allow_locals and function_exported?(module, :__info__, 1) do
26
+ # true -> [{module, module.__info__(:macros)}]
27
+ # false -> []
28
+ # end
29
+
30
+ case __MODULE__ . Dispatch . expand_import (
31
+ meta ,
32
+ name ,
33
+ arity ,
34
+ env ,
35
+ extra ,
36
+ allow_locals ,
37
+ trace ,
38
+ local_for_callback
39
+ ) do
40
+ { :macro , receiver , expander } ->
41
+ { :macro , receiver , wrap_expansion ( receiver , expander , meta , name , arity , env , opts ) }
42
+
43
+ { :function , receiver , name } ->
44
+ { :function , receiver , name }
45
+
46
+ error ->
47
+ { :error , error }
48
+ end
49
+ end
50
+ end
51
+
2
52
defp wrap_expansion ( receiver , expander , _meta , _name , _arity , env , _opts ) do
3
53
fn expansion_meta , args ->
4
54
quoted = expander . ( args , env )
@@ -15,64 +65,14 @@ defmodule ElixirSense.Core.Normalized.Macro.Env do
15
65
end
16
66
end
17
67
end
18
-
68
+
19
69
if Version . match? ( System . version ( ) , ">= 1.17.0-dev" ) do
20
70
# defdelegate expand_import(env, meta, fun, arity, opts), to: Macro.Env
21
71
defdelegate expand_require ( env , meta , module , fun , arity , opts ) , to: Macro.Env
22
72
defdelegate expand_alias ( env , meta , list , opts ) , to: Macro.Env
23
73
defdelegate define_alias ( env , meta , arg , opts ) , to: Macro.Env
24
74
defdelegate define_require ( env , meta , arg , opts ) , to: Macro.Env
25
75
defdelegate define_import ( env , meta , arg , opts ) , to: Macro.Env
26
-
27
- def expand_import ( env , meta , name , arity , opts \\ [ ] )
28
- when is_list ( meta ) and is_atom ( name ) and is_integer ( arity ) and is_list ( opts ) do
29
- local_for_callback =
30
- Keyword . get ( opts , :local_for_callback , fn meta , name , arity , kinds , e ->
31
- if Version . match? ( System . version ( ) , ">= 1.14.0-dev" ) do
32
- :elixir_def . local_for ( meta , name , arity , kinds , e )
33
- else
34
- :elixir_def . local_for ( e . module , name , arity , kinds )
35
- end
36
- end )
37
-
38
- case Macro . special_form? ( name , arity ) do
39
- true ->
40
- { :error , :not_found }
41
-
42
- false ->
43
- allow_locals = Keyword . get ( opts , :allow_locals , true )
44
- trace = Keyword . get ( opts , :trace , true )
45
- # module = env.module
46
-
47
- # elixir version passes module.__info__(:macros) as extra, we do not need that
48
- # instead we override local_for_callback
49
- extra = [ ]
50
- # case allow_locals and function_exported?(module, :__info__, 1) do
51
- # true -> [{module, module.__info__(:macros)}]
52
- # false -> []
53
- # end
54
-
55
- case __MODULE__ . Dispatch . expand_import (
56
- meta ,
57
- name ,
58
- arity ,
59
- env ,
60
- extra ,
61
- allow_locals ,
62
- trace ,
63
- local_for_callback
64
- ) do
65
- { :macro , receiver , expander } ->
66
- { :macro , receiver , wrap_expansion ( receiver , expander , meta , name , arity , env , opts ) }
67
-
68
- { :function , receiver , name } ->
69
- { :function , receiver , name }
70
-
71
- error ->
72
- { :error , error }
73
- end
74
- end
75
- end
76
76
else
77
77
def fake_expand_callback ( _meta , _args ) do
78
78
{ :__block__ , [ ] , [ ] }
0 commit comments