@@ -544,18 +544,29 @@ module TypeScript.Parser {
544
544
}
545
545
}
546
546
547
- function replaceTokenInParent ( oldToken : ISyntaxToken , newToken : ISyntaxToken ) : void {
547
+ function replaceTokenInParent ( node : ISyntaxNode , oldToken : ISyntaxToken , newToken : ISyntaxToken ) : void {
548
548
// oldToken may be parented by a node or a list.
549
549
replaceTokenInParentWorker ( oldToken , newToken ) ;
550
550
551
551
var parent = oldToken . parent ;
552
552
newToken . parent = parent ;
553
553
554
- // Parent must be a list or a node. All of those have a 'data' element.
555
- Debug . assert ( isNode ( parent ) || isList ( parent ) || isSeparatedList ( parent ) ) ;
556
- var dataElement = < { data : number } > < any > parent ;
557
- if ( dataElement . data ) {
558
- dataElement . data &= SyntaxConstants . NodeParsedInStrictModeMask
554
+ // Walk upwards to our outermost node, clearing hte cached 'data' in it. This will
555
+ // make sure that the fullWidths and incrementally unusable bits are computed correctly
556
+ // when next requested.
557
+ while ( true ) {
558
+ // Parent must be a list or a node. All of those have a 'data' element.
559
+ Debug . assert ( isNode ( parent ) || isList ( parent ) || isSeparatedList ( parent ) ) ;
560
+ var dataElement = < { data : number } > < any > parent ;
561
+ if ( dataElement . data ) {
562
+ dataElement . data &= SyntaxConstants . NodeParsedInStrictModeMask
563
+ }
564
+
565
+ if ( parent === node ) {
566
+ break ;
567
+ }
568
+
569
+ parent = parent . parent ;
559
570
}
560
571
}
561
572
@@ -602,7 +613,7 @@ module TypeScript.Parser {
602
613
var oldToken = lastToken ( node ) ;
603
614
var newToken = addSkippedTokenAfterToken ( oldToken , skippedToken ) ;
604
615
605
- replaceTokenInParent ( oldToken , newToken ) ;
616
+ replaceTokenInParent ( node , oldToken , newToken ) ;
606
617
return node ;
607
618
}
608
619
@@ -611,7 +622,7 @@ module TypeScript.Parser {
611
622
var oldToken = firstToken ( node ) ;
612
623
var newToken = addSkippedTokensBeforeToken ( oldToken , skippedTokens ) ;
613
624
614
- replaceTokenInParent ( oldToken , newToken ) ;
625
+ replaceTokenInParent ( node , oldToken , newToken ) ;
615
626
}
616
627
617
628
return node ;
0 commit comments