(&mut self, span: &mut Span)
| 334 | } |
| 335 | |
| 336 | fn substitute_concat(&mut self, span: &mut Span) -> Result<bool, Diagnostic> { |
| 337 | let Token::Name(macro_name) = get_token(&self.tokens[*self.i]) else { |
| 338 | return Ok(false); |
| 339 | }; |
| 340 | let macro_name_span = get_span(&self.tokens[*self.i]); |
| 341 | if macro_name != "CONCAT" { |
| 342 | return Ok(false); |
| 343 | } |
| 344 | if self |
| 345 | .tokens |
| 346 | .get(*self.i + 1) |
| 347 | .is_none_or(|token| get_token(token) != &Token::LParen) |
| 348 | { |
| 349 | return Ok(false); |
| 350 | } |
| 351 | if self |
| 352 | .tokens |
| 353 | .get(*self.i + 3) |
| 354 | .is_none_or(|token| get_token(token) != &Token::Comma) |
| 355 | { |
| 356 | return Ok(false); |
| 357 | } |
| 358 | if self |
| 359 | .tokens |
| 360 | .get(*self.i + 5) |
| 361 | .is_none_or(|token| get_token(token) != &Token::RParen) |
| 362 | { |
| 363 | return Ok(false); |
| 364 | } |
| 365 | let Some(Token::Name(left)) = self.tokens.get(*self.i + 2).map(get_token).cloned() else { |
| 366 | return Ok(false); |
| 367 | }; |
| 368 | let Some(Token::Name(right)) = self.tokens.get(*self.i + 4).map(get_token).cloned() else { |
| 369 | return Ok(false); |
| 370 | }; |
| 371 | self.remove_token(span); |
| 372 | self.remove_token(span); |
| 373 | self.remove_token(span); |
| 374 | self.remove_token(span); |
| 375 | self.remove_token(span); |
| 376 | self.remove_token(span); |
| 377 | self.tokens.insert( |
| 378 | *self.i, |
| 379 | ( |
| 380 | macro_name_span.start, |
| 381 | Token::Name(format!("{}{}", left, right).into()), |
| 382 | macro_name_span.end, |
| 383 | ), |
| 384 | ); |
| 385 | span.end += 1; |
| 386 | Ok(true) |
| 387 | } |
| 388 | } |
no test coverage detected