@@ -53,28 +53,19 @@ namespace ts.formatting {
53
53
return res ;
54
54
55
55
function advance ( ) : void {
56
- Debug . assert ( scanner !== undefined , "Scanner should be present" ) ;
57
-
58
56
lastTokenInfo = undefined ;
59
57
const isStarted = scanner . getStartPos ( ) !== startPos ;
60
58
61
59
if ( isStarted ) {
62
- if ( trailingTrivia ) {
63
- Debug . assert ( trailingTrivia . length !== 0 ) ;
64
- wasNewLine = lastOrUndefined ( trailingTrivia ) . kind === SyntaxKind . NewLineTrivia ;
65
- }
66
- else {
67
- wasNewLine = false ;
68
- }
60
+ wasNewLine = trailingTrivia && lastOrUndefined ( trailingTrivia ) ! . kind === SyntaxKind . NewLineTrivia ;
61
+ }
62
+ else {
63
+ scanner . scan ( ) ;
69
64
}
70
65
71
66
leadingTrivia = undefined ;
72
67
trailingTrivia = undefined ;
73
68
74
- if ( ! isStarted ) {
75
- scanner . scan ( ) ;
76
- }
77
-
78
69
let pos = scanner . getStartPos ( ) ;
79
70
80
71
// Read leading trivia and token
@@ -94,25 +85,20 @@ namespace ts.formatting {
94
85
95
86
pos = scanner . getStartPos ( ) ;
96
87
97
- if ( ! leadingTrivia ) {
98
- leadingTrivia = [ ] ;
99
- }
100
- leadingTrivia . push ( item ) ;
88
+ leadingTrivia = append ( leadingTrivia , item ) ;
101
89
}
102
90
103
91
savedPos = scanner . getStartPos ( ) ;
104
92
}
105
93
106
94
function shouldRescanGreaterThanToken ( node : Node ) : boolean {
107
- if ( node ) {
108
- switch ( node . kind ) {
109
- case SyntaxKind . GreaterThanEqualsToken :
110
- case SyntaxKind . GreaterThanGreaterThanEqualsToken :
111
- case SyntaxKind . GreaterThanGreaterThanGreaterThanEqualsToken :
112
- case SyntaxKind . GreaterThanGreaterThanGreaterThanToken :
113
- case SyntaxKind . GreaterThanGreaterThanToken :
114
- return true ;
115
- }
95
+ switch ( node . kind ) {
96
+ case SyntaxKind . GreaterThanEqualsToken :
97
+ case SyntaxKind . GreaterThanGreaterThanEqualsToken :
98
+ case SyntaxKind . GreaterThanGreaterThanGreaterThanEqualsToken :
99
+ case SyntaxKind . GreaterThanGreaterThanGreaterThanToken :
100
+ case SyntaxKind . GreaterThanGreaterThanToken :
101
+ return true ;
116
102
}
117
103
118
104
return false ;
@@ -134,7 +120,7 @@ namespace ts.formatting {
134
120
}
135
121
136
122
function shouldRescanJsxText ( node : Node ) : boolean {
137
- return node && node . kind === SyntaxKind . JsxText ;
123
+ return node . kind === SyntaxKind . JsxText ;
138
124
}
139
125
140
126
function shouldRescanSlashToken ( container : Node ) : boolean {
@@ -151,16 +137,7 @@ namespace ts.formatting {
151
137
}
152
138
153
139
function readTokenInfo ( n : Node ) : TokenInfo {
154
- Debug . assert ( scanner !== undefined ) ;
155
-
156
- if ( ! isOnToken ( ) ) {
157
- // scanner is not on the token (either advance was not called yet or scanner is already past the end position)
158
- return {
159
- leadingTrivia,
160
- trailingTrivia : undefined ,
161
- token : undefined
162
- } ;
163
- }
140
+ Debug . assert ( isOnToken ( ) ) ;
164
141
165
142
// normally scanner returns the smallest available token
166
143
// check the kind of context node to determine if scanner should have more greedy behavior and consume more text.
@@ -194,33 +171,7 @@ namespace ts.formatting {
194
171
scanner . scan ( ) ;
195
172
}
196
173
197
- let currentToken = scanner . getToken ( ) ;
198
-
199
- if ( expectedScanAction === ScanAction . RescanGreaterThanToken && currentToken === SyntaxKind . GreaterThanToken ) {
200
- currentToken = scanner . reScanGreaterToken ( ) ;
201
- Debug . assert ( n . kind === currentToken ) ;
202
- lastScanAction = ScanAction . RescanGreaterThanToken ;
203
- }
204
- else if ( expectedScanAction === ScanAction . RescanSlashToken && startsWithSlashToken ( currentToken ) ) {
205
- currentToken = scanner . reScanSlashToken ( ) ;
206
- Debug . assert ( n . kind === currentToken ) ;
207
- lastScanAction = ScanAction . RescanSlashToken ;
208
- }
209
- else if ( expectedScanAction === ScanAction . RescanTemplateToken && currentToken === SyntaxKind . CloseBraceToken ) {
210
- currentToken = scanner . reScanTemplateToken ( ) ;
211
- lastScanAction = ScanAction . RescanTemplateToken ;
212
- }
213
- else if ( expectedScanAction === ScanAction . RescanJsxIdentifier ) {
214
- currentToken = scanner . scanJsxIdentifier ( ) ;
215
- lastScanAction = ScanAction . RescanJsxIdentifier ;
216
- }
217
- else if ( expectedScanAction === ScanAction . RescanJsxText ) {
218
- currentToken = scanner . reScanJsxToken ( ) ;
219
- lastScanAction = ScanAction . RescanJsxText ;
220
- }
221
- else {
222
- lastScanAction = ScanAction . Scan ;
223
- }
174
+ let currentToken = getNextToken ( n , expectedScanAction ) ;
224
175
225
176
const token : TextRangeWithKind = {
226
177
pos : scanner . getStartPos ( ) ,
@@ -261,9 +212,47 @@ namespace ts.formatting {
261
212
return fixTokenKind ( lastTokenInfo , n ) ;
262
213
}
263
214
264
- function isOnToken ( ) : boolean {
265
- Debug . assert ( scanner !== undefined ) ;
215
+ function getNextToken ( n : Node , expectedScanAction : ScanAction ) : SyntaxKind {
216
+ const token = scanner . getToken ( ) ;
217
+ lastScanAction = ScanAction . Scan ;
218
+ switch ( expectedScanAction ) {
219
+ case ScanAction . RescanGreaterThanToken :
220
+ if ( token === SyntaxKind . GreaterThanToken ) {
221
+ lastScanAction = ScanAction . RescanGreaterThanToken ;
222
+ const newToken = scanner . reScanGreaterToken ( ) ;
223
+ Debug . assert ( n . kind === newToken ) ;
224
+ return newToken ;
225
+ }
226
+ break ;
227
+ case ScanAction . RescanSlashToken :
228
+ if ( startsWithSlashToken ( token ) ) {
229
+ lastScanAction = ScanAction . RescanSlashToken ;
230
+ const newToken = scanner . reScanSlashToken ( ) ;
231
+ Debug . assert ( n . kind === newToken ) ;
232
+ return newToken ;
233
+ }
234
+ break ;
235
+ case ScanAction . RescanTemplateToken :
236
+ if ( token === SyntaxKind . CloseBraceToken ) {
237
+ lastScanAction = ScanAction . RescanTemplateToken ;
238
+ return scanner . reScanTemplateToken ( ) ;
239
+ }
240
+ break ;
241
+ case ScanAction . RescanJsxIdentifier :
242
+ lastScanAction = ScanAction . RescanJsxIdentifier ;
243
+ return scanner . scanJsxIdentifier ( ) ;
244
+ case ScanAction . RescanJsxText :
245
+ lastScanAction = ScanAction . RescanJsxText ;
246
+ return scanner . reScanJsxToken ( ) ;
247
+ case ScanAction . Scan :
248
+ break ;
249
+ default :
250
+ Debug . assertNever ( expectedScanAction ) ;
251
+ }
252
+ return token ;
253
+ }
266
254
255
+ function isOnToken ( ) : boolean {
267
256
const current = lastTokenInfo ? lastTokenInfo . token . kind : scanner . getToken ( ) ;
268
257
const startPos = lastTokenInfo ? lastTokenInfo . token . pos : scanner . getStartPos ( ) ;
269
258
return startPos < endPos && current !== SyntaxKind . EndOfFileToken && ! isTrivia ( current ) ;
0 commit comments