also looking at this
fix(lexer): leave interpolation mode while scanning string text
#928
2 files
+46
-1
| @@ -567,6 +567,10 @@ pub const Lexer = struct { | ||
| 567 | 567 | // The } that closes the interpolation expression was already consumed |
| 568 | 568 | // Update start to skip the } for the token lexeme |
| 569 | 569 | self.start = self.current; |
| 570 | // Scanning string text now, not interpolation code. Only a following | |
| 571 | // `${` re-enters interpolation, so an invalid escape or unterminated | |
| 572 | // string cannot leave the lexer counting braces of ordinary code. | |
| 573 | self.in_interpolation = false; | |
| 570 | 574 | |
| 571 | 575 | // Scan until next ${ or closing " |
| 572 | 576 | while (!self.isAtEnd()) { |
| @@ -649,12 +653,12 @@ pub const Lexer = struct { | ||
| 649 | 653 | if (self.peek() == '$' and self.peekNext() == '{') { |
| 650 | 654 | _ = self.advance(); // consume $ |
| 651 | 655 | _ = self.advance(); // consume { |
| 656 | self.in_interpolation = true; | |
| 652 | 657 | self.interpolation_brace_depth = 1; |
| 653 | 658 | return self.makeToken(.StringInterpolationMid); |
| 654 | 659 | } else { |
| 655 | 660 | // Closing " |
| 656 | 661 | _ = self.advance(); |
| 657 | self.in_interpolation = false; | |
| 658 | 662 | return self.makeToken(.StringInterpolationEnd); |
| 659 | 663 | } |
| 660 | 664 | } |