From ccaf904cfa872865b4150663f2eeb7b972719797 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Tue, 12 Aug 2014 15:47:57 -0700 Subject: [PATCH] support outlining for arbitrary blocks --- src/services/outliningElementsCollector.ts | 34 ++++++++++------------ src/services/shims.ts | 2 +- tests/cases/fourslash/getOutliningSpans.ts | 4 +-- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index 8d453679aad..92440bfe760 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -36,11 +36,11 @@ module ts { export function collectElements(sourceFile: SourceFile): OutliningSpan[] { var elements: OutliningSpan[] = []; - function addOutlineRange(node: Node, startElement: Node, endElement: Node) { - if (node && startElement && endElement) { + function addOutlineRange(hintSpanNode: Node, startElement: Node, endElement: Node) { + if (hintSpanNode && startElement && endElement) { var span: OutliningSpan = { textSpan: TypeScript.TextSpan.fromBounds(startElement.pos, endElement.end), - hintSpan: TypeScript.TextSpan.fromBounds(node.getStart(), node.end), + hintSpan: TypeScript.TextSpan.fromBounds(hintSpanNode.getStart(), hintSpanNode.end), bannerText: "...", autoCollapse: false }; @@ -49,33 +49,31 @@ module ts { } var depth = 0; - var maxDepth = 10; + var maxDepth = 20; function walk(n: Node): void { - if (depth >= maxDepth) { + if (depth > maxDepth) { return; } switch (n.kind) { + case SyntaxKind.Block: + case SyntaxKind.FunctionBlock: + case SyntaxKind.ModuleBlock: + case SyntaxKind.TryBlock: + 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); + addOutlineRange(n.parent, openBrace, closeBrace); + break; case SyntaxKind.ClassDeclaration: case SyntaxKind.InterfaceDeclaration: - case SyntaxKind.ModuleDeclaration: 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); addOutlineRange(n, openBrace, closeBrace); break; - case SyntaxKind.Constructor: - case SyntaxKind.FunctionDeclaration: - case SyntaxKind.Method: - case SyntaxKind.GetAccessor: - case SyntaxKind.SetAccessor: - var body = (n).body; - if (body) { - var openBrace = forEach(body.getChildren(), c => c.kind === SyntaxKind.OpenBraceToken && c); - var closeBrace = forEach(body.getChildren(), c => c.kind === SyntaxKind.CloseBraceToken && c); - addOutlineRange(n, openBrace, closeBrace); - } - break; } depth++; forEachChild(n, walk); diff --git a/src/services/shims.ts b/src/services/shims.ts index 26c43295b66..523a0af5c91 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -728,7 +728,7 @@ module ts { var items = this.languageService.getOutliningRegions(fileName); // return just the part of data that language service v2 can understand // language service v2 will use the entire OutliningSpan - var spans = forEach(items, i => i.textSpan); + var spans = map(items, i => i.textSpan); return spans; }); } diff --git a/tests/cases/fourslash/getOutliningSpans.ts b/tests/cases/fourslash/getOutliningSpans.ts index 57eba365e33..d672ba20ac4 100644 --- a/tests/cases/fourslash/getOutliningSpans.ts +++ b/tests/cases/fourslash/getOutliningSpans.ts @@ -63,10 +63,10 @@ ////}|] /* even more */ //// ////// object literals -////var x = [|{ +////var x =[|{ //// a:1, //// b:2, -//// get foo() [|{ +//// get foo()[| { //// return 1; //// }|] ////}|]