@@ -9,6 +9,12 @@ module ts.formatting {
99 close ( ) : void ;
1010 }
1111
12+ const enum ScanAction {
13+ Normal ,
14+ RescanGreaterThanToken ,
15+ RescanSlashToken
16+ }
17+
1218 export function getFormattingScanner ( sourceFile : SourceFile , enclosingNode : Node , range : TextRange ) : FormattingScanner {
1319
1420 scanner . setText ( sourceFile . text ) ;
@@ -17,23 +23,26 @@ module ts.formatting {
1723 var wasNewLine : boolean = true ;
1824 var leadingTrivia : TextRangeWithKind [ ] ;
1925 var trailingTrivia : TextRangeWithKind [ ] ;
26+
2027 var savedStartPos : number ;
28+ var lastScanAction : ScanAction ;
2129 var lastTokenInfo : TokenInfo ;
2230
2331 return {
2432 advance : advance ,
2533 readTokenInfo : readTokenInfo ,
2634 isOnToken : isOnToken ,
27- lastTrailingTriviaWasNewLine : lastTrailingTriviaWasNewLine ,
28- close : ( ) => scanner . setText ( undefined )
35+ lastTrailingTriviaWasNewLine : ( ) => wasNewLine ,
36+ close : ( ) => {
37+ lastTokenInfo = undefined ;
38+ scanner . setText ( undefined ) ;
39+ }
2940 }
3041
31-
3242 function advance ( ) : void {
3343 lastTokenInfo = undefined ;
3444 var isStarted = scanner . getStartPos ( ) !== enclosingNode . pos ;
3545
36- // accumulate leading trivia and token
3746 if ( isStarted ) {
3847 if ( trailingTrivia ) {
3948 Debug . assert ( trailingTrivia . length !== 0 ) ;
@@ -79,17 +88,28 @@ module ts.formatting {
7988 savedStartPos = scanner . getStartPos ( ) ;
8089 }
8190
82- function startsWithGreaterThanToken ( t : SyntaxKind ) : boolean {
83- switch ( t ) {
91+ function shouldRescanGreaterThanToken ( container : Node ) : boolean {
92+ if ( container . kind !== SyntaxKind . BinaryExpression ) {
93+ return false ;
94+ }
95+ switch ( ( < BinaryExpression > container ) . operator ) {
8496 case SyntaxKind . GreaterThanEqualsToken :
8597 case SyntaxKind . GreaterThanGreaterThanEqualsToken :
8698 case SyntaxKind . GreaterThanGreaterThanGreaterThanEqualsToken :
8799 case SyntaxKind . GreaterThanGreaterThanGreaterThanToken :
88100 case SyntaxKind . GreaterThanGreaterThanToken :
89101 return true ;
90- default :
91- return false ;
92102 }
103+
104+ return false ;
105+ }
106+
107+ function shouldRescanSlashToken ( container : Node ) : boolean {
108+ return container . kind === SyntaxKind . RegularExpressionLiteral ;
109+ }
110+
111+ function startsWithSlashToken ( t : SyntaxKind ) : boolean {
112+ return t === SyntaxKind . SlashToken || t === SyntaxKind . SlashEqualsToken ;
93113 }
94114
95115 function readTokenInfo ( n : Node ) : TokenInfo {
@@ -101,43 +121,62 @@ module ts.formatting {
101121 } ;
102122
103123 }
124+
104125 if ( lastTokenInfo ) {
105- //return lastTokenInfo;
126+ if ( shouldRescanGreaterThanToken ( n ) ) {
127+ if ( lastScanAction === ScanAction . RescanGreaterThanToken ) {
128+ return lastTokenInfo ;
129+ }
130+ }
131+ else if ( shouldRescanSlashToken ( n ) ) {
132+ if ( lastScanAction === ScanAction . RescanSlashToken ) {
133+ return lastTokenInfo ;
134+ }
135+ }
136+ else if ( lastScanAction === ScanAction . Normal ) {
137+ return lastTokenInfo ;
138+ }
106139 }
107140
108141 if ( scanner . getStartPos ( ) !== savedStartPos ) {
109142 scanner . setTextPos ( savedStartPos ) ;
110143 scanner . scan ( ) ;
111144 }
112145
113- var current = scanner . getToken ( ) ;
146+ var currentToken = scanner . getToken ( ) ;
114147 var endPos : number ;
115- if ( n . kind === SyntaxKind . BinaryExpression && startsWithGreaterThanToken ( ( < BinaryExpression > n ) . operator ) && current === SyntaxKind . GreaterThanToken ) {
116- current = scanner . reScanGreaterToken ( ) ;
117- Debug . assert ( ( < BinaryExpression > n ) . operator === current ) ;
148+
149+ if ( currentToken === SyntaxKind . GreaterThanToken && shouldRescanGreaterThanToken ( n ) ) {
150+ currentToken = scanner . reScanGreaterToken ( ) ;
151+ Debug . assert ( ( < BinaryExpression > n ) . operator === currentToken ) ;
152+ lastScanAction = ScanAction . RescanGreaterThanToken ;
153+ }
154+ else if ( n . kind === SyntaxKind . RegularExpressionLiteral && startsWithSlashToken ( currentToken ) ) {
155+ currentToken = scanner . reScanSlashToken ( ) ;
156+ Debug . assert ( n . kind === currentToken ) ;
157+ lastScanAction = ScanAction . RescanSlashToken ;
118158 }
119- else if ( n . kind === SyntaxKind . RegularExpressionLiteral && current === SyntaxKind . SlashToken ) {
120- current = scanner . reScanSlashToken ( ) ;
121- Debug . assert ( n . kind === current ) ;
159+ else {
160+ lastScanAction = ScanAction . Normal ;
122161 }
123162
124163 endPos = scanner . getTextPos ( ) ;
125164
126165 var token : TextRangeWithKind = {
127166 pos : scanner . getStartPos ( ) ,
128167 end : scanner . getTextPos ( ) ,
129- kind : current
168+ kind : currentToken
130169 }
131170
132171 while ( scanner . getStartPos ( ) < range . end ) {
133- current = scanner . scan ( ) ;
134- if ( ! isTrivia ( current ) ) {
172+ currentToken = scanner . scan ( ) ;
173+ if ( ! isTrivia ( currentToken ) ) {
135174 break ;
136175 }
137176 var trivia = {
138177 pos : scanner . getStartPos ( ) ,
139178 end : scanner . getTextPos ( ) ,
140- kind : current
179+ kind : currentToken
141180 } ;
142181
143182 if ( ! trailingTrivia ) {
@@ -146,7 +185,7 @@ module ts.formatting {
146185
147186 trailingTrivia . push ( trivia ) ;
148187
149- if ( current === SyntaxKind . NewLineTrivia ) {
188+ if ( currentToken === SyntaxKind . NewLineTrivia ) {
150189 // move past new line
151190 scanner . scan ( ) ;
152191 break ;
@@ -165,9 +204,5 @@ module ts.formatting {
165204 var startPos = ( lastTokenInfo && lastTokenInfo . token . pos ) || scanner . getStartPos ( ) ;
166205 return startPos < range . end && current !== SyntaxKind . EndOfFileToken && ! isTrivia ( current ) ;
167206 }
168-
169- function lastTrailingTriviaWasNewLine ( ) : boolean {
170- return wasNewLine ;
171- }
172207 }
173208}
0 commit comments