From e830ae28b72512576c5b1b91b0849f33475170c8 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 30 Oct 2014 14:32:39 -0700 Subject: [PATCH] process start and end tokens in list as part of list, indent return statements --- src/services/formatting/format.ts | 60 +++++++++++++++++++----- src/services/formatting/smartIndenter.ts | 1 + 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/services/formatting/format.ts b/src/services/formatting/format.ts index bec598a0467..e5e255e4d82 100644 --- a/src/services/formatting/format.ts +++ b/src/services/formatting/format.ts @@ -245,28 +245,62 @@ module ts.formatting { processChildNode(child, undefined, /*containingList*/ undefined, /*listElementIndex*/ -1) }, nodes => { - var inheritedIndentation: number = undefined; - for (var i = 0, len = nodes.length; i < len; ++i) { - inheritedIndentation = processChildNode(nodes[i], inheritedIndentation, /*containingList*/ nodes, /*listElementIndex*/ i) - } + var listStartToken = SyntaxKind.Unknown; + var listEndToken = SyntaxKind.Unknown; switch (node.kind) { + case SyntaxKind.Constructor: case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: case SyntaxKind.Method: case SyntaxKind.ArrowFunction: + if ((node).typeParameters === nodes) { + listStartToken = SyntaxKind.LessThanToken + listEndToken = SyntaxKind.GreaterThanToken; + } + else if ((node).parameters === nodes) { + listStartToken = SyntaxKind.OpenParenToken; + listEndToken = SyntaxKind.CloseParenToken; + } + break; case SyntaxKind.CallExpression: case SyntaxKind.NewExpression: - //if (formattingScanner.isOnToken()) { - // var tokenInfo = formattingScanner.readTokenInfo(node); - // Debug.assert(rangeContainsRange(node, tokenInfo.token)); - // // TODO: check if token is a list terminator - // if (node.parent.kind !== SyntaxKind.SourceFile && formattingScanner.lastTrailingTriviaWasNewLine()) { - // var listTerminatorIndentation = nodeIndentation.getIndentation() + options.IndentSize; - // doConsumeTokenAndAdvanceScanner(tokenInfo, node, getDynamicIndentation(node, listTerminatorIndentation, listTerminatorIndentation, nodeIndentation)); - // } - //} + if ((node).typeArguments === nodes) { + listStartToken = SyntaxKind.LessThanToken + listEndToken = SyntaxKind.GreaterThanToken; + } + else if ((node).arguments === nodes) { + listStartToken = SyntaxKind.OpenParenToken; + listEndToken = SyntaxKind.CloseParenToken; + } break; } + + if (listStartToken !== SyntaxKind.Unknown) { + // try to consume open token + if (formattingScanner.isOnToken()) { + var tokenInfo = formattingScanner.readTokenInfo(node); + if (tokenInfo.token.kind === listStartToken) { + // make sure that this token does not belong to the child + doConsumeTokenAndAdvanceScanner(tokenInfo, node, nodeIndentation); + } + } + } + + var inheritedIndentation: number = undefined; + for (var i = 0, len = nodes.length; i < len; ++i) { + inheritedIndentation = processChildNode(nodes[i], inheritedIndentation, /*containingList*/ nodes, /*listElementIndex*/ i) + } + + if (listEndToken !== SyntaxKind.Unknown) { + if (formattingScanner.isOnToken()) { + var tokenInfo = formattingScanner.readTokenInfo(node); + if (tokenInfo.token.kind === listEndToken && formattingScanner.lastTrailingTriviaWasNewLine()) { + + var endTokenIndentation = nodeIndentation.getIndentation() + options.IndentSize; + doConsumeTokenAndAdvanceScanner(tokenInfo, node, getDynamicIndentation(node, endTokenIndentation, endTokenIndentation, nodeIndentation)); + } + } + } } ); diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index b83230047e8..3d5e08fed5a 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -319,6 +319,7 @@ module ts.formatting { case SyntaxKind.VariableStatement: case SyntaxKind.VariableDeclaration: case SyntaxKind.ExportAssignment: + case SyntaxKind.ReturnStatement: return true; default: return false;