@@ -70,15 +70,15 @@ defmodule Code.Normalizer do
70
70
# Atoms with interpolations
71
71
defp do_normalize (
72
72
{ { :. , dot_meta , [ :erlang , :binary_to_atom ] } , call_meta ,
73
- [ { :<<>> , _ , args } = string , :utf8 ] } ,
73
+ [ { :<<>> , _ , parts } = string , :utf8 ] } ,
74
74
state
75
75
)
76
- when is_list ( args ) do
76
+ when is_list ( parts ) do
77
77
dot_meta = patch_meta_line ( dot_meta , state . parent_meta )
78
78
call_meta = patch_meta_line ( call_meta , dot_meta )
79
79
80
80
utf8 =
81
- if args == [ ] or interpolated? ( string ) do
81
+ if parts == [ ] or binary_interpolated? ( parts ) do
82
82
# a non-normalized :utf8 atom signals an atom interpolation
83
83
:utf8
84
84
else
@@ -96,23 +96,27 @@ defmodule Code.Normalizer do
96
96
end
97
97
98
98
# Charlists with interpolations
99
- defp do_normalize ( { { :. , dot_meta , [ List , :to_charlist ] } , call_meta , [ parts ] } , state ) do
100
- parts =
101
- Enum . map ( parts , fn
102
- { { :. , part_dot_meta , [ Kernel , :to_string ] } , part_call_meta , args } ->
103
- args = normalize_args ( args , state )
104
-
105
- { { :. , part_dot_meta , [ Kernel , :to_string ] } , part_call_meta , args }
106
-
107
- part ->
108
- if state . escape do
109
- maybe_escape_literal ( part , state )
110
- else
111
- part
112
- end
113
- end )
99
+ defp do_normalize ( { { :. , dot_meta , [ List , :to_charlist ] } , call_meta , [ parts ] } = quoted , state ) do
100
+ if list_interpolated? ( parts ) do
101
+ parts =
102
+ Enum . map ( parts , fn
103
+ { { :. , part_dot_meta , [ Kernel , :to_string ] } , part_call_meta , args } ->
104
+ args = normalize_args ( args , state )
105
+
106
+ { { :. , part_dot_meta , [ Kernel , :to_string ] } , part_call_meta , args }
107
+
108
+ part when is_binary ( part ) ->
109
+ if state . escape do
110
+ maybe_escape_literal ( part , state )
111
+ else
112
+ part
113
+ end
114
+ end )
114
115
115
- { { :. , dot_meta , [ List , :to_charlist ] } , call_meta , [ parts ] }
116
+ { { :. , dot_meta , [ List , :to_charlist ] } , call_meta , [ parts ] }
117
+ else
118
+ normalize_call ( quoted , state )
119
+ end
116
120
end
117
121
118
122
# Don't normalize the `Access` atom in access syntax
@@ -389,11 +393,11 @@ defmodule Code.Normalizer do
389
393
defp allow_keyword? ( :{} , _ ) , do: false
390
394
defp allow_keyword? ( op , arity ) , do: not is_atom ( op ) or not Macro . operator? ( op , arity )
391
395
392
- defp normalize_bitstring ( { :<<>> , meta , parts } = quoted , state , escape_interpolation \\ false ) do
396
+ defp normalize_bitstring ( { :<<>> , meta , parts } , state , escape_interpolation \\ false ) do
393
397
meta = patch_meta_line ( meta , state . parent_meta )
394
398
395
399
parts =
396
- if interpolated? ( quoted ) do
400
+ if binary_interpolated? ( parts ) do
397
401
normalize_interpolation_parts ( parts , % { state | parent_meta: meta } , escape_interpolation )
398
402
else
399
403
state = % { state | parent_meta: meta }
@@ -543,17 +547,20 @@ defmodule Code.Normalizer do
543
547
term
544
548
end
545
549
546
- # Check if we have an interpolated string.
547
- defp interpolated? ( { :<<>> , _ , [ _ | _ ] = parts } ) do
550
+ defp binary_interpolated? ( parts ) do
548
551
Enum . all? ( parts , fn
549
552
{ :"::" , _ , [ { { :. , _ , [ Kernel , :to_string ] } , _ , [ _ ] } , { :binary , _ , _ } ] } -> true
550
553
binary when is_binary ( binary ) -> true
551
554
_ -> false
552
555
end )
553
556
end
554
557
555
- defp interpolated? ( _ ) do
556
- false
558
+ defp list_interpolated? ( parts ) do
559
+ Enum . all? ( parts , fn
560
+ { { :. , _ , [ Kernel , :to_string ] } , _ , [ _ ] } -> true
561
+ binary when is_binary ( binary ) -> true
562
+ _ -> false
563
+ end )
557
564
end
558
565
559
566
defp patch_meta_line ( meta , parent_meta ) do
0 commit comments