From 222e1d83656e85963f230d34a6a7765bfa9fd5c0 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sun, 28 Sep 2014 22:33:00 -0700 Subject: [PATCH] outlining support for switch blocks\array literals --- src/services/formatting/smartIndenter.ts | 4 ++-- src/services/outliningElementsCollector.ts | 14 ++++++++++---- src/services/utilities.ts | 4 ++++ tests/cases/fourslash/getOutliningSpans.ts | 8 ++++++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 8021a47cee7..79b238c893d 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -174,7 +174,7 @@ module ts.formatting { function childStartsOnTheSameLineWithElseInIfStatement(parent: Node, child: Node, childStartLine: number, sourceFile: SourceFile): boolean { if (parent.kind === SyntaxKind.IfStatement && (parent).elseStatement === child) { - var elseKeyword = forEach(parent.getChildren(), c => c.kind === SyntaxKind.ElseKeyword && c); + var elseKeyword = findChildOfKind(parent, SyntaxKind.ElseKeyword, sourceFile); Debug.assert(elseKeyword); var elseKeywordStartLine = getStartLineAndCharacterForNode(elseKeyword, sourceFile).line; @@ -383,7 +383,7 @@ module ts.formatting { return isCompletedNode((n).statement, sourceFile); case SyntaxKind.DoStatement: // rough approximation: if DoStatement has While keyword - then if node is completed is checking the presence of ')'; - var hasWhileKeyword = forEach(n.getChildren(), c => c.kind === SyntaxKind.WhileKeyword && c); + var hasWhileKeyword = findChildOfKind(n, SyntaxKind.WhileKeyword, sourceFile); if(hasWhileKeyword) { return nodeEndsWith(n, SyntaxKind.CloseParenToken, sourceFile); } diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index 2a303108c15..134508bc067 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -60,18 +60,24 @@ module ts { case SyntaxKind.TryBlock: case SyntaxKind.CatchBlock: case SyntaxKind.FinallyBlock: - var openBrace = forEach(n.getChildren(), c => c.kind === SyntaxKind.OpenBraceToken && c); - var closeBrace = forEach(n.getChildren(), c => c.kind === SyntaxKind.CloseBraceToken && c); + var openBrace = findChildOfKind(n, SyntaxKind.OpenBraceToken, sourceFile); + var closeBrace = findChildOfKind(n, SyntaxKind.CloseBraceToken, sourceFile); addOutlineRange(n.parent, openBrace, closeBrace); break; case SyntaxKind.ClassDeclaration: case SyntaxKind.InterfaceDeclaration: case SyntaxKind.EnumDeclaration: case SyntaxKind.ObjectLiteral: - var openBrace = forEach(n.getChildren(), c => c.kind === SyntaxKind.OpenBraceToken && c); - var closeBrace = forEach(n.getChildren(), c => c.kind === SyntaxKind.CloseBraceToken && c); + case SyntaxKind.SwitchStatement: + var openBrace = findChildOfKind(n, SyntaxKind.OpenBraceToken, sourceFile); + var closeBrace = findChildOfKind(n, SyntaxKind.CloseBraceToken, sourceFile); addOutlineRange(n, openBrace, closeBrace); break; + case SyntaxKind.ArrayLiteral: + var openBracket = findChildOfKind(n, SyntaxKind.OpenBracketToken, sourceFile); + var closeBracket = findChildOfKind(n, SyntaxKind.CloseBracketToken, sourceFile); + addOutlineRange(n, openBracket, closeBracket); + break; } depth++; forEachChild(n, walk); diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 2824ab5d2da..9e68ef1a7aa 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -16,6 +16,10 @@ module ts { }; } + export function findChildOfKind(n: Node, kind: SyntaxKind, sourceFile?: SourceFile): Node { + return forEach(n.getChildren(sourceFile), c => c.kind === kind && c); + } + export function findContainingList(node: Node): Node { // The node might be a list element (nonsynthetic) or a comma (synthetic). Either way, it will // be parented by the container of the SyntaxList, not the SyntaxList itself. diff --git a/tests/cases/fourslash/getOutliningSpans.ts b/tests/cases/fourslash/getOutliningSpans.ts index d672ba20ac4..93665889eb4 100644 --- a/tests/cases/fourslash/getOutliningSpans.ts +++ b/tests/cases/fourslash/getOutliningSpans.ts @@ -25,6 +25,14 @@ //// //// }|] ////}|] +////switch(1)[| { +//// case 1: break; +////}|] +//// +////var array =[| [ +//// 1, +//// 2 +////]|] //// ////// modules ////module m1[| {