From c0466b636fd515202a2a9a15f2783cf91eeed83b Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 15 Oct 2014 14:54:49 -0700 Subject: [PATCH] fix a few issues in rules --- src/compiler/types.ts | 6 ++- src/services/formatting/format.ts | 45 +++++++++++-------- src/services/formatting/new/rules.ts | 10 +++-- src/services/formatting/new/tokenRange.ts | 4 +- .../formattingOnTabAfterCloseCurly.ts | 4 +- 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/compiler/types.ts b/src/compiler/types.ts index cab45aadbe6..6e01a7b2e36 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -231,7 +231,11 @@ module ts { FirstToken = EndOfFileToken, LastToken = StringKeyword, FirstTriviaToken = SingleLineCommentTrivia, - LastTriviaToken = WhitespaceTrivia + LastTriviaToken = WhitespaceTrivia, + FirstOperator = SemicolonToken, + LastOperator = CaretEqualsToken, + FirstBinaryOperator = LessThanToken, + LastBinaryOperator = CaretEqualsToken } export enum NodeFlags { diff --git a/src/services/formatting/format.ts b/src/services/formatting/format.ts index c237cad5510..9c271de47a8 100644 --- a/src/services/formatting/format.ts +++ b/src/services/formatting/format.ts @@ -189,7 +189,7 @@ module ts.formatting { var previousParent: Node; var previousRangeStartLine: number; - var lastTriviaWasNewLine = false; + var lastTriviaWasNewLine = true; var edits: TextChange[] = []; // advance the scaner @@ -208,7 +208,7 @@ module ts.formatting { return; } - if (!rangeContainsRange(node, currentTokenInfo)) { + if (!rangeContainsRange(node, currentTokenInfo.token)) { // node and its descendents don't contain current token from the scanner - skip it return; } @@ -351,14 +351,31 @@ module ts.formatting { processTrivia(currentTokenInfo.leadingTrivia, parent, contextNode, indentation); } + + var indentToken: boolean; if (rangeContainsRange(originalRange, currentTokenInfo.token)) { - processRange(currentTokenInfo.token, parent, contextNode, indentation); + indentToken = processRange(currentTokenInfo.token, parent, contextNode, indentation); } if (currentTokenInfo.trailingTrivia) { processTrivia(currentTokenInfo.trailingTrivia, parent, contextNode, indentation); } + if (lastTriviaWasNewLine && indentToken) { + + // TODO: remove + var tokenRange = getNonAdjustedLineAndCharacterFromPosition(currentTokenInfo.token.pos, sourceFile); + + // TODO: handle indentation in multiline comments + var currentIndentation = tokenRange.character; + if (indentation !== currentIndentation) { + var indentationString = getIndentationString(indentation, options); + var startLinePosition = getStartPositionOfLine(tokenRange.line, sourceFile); + recordReplace(startLinePosition, currentIndentation, indentationString); + } + } + + return fetchNextTokenInfo(); } @@ -371,10 +388,11 @@ module ts.formatting { } } - function processRange(range: TextRangeWithKind, parent: Node, contextNode: Node, indentation: number) { + function processRange(range: TextRangeWithKind, parent: Node, contextNode: Node, indentation: number): boolean { var rangeStart = getNonAdjustedLineAndCharacterFromPosition(range.pos, sourceFile); - if (rangeContainsRange(originalRange, range)) { - var indentToken = true; + var indentToken = true; + + if (rangeContainsRange(originalRange, range)) { if (!previousRange) { var originalStart = getNonAdjustedLineAndCharacterFromPosition(originalRange.pos, sourceFile); // TODO: implement @@ -389,23 +407,12 @@ module ts.formatting { processPair(range, rangeStart.line, parent, previousRange, previousRangeStartLine, previousParent, contextNode) indentToken = rangeStart.line !== previousRangeStartLine; } - - if (lastTriviaWasNewLine && indentToken) { - // TODO: handle indentation in multiline comments - if (!isTrivia(range.kind)) { - var currentIndentation = rangeStart.character; - if (indentation !== currentIndentation) { - var indentationString = getIndentationString(indentation, options); - var startLinePosition = getStartPositionOfLine(rangeStart.line, sourceFile); - recordReplace(startLinePosition, currentIndentation, indentationString); - } - } - } } - previousRange = range; previousParent = parent; previousRangeStartLine = rangeStart.line; + + return indentToken; } function processPair(currentItem: TextRangeWithKind, diff --git a/src/services/formatting/new/rules.ts b/src/services/formatting/new/rules.ts index 77030fe7a70..e7fe96ca0a6 100644 --- a/src/services/formatting/new/rules.ts +++ b/src/services/formatting/new/rules.ts @@ -448,6 +448,7 @@ module ts.formatting { switch (context.contextNode.kind) { case SyntaxKind.BinaryExpression: + case SyntaxKind.ConditionalExpression: return true; //// binary expressions //case SyntaxKind.AssignmentExpression: @@ -492,8 +493,10 @@ module ts.formatting { case SyntaxKind.ImportDeclaration: // equal in var a = 0; case SyntaxKind.VariableDeclaration: - // TODO: - //case SyntaxKind.EqualsValueClause: + // equal in p = 0; + case SyntaxKind.Parameter: + case SyntaxKind.EnumMember: + case SyntaxKind.Property: return context.currentTokenSpan.kind === SyntaxKind.EqualsToken || context.nextTokenSpan.kind === SyntaxKind.EqualsToken; // "in" keyword in for (var x in []) { } case SyntaxKind.ForInStatement: @@ -704,8 +707,7 @@ module ts.formatting { } static IsVoidOpContext(context: FormattingContext): boolean { - return; - //return context.currentTokenSpan.token.kind === SyntaxKind.VoidKeyword && context.currentTokenParent.kind() === SyntaxKind.VoidExpression; + return context.currentTokenSpan.kind === SyntaxKind.VoidKeyword && context.currentTokenParent.kind === SyntaxKind.PrefixOperator; } } } \ No newline at end of file diff --git a/src/services/formatting/new/tokenRange.ts b/src/services/formatting/new/tokenRange.ts index 5022384eeb5..06c7dfbe174 100644 --- a/src/services/formatting/new/tokenRange.ts +++ b/src/services/formatting/new/tokenRange.ts @@ -135,8 +135,8 @@ module ts.formatting { static Any: TokenRange = TokenRange.AllTokens(); static AnyIncludingMultilineComments = TokenRange.FromTokens(TokenRange.Any.GetTokens().concat([SyntaxKind.MultiLineCommentTrivia])); static Keywords = TokenRange.FromRange(SyntaxKind.FirstKeyword, SyntaxKind.LastKeyword); - static Operators = TokenRange.FromRange(SyntaxKind.SemicolonToken, SyntaxKind.SlashEqualsToken); - static BinaryOperators = TokenRange.FromRange(SyntaxKind.LessThanToken, SyntaxKind.SlashEqualsToken); + static Operators = TokenRange.FromRange(SyntaxKind.FirstOperator, SyntaxKind.LastOperator); + static BinaryOperators = TokenRange.FromRange(SyntaxKind.FirstBinaryOperator, SyntaxKind.LastBinaryOperator); static BinaryKeywordOperators = TokenRange.FromTokens([SyntaxKind.InKeyword, SyntaxKind.InstanceOfKeyword]); static ReservedKeywords = TokenRange.FromRange(SyntaxKind.FirstFutureReservedWord, SyntaxKind.LastFutureReservedWord); static UnaryPrefixOperators = TokenRange.FromTokens([SyntaxKind.PlusPlusToken, SyntaxKind.MinusMinusToken, SyntaxKind.TildeToken, SyntaxKind.ExclamationToken]); diff --git a/tests/cases/fourslash/formattingOnTabAfterCloseCurly.ts b/tests/cases/fourslash/formattingOnTabAfterCloseCurly.ts index 3b6d60ef45b..2e7c344d225 100644 --- a/tests/cases/fourslash/formattingOnTabAfterCloseCurly.ts +++ b/tests/cases/fourslash/formattingOnTabAfterCloseCurly.ts @@ -4,7 +4,7 @@ //// export enum NodeType {/*2*/ //// Error,/*3*/ //// Comment,/*4*/ -//// } /*5*/ +//// } /*5*/ //// export enum foob/*6*/ //// { //// Blah=1, Bleah=2/*7*/ @@ -25,7 +25,7 @@ verify.currentLineContentIs(" }"); goTo.marker("6"); verify.currentLineContentIs(" export enum foob {"); goTo.marker("7"); -verify.currentLineContentIs(" Blah= 1, Bleah= 2"); +verify.currentLineContentIs(" Blah = 1, Bleah = 2"); goTo.marker("8"); verify.currentLineContentIs(" }"); goTo.marker("9");