@@ -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 }
0 commit comments