@@ -245,76 +245,67 @@ fn merge_string_expressions<'a>(
245245 let mut string_literals: std:: vec:: Vec < String > = vec ! [ ] ;
246246 let mut other_expressions = vec ! [ ] ;
247247 let mut prev_str = String :: new ( ) ;
248- for ( idx , ex ) in expressions. iter ( ) . enumerate ( ) {
248+ for ex in expressions. iter ( ) {
249249 match ex {
250250 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 ( ) ,
251+ let target_prev = prev_str. trim ( ) ;
252+ let target = literal. value . trim ( ) ;
253+ prev_str = format ! (
254+ "{}{}{}" ,
255+ target_prev,
256+ if target_prev. is_empty( ) { "" } else { " " } ,
257+ target
262258 ) ;
263259 }
264260 Expression :: TemplateLiteral ( template) => {
265261 for ( idx, q) in template. quasis . iter ( ) . enumerate ( ) {
266- if !prev_str. is_empty ( ) {
262+ let target_prev = prev_str. trim ( ) ;
263+ let target = q. value . raw . trim ( ) ;
264+ if idx < template. quasis . len ( ) - 1 {
267265 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 {
266+ "{}{}{}{}{}" ,
267+ if !other_expressions. is_empty( ) || idx > 0 {
275268 " "
276- }
277- ) ) ;
278- prev_str = String :: new ( ) ;
279- } else if q. tail {
280- prev_str = q. value . raw . trim ( ) . to_string ( ) ;
281- } else {
282- string_literals. push ( format ! (
283- "{}{}{}" ,
284- if idx == 0
285- && other_expressions. is_empty( )
286- && string_literals. is_empty( )
287- {
288- ""
289269 } else {
290- " "
291- } ,
292- q. value. raw. trim( ) ,
293- if q. value. raw. trim( ) . is_empty( ) || !q. value. raw. ends_with( ' ' ) {
294270 ""
295- } else {
271+ } ,
272+ target_prev,
273+ if !target_prev. is_empty( ) { " " } else { "" } ,
274+ target,
275+ if !target. is_empty( ) && !target. ends_with( "typo-" ) {
296276 " "
277+ } else {
278+ ""
297279 }
298280 ) ) ;
299- prev_str = String :: new ( ) ;
281+ } else {
282+ prev_str = q. value . raw . trim ( ) . to_string ( ) ;
300283 }
301284 }
302285 other_expressions. extend ( template. expressions . clone_in ( ast_builder. allocator ) ) ;
303286 }
304287 ex => {
288+ let target_prev = prev_str. trim ( ) ;
305289 string_literals. push ( format ! (
306- "{}{}" ,
307- prev_str. trim( ) ,
308- if idx > 0 { " " } else { "" }
290+ "{}{}{}" ,
291+ if !other_expressions. is_empty( ) {
292+ " "
293+ } else {
294+ ""
295+ } ,
296+ target_prev,
297+ if !target_prev. is_empty( ) { " " } else { "" }
309298 ) ) ;
310299 other_expressions. push ( ex. clone_in ( ast_builder. allocator ) ) ;
311300 prev_str = String :: new ( ) ;
312301 }
313302 }
314303 }
315- if !prev_str. is_empty ( ) {
316- string_literals. push ( prev_str. trim_end ( ) . to_string ( ) ) ;
317- }
304+ string_literals. push ( format ! (
305+ "{}{}" ,
306+ if !prev_str. trim( ) . is_empty( ) { " " } else { "" } ,
307+ prev_str. trim( ) ,
308+ ) ) ;
318309 if other_expressions. is_empty ( ) {
319310 return Some ( ast_builder. expression_string_literal (
320311 SPAN ,
0 commit comments