@@ -2498,25 +2498,48 @@ module ts {
2498
2498
}
2499
2499
2500
2500
function isInStringOrRegularExpressionLiteral ( previousToken : Node ) : boolean {
2501
- if ( previousToken . kind === SyntaxKind . StringLiteral ) {
2501
+ if ( previousToken . kind === SyntaxKind . StringLiteral || isTemplateLiteralKind ( previousToken . kind ) ) {
2502
2502
// The position has to be either: 1. entirely within the token text, or
2503
2503
// 2. at the end position, and the string literal is not terminated
2504
+
2504
2505
var start = previousToken . getStart ( ) ;
2505
2506
var end = previousToken . getEnd ( ) ;
2507
+
2506
2508
if ( start < position && position < end ) {
2507
2509
return true ;
2508
2510
}
2509
2511
else if ( position === end ) {
2510
2512
var width = end - start ;
2511
2513
var text = previousToken . getSourceFile ( ) . text ;
2512
- return width <= 1 ||
2513
- text . charCodeAt ( start ) !== text . charCodeAt ( end - 1 ) ||
2514
- text . charCodeAt ( end - 2 ) === CharacterCodes . backslash ;
2514
+
2515
+ // If the token is a single character, or its second-to-last charcter indicates an escape code,
2516
+ // then we can immediately say that we are in the middle of an unclosed string.
2517
+ if ( width <= 1 || text . charCodeAt ( end - 2 ) === CharacterCodes . backslash ) {
2518
+ return true ;
2519
+ }
2520
+
2521
+ // Now check if the last character is a closing character for the token.
2522
+ switch ( previousToken . kind ) {
2523
+ case SyntaxKind . StringLiteral :
2524
+ case SyntaxKind . NoSubstitutionTemplateLiteral :
2525
+ return text . charCodeAt ( start ) !== text . charCodeAt ( end - 1 ) ;
2526
+
2527
+ case SyntaxKind . TemplateHead :
2528
+ case SyntaxKind . TemplateMiddle :
2529
+ return text . charCodeAt ( end - 1 ) !== CharacterCodes . openBrace
2530
+ || text . charCodeAt ( end - 2 ) !== CharacterCodes . $ ;
2531
+
2532
+ case SyntaxKind . TemplateTail :
2533
+ return text . charCodeAt ( end - 1 ) !== CharacterCodes . backtick ;
2534
+ }
2535
+
2536
+ return false ;
2515
2537
}
2516
2538
}
2517
2539
else if ( previousToken . kind === SyntaxKind . RegularExpressionLiteral ) {
2518
2540
return previousToken . getStart ( ) < position && position < previousToken . getEnd ( ) ;
2519
2541
}
2542
+
2520
2543
return false ;
2521
2544
}
2522
2545
0 commit comments