@@ -248,13 +248,16 @@ defmodule Spitfire do
248
248
:alias -> & parse_alias / 1
249
249
:"<<" -> & parse_bitstring / 1
250
250
:kw_identifier when is_list or is_map -> & parse_kw_identifier / 1
251
+ :kw_identifier_safe when is_list or is_map -> & parse_kw_identifier / 1
251
252
:kw_identifier_unsafe when is_list or is_map -> & parse_kw_identifier / 1
252
253
:kw_identifier when not is_list and not is_map -> & parse_bracketless_kw_list / 1
254
+ :kw_identifier_safe when not is_list and not is_map -> & parse_bracketless_kw_list / 1
253
255
:kw_identifier_unsafe when not is_list and not is_map -> & parse_bracketless_kw_list / 1
254
256
:int -> & parse_int / 1
255
257
:flt -> & parse_float / 1
256
258
:atom -> & parse_atom / 1
257
259
:atom_quoted -> & parse_atom / 1
260
+ :atom_safe -> & parse_atom / 1
258
261
:atom_unsafe -> & parse_atom / 1
259
262
true -> & parse_boolean / 1
260
263
false -> & parse_boolean / 1
@@ -535,6 +538,9 @@ defmodule Spitfire do
535
538
end
536
539
end
537
540
541
+ defp map_kw_identifier_to_atom_token ( :kw_identifier_safe ) , do: :atom_safe
542
+ defp map_kw_identifier_to_atom_token ( :kw_identifier_unsafe ) , do: :atom_unsafe
543
+
538
544
defp parse_kw_identifier ( % { current_token: { :kw_identifier , meta , token } } = parser ) do
539
545
trace "parse_kw_identifier" , trace_meta ( parser ) do
540
546
token = encode_literal ( parser , token , meta )
@@ -546,9 +552,10 @@ defmodule Spitfire do
546
552
end
547
553
end
548
554
549
- defp parse_kw_identifier ( % { current_token: { :kw_identifier_unsafe , meta , tokens } } = parser ) do
550
- trace "parse_kw_identifier (unsafe)" , trace_meta ( parser ) do
551
- { atom , parser } = parse_atom ( % { parser | current_token: { :atom_unsafe , meta , tokens } } )
555
+ defp parse_kw_identifier ( % { current_token: { type , meta , tokens } } = parser )
556
+ when type in [ :kw_identifier_safe , :kw_identifier_unsafe ] do
557
+ trace "parse_kw_identifier (#{ type } )" , trace_meta ( parser ) do
558
+ { atom , parser } = parse_atom ( % { parser | current_token: { map_kw_identifier_to_atom_token ( type ) , meta , tokens } } )
552
559
parser = parser |> next_token ( ) |> eat_eol ( )
553
560
554
561
{ expr , parser } = parse_expression ( parser , @ kw_identifier , false , false , false )
@@ -584,9 +591,10 @@ defmodule Spitfire do
584
591
end
585
592
end
586
593
587
- defp parse_bracketless_kw_list ( % { current_token: { :kw_identifier_unsafe , meta , tokens } } = parser ) do
588
- trace "parse_bracketless_kw_list (unsafe)" , trace_meta ( parser ) do
589
- { atom , parser } = parse_atom ( % { parser | current_token: { :atom_unsafe , meta , tokens } } )
594
+ defp parse_bracketless_kw_list ( % { current_token: { type , meta , tokens } } = parser )
595
+ when type in [ :kw_identifier_safe , :kw_identifier_unsafe ] do
596
+ trace "parse_bracketless_kw_list (#{ type } )" , trace_meta ( parser ) do
597
+ { atom , parser } = parse_atom ( % { parser | current_token: { map_kw_identifier_to_atom_token ( type ) , meta , tokens } } )
590
598
parser = parser |> next_token ( ) |> eat_eol ( )
591
599
592
600
atom =
@@ -1274,11 +1282,18 @@ defmodule Spitfire do
1274
1282
end
1275
1283
end
1276
1284
1277
- defp parse_atom ( % { current_token: { :atom_unsafe , _ , tokens } } = parser ) do
1278
- trace "parse_atom (unsafe )" , trace_meta ( parser ) do
1285
+ defp parse_atom ( % { current_token: { type , _ , tokens } } = parser ) when type in [ :atom_safe , :atom_unsafe ] do
1286
+ trace "parse_atom (#{ type } )" , trace_meta ( parser ) do
1279
1287
meta = current_meta ( parser )
1280
1288
{ args , parser } = parse_interpolation ( parser , tokens )
1281
- { { { :. , meta , [ :erlang , :binary_to_atom ] } , [ { :delimiter , ~S' "' } | meta ] , [ { :<<>> , meta , args } , :utf8 ] } , parser }
1289
+
1290
+ binary_to_atom_op =
1291
+ case type do
1292
+ :atom_safe -> :binary_to_existing_atom
1293
+ :atom_unsafe -> :binary_to_atom
1294
+ end
1295
+
1296
+ { { { :. , meta , [ :erlang , binary_to_atom_op ] } , [ { :delimiter , ~S' "' } | meta ] , [ { :<<>> , meta , args } , :utf8 ] } , parser }
1282
1297
end
1283
1298
end
1284
1299
0 commit comments