From 07469fb306b6f8424871a765407b2f7dc590608b Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sat, 8 Nov 2014 00:10:30 -0800 Subject: [PATCH] do not descend into child nodes if child does not overlap with target span --- src/services/format.ts | 38 ++++++++++++++++++++++------------- src/services/smartIndenter.ts | 2 +- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/services/format.ts b/src/services/format.ts index c3abf265166..9ecdb09e861 100644 --- a/src/services/format.ts +++ b/src/services/format.ts @@ -176,9 +176,14 @@ module ts.formatting { var formattingContext = new FormattingContext(sourceFile, requestKind); var enclosingNode = findEnclosingNode(originalRange, sourceFile); - var initialIndentation = SmartIndenter.getIndentationForNode(enclosingNode, originalRange, sourceFile, options); - - var formattingScanner = getFormattingScanner(sourceFile, enclosingNode.pos, originalRange.end); + if (enclosingNode.kind === SyntaxKind.SourceFile) { + var formattingScanner = getFormattingScanner(sourceFile, originalRange.pos, originalRange.end); + var initialIndentation = 0; + } + else { + var formattingScanner = getFormattingScanner(sourceFile, enclosingNode.pos, originalRange.end); + var initialIndentation = SmartIndenter.getIndentationForNode(enclosingNode, originalRange, sourceFile, options); + } var previousRangeHasError: boolean; var previousRange: TextRangeWithKind; @@ -321,11 +326,26 @@ module ts.formatting { effectiveParentStartLine: number, isListItem: boolean): number { + var childStartPos = child.getStart(sourceFile); + + var childStart = sourceFile.getLineAndCharacterFromPosition(childStartPos); + var childIndentationAmount = + isListItem + ? tryComputeIndentationForListItem(childStartPos, child.end, effectiveParentStartLine, originalRange, inheritedIndentation) + : Indentation.Unknown; + + if (isListItem && childIndentationAmount !== Indentation.Unknown) { + inheritedIndentation = childIndentationAmount; + } + + if (!rangeOverlapsWithStartEnd(originalRange, child.pos, child.end)) { + return inheritedIndentation; + } + if (child.kind === SyntaxKind.Missing) { return inheritedIndentation; } - var childStartPos = child.getStart(sourceFile); while (formattingScanner.isOnToken()) { var tokenInfo = formattingScanner.readTokenInfo(node); if (tokenInfo.token.end > childStartPos) { @@ -339,16 +359,6 @@ module ts.formatting { return inheritedIndentation; } - var childStart = sourceFile.getLineAndCharacterFromPosition(childStartPos); - var childIndentationAmount = - isListItem - ? tryComputeIndentationForListItem(childStartPos, child.end, effectiveParentStartLine, originalRange, inheritedIndentation) - : Indentation.Unknown; - - if (isListItem && childIndentationAmount !== Indentation.Unknown) { - inheritedIndentation = childIndentationAmount; - } - if (isToken(child)) { var tokenInfo = formattingScanner.readTokenInfo(node); Debug.assert(tokenInfo.token.end === child.end); diff --git a/src/services/smartIndenter.ts b/src/services/smartIndenter.ts index 932d90d3bd7..7feee03d9d8 100644 --- a/src/services/smartIndenter.ts +++ b/src/services/smartIndenter.ts @@ -197,7 +197,7 @@ module ts.formatting { return candidate.end > position || !isCompletedNode(candidate, sourceFile); } - export function childStartsOnTheSameLineWithElseInIfStatement(parent: Node, child: Node, childStartLine: number, sourceFile: SourceFile): boolean { + export function childStartsOnTheSameLineWithElseInIfStatement(parent: Node, child: TextRangeWithKind, childStartLine: number, sourceFile: SourceFile): boolean { if (parent.kind === SyntaxKind.IfStatement && (parent).elseStatement === child) { var elseKeyword = findChildOfKind(parent, SyntaxKind.ElseKeyword, sourceFile); Debug.assert(elseKeyword !== undefined);