@@ -233,49 +233,83 @@ fn merge_string_expressions<'a>(
233233 if expressions. is_empty ( ) {
234234 return None ;
235235 }
236- if expressions. len ( ) == 1 {
236+ if expressions. len ( ) == 1
237+ && !matches ! (
238+ expressions. first( ) . unwrap( ) ,
239+ Expression :: StringLiteral ( _) | Expression :: TemplateLiteral ( _)
240+ )
241+ {
237242 return Some ( expressions. first ( ) . unwrap ( ) . clone_in ( ast_builder. allocator ) ) ;
238243 }
239244
240245 let mut string_literals: std:: vec:: Vec < String > = vec ! [ ] ;
241246 let mut other_expressions = vec ! [ ] ;
242247 let mut prev_str = String :: new ( ) ;
243248 for ( idx, ex) in expressions. iter ( ) . enumerate ( ) {
244- if let Expression :: StringLiteral ( literal) = ex {
245- if !prev_str. trim ( ) . is_empty ( ) {
246- prev_str. push ( ' ' ) ;
249+ match ex {
250+ Expression :: StringLiteral ( literal) => {
251+ prev_str. push_str (
252+ format ! (
253+ "{}{}" ,
254+ if prev_str. trim( ) . is_empty( ) && other_expressions. is_empty( ) {
255+ ""
256+ } else {
257+ " "
258+ } ,
259+ literal. value. trim( )
260+ )
261+ . as_str ( ) ,
262+ ) ;
247263 }
248- prev_str. push_str ( literal. value . trim ( ) ) ;
249- } else if let Expression :: TemplateLiteral ( template) = ex {
250- for ( idx, q) in template. quasis . iter ( ) . enumerate ( ) {
251- if idx == 0 {
252- if !prev_str. trim ( ) . is_empty ( ) {
253- prev_str. push ( ' ' ) ;
254- }
255- prev_str. push_str ( & q. value . raw ) ;
256- } else {
257- if !prev_str. trim ( ) . is_empty ( ) {
258- string_literals. push ( prev_str. clone ( ) ) ;
259- }
260- if q. tail {
261- prev_str = format ! ( "{} " , q. value. raw) ;
264+ Expression :: TemplateLiteral ( template) => {
265+ for ( idx, q) in template. quasis . iter ( ) . enumerate ( ) {
266+ if !prev_str. is_empty ( ) {
267+ string_literals. push ( format ! (
268+ "{}{}{}{}" ,
269+ prev_str. trim( ) ,
270+ if !prev_str. trim( ) . is_empty( ) { " " } else { "" } ,
271+ q. value. raw. trim( ) ,
272+ if idx == template. quasis. len( ) - 1 {
273+ ""
274+ } else {
275+ " "
276+ }
277+ ) ) ;
278+ prev_str = String :: new ( ) ;
279+ } else if q. tail {
280+ prev_str = q. value . raw . trim ( ) . to_string ( ) ;
262281 } else {
263- string_literals. push ( q. value . raw . into ( ) ) ;
282+ string_literals. push ( format ! (
283+ "{}{}{}" ,
284+ if idx == 0
285+ && other_expressions. is_empty( )
286+ && string_literals. is_empty( )
287+ {
288+ ""
289+ } else {
290+ " "
291+ } ,
292+ q. value. raw. trim( ) ,
293+ if q. value. raw. trim( ) . is_empty( ) || !q. value. raw. ends_with( ' ' ) {
294+ ""
295+ } else {
296+ " "
297+ }
298+ ) ) ;
264299 prev_str = String :: new ( ) ;
265300 }
266301 }
302+ other_expressions. extend ( template. expressions . clone_in ( ast_builder. allocator ) ) ;
267303 }
268- other_expressions . extend ( template . expressions . clone_in ( ast_builder . allocator ) ) ;
269- } else {
270- if !prev_str . ends_with ( ' ' ) {
271- string_literals . push ( format ! ( "{}{}" , prev_str , if idx > 0 { " " } else { "" } ) ) ;
272- } else if idx > 0 {
273- string_literals . push ( " " . to_string ( ) ) ;
274- } else {
275- string_literals . push ( "" . to_string ( ) ) ;
304+ ex => {
305+ string_literals . push ( format ! (
306+ "{}{}" ,
307+ prev_str . trim ( ) ,
308+ if idx > 0 { " " } else { "" }
309+ ) ) ;
310+ other_expressions . push ( ex . clone_in ( ast_builder . allocator ) ) ;
311+ prev_str = String :: new ( ) ;
276312 }
277- other_expressions. push ( ex. clone_in ( ast_builder. allocator ) ) ;
278- prev_str = " " . to_string ( ) ;
279313 }
280314 }
281315 if !prev_str. is_empty ( ) {
0 commit comments