Skip to content

Commit bbc2da7

Browse files
committed
return last scanned token if possible
1 parent 154977c commit bbc2da7

1 file changed

Lines changed: 60 additions & 25 deletions

File tree

src/services/formatting/formattingScanner.ts

Lines changed: 60 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)