@@ -68,7 +68,7 @@ defmodule Code.Normalizer do
6868
6969 # Bit containers
7070 defp do_normalize ( { :<<>> , _ , args } = quoted , state ) when is_list ( args ) do
71- normalize_bitstring ( quoted , state )
71+ normalize_bitstring ( quoted , state , false )
7272 end
7373
7474 # Atoms with interpolations
@@ -89,13 +89,7 @@ defmodule Code.Normalizer do
8989 normalize_literal ( :utf8 , [ ] , state )
9090 end
9191
92- string =
93- if state . escape do
94- normalize_bitstring ( string , state , true )
95- else
96- normalize_bitstring ( string , state )
97- end
98-
92+ string = normalize_bitstring ( string , state , state . escape )
9993 { { :. , dot_meta , [ :erlang , :binary_to_atom ] } , call_meta , [ string , utf8 ] }
10094 end
10195
@@ -118,6 +112,7 @@ defmodule Code.Normalizer do
118112 end
119113 end )
120114
115+ parts = maybe_add_trailing_newline ( call_meta , parts , state )
121116 { { :. , dot_meta , [ List , :to_charlist ] } , call_meta , [ parts ] }
122117 else
123118 normalize_call ( quoted , state )
@@ -405,7 +400,8 @@ defmodule Code.Normalizer do
405400 defp allow_keyword? ( :{} , _ ) , do: false
406401 defp allow_keyword? ( op , arity ) , do: not is_atom ( op ) or not Macro . operator? ( op , arity )
407402
408- defp normalize_bitstring ( { :<<>> , meta , parts } , state , escape_interpolation \\ false ) do
403+ defp normalize_bitstring ( { :<<>> , meta , parts } , state , escape_interpolation ) do
404+ parts = maybe_add_trailing_newline ( meta , parts , state )
409405 meta = patch_meta_line ( meta , state . parent_meta )
410406
411407 parts =
@@ -427,6 +423,17 @@ defmodule Code.Normalizer do
427423 { :<<>> , meta , parts }
428424 end
429425
426+ defp maybe_add_trailing_newline ( meta , parts , state ) do
427+ with true <- state . escape and Keyword . get ( meta , :delimiter ) in ~w( """ ''') ,
428+ last = List . last ( parts ) ,
429+ true <- is_binary ( last ) and not String . ends_with? ( last , "\n " ) do
430+ [ _last | rest ] = Enum . reverse ( parts )
431+ Enum . reverse ( [ last <> "\n " | rest ] )
432+ else
433+ _ -> parts
434+ end
435+ end
436+
430437 defp normalize_interpolation_parts ( parts , state , escape_interpolation ) do
431438 Enum . map ( parts , fn
432439 { :"::" , interpolation_meta ,
0 commit comments