Skip to content

Commit e795b59

Browse files
committed
initial rev of using error information in formatting
1 parent 7ffcd58 commit e795b59

3 files changed

Lines changed: 35 additions & 13 deletions

File tree

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ module ts {
549549
export interface SourceFile extends Block {
550550
filename: string;
551551
text: string;
552-
getLineAndCharacterFromPosition(position: number): { line: number; character: number };
552+
getLineAndCharacterFromPosition(position: number): LineAndCharacter;
553553
getPositionFromLineAndCharacter(line: number, character: number): number;
554554
getLineStarts(): number[];
555555
amdDependencies: string[];

src/services/formatting/format.ts

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,12 @@ module ts.formatting {
121121
sourceFile: SourceFile,
122122
options: FormatCodeOptions,
123123
rulesProvider: RulesProvider,
124-
requestKind: FormattingRequestKind): TextChange[] {
124+
requestKind: FormattingRequestKind): TextChange[]{
125+
126+
var syntacticErrors = sourceFile.syntacticErrors.length !== 0 && sourceFile.syntacticErrors.slice(0);
127+
if (syntacticErrors) {
128+
syntacticErrors.sort((d1, d2) => d1.start - d2.start);
129+
}
125130

126131
// formatting context to be used by rules provider to get rules
127132
var formattingContext = new FormattingContext(sourceFile, requestKind);
@@ -131,6 +136,7 @@ module ts.formatting {
131136

132137
var formattingScanner = getFormattingScanner(sourceFile, enclosingNode, originalRange);
133138

139+
var previousRangeHasError: boolean;
134140
var previousRange: TextRangeWithKind;
135141
var previousParent: Node;
136142
var previousRangeStartLine: number;
@@ -144,6 +150,9 @@ module ts.formatting {
144150
var startLine = sourceFile.getLineAndCharacterFromPosition(enclosingNode.getStart(sourceFile)).line;
145151
processNode(enclosingNode, enclosingNode, startLine, initialIndentation);
146152
}
153+
154+
formattingScanner.close();
155+
147156
return edits;
148157

149158
function getIndentationDelta(node: Node, lineAdded: boolean): number {
@@ -238,7 +247,6 @@ module ts.formatting {
238247

239248
// determine child indentation
240249
// TODO: share this code with SmartIndenter
241-
// NOTE: SI uses non-adjusted lines
242250
var increaseIndentation =
243251
childStartLine !== nodeStartLine &&
244252
!SmartIndenter.childStartsOnTheSameLineWithElseInIfStatement(node, child, childStartLine, sourceFile) &&
@@ -254,6 +262,14 @@ module ts.formatting {
254262
}
255263
}
256264

265+
function rangeContainsError(range: TextRange): boolean {
266+
if (!syntacticErrors.length) {
267+
return false;
268+
}
269+
270+
binarySearch
271+
}
272+
257273
function consumeTokenAndAdvanceScanner(currentTokenInfo: TokenInfo, parent: Node, contextNode: Node, indentation: DynamicIndentation): void {
258274
Debug.assert(rangeContainsRange(parent, currentTokenInfo.token));
259275

@@ -266,13 +282,14 @@ module ts.formatting {
266282
var lineAdded: boolean;
267283
var isTokenInRange = rangeContainsRange(originalRange, currentTokenInfo.token);
268284
var indentToken: boolean = true;
285+
269286
if (isTokenInRange) {
270287
var prevStartLine = previousRangeStartLine;
271288
var tokenStart = sourceFile.getLineAndCharacterFromPosition(currentTokenInfo.token.pos);
272289
lineAdded = processRange(currentTokenInfo.token, tokenStart, parent, contextNode, indentation);
273290
if (lineAdded !== undefined) {
274291
indentToken = lineAdded;
275-
}
292+
}
276293
else {
277294
indentToken = tokenStart.line !== prevStartLine;
278295
}
@@ -329,20 +346,23 @@ module ts.formatting {
329346
}
330347

331348
function processRange(range: TextRangeWithKind, rangeStart: LineAndCharacter, parent: Node, contextNode: Node, indentation: DynamicIndentation): boolean {
332-
349+
var rangeHasError = rangeContainsError(range);
333350
var lineAdded: boolean;
334-
if (!previousRange) {
335-
// trim whitespaces starting from the beginning of the span up to the current line
336-
var originalStart = sourceFile.getLineAndCharacterFromPosition(originalRange.pos);
337-
trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line);
338-
}
339-
else {
340-
lineAdded = processPair(range, rangeStart.line, parent, previousRange, previousRangeStartLine, previousParent, contextNode, indentation)
351+
if (!rangeHasError && !previousRangeHasError) {
352+
if (!previousRange) {
353+
// trim whitespaces starting from the beginning of the span up to the current line
354+
var originalStart = sourceFile.getLineAndCharacterFromPosition(originalRange.pos);
355+
trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line);
356+
}
357+
else {
358+
lineAdded = processPair(range, rangeStart.line, parent, previousRange, previousRangeStartLine, previousParent, contextNode, indentation)
359+
}
341360
}
342361

343362
previousRange = range;
344363
previousParent = parent;
345364
previousRangeStartLine = rangeStart.line;
365+
previousRangeHasError = rangeHasError;
346366

347367
return lineAdded;
348368
}

src/services/formatting/formattingScanner.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module ts.formatting {
66
isOnToken(): boolean;
77
readTokenInfo(n: Node): TokenInfo;
88
lastTrailingTriviaWasNewLine(): boolean;
9+
close(): void;
910
}
1011

1112
export function getFormattingScanner(sourceFile: SourceFile, enclosingNode: Node, range: TextRange): FormattingScanner {
@@ -23,7 +24,8 @@ module ts.formatting {
2324
advance: advance,
2425
readTokenInfo: readTokenInfo,
2526
isOnToken: isOnToken,
26-
lastTrailingTriviaWasNewLine: lastTrailingTriviaWasNewLine
27+
lastTrailingTriviaWasNewLine: lastTrailingTriviaWasNewLine,
28+
close: () => scanner.setText(undefined)
2729
}
2830

2931

0 commit comments

Comments
 (0)