Skip to content

Commit 2d725fe

Browse files
committed
Add outlining span for named bindings in import declarations
1 parent de13cc4 commit 2d725fe

File tree

3 files changed

+30
-8
lines changed

3 files changed

+30
-8
lines changed

src/services/outliningElementsCollector.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,16 @@ namespace ts.OutliningElementsCollector {
3333
// Add outlining spans for comments if they exist
3434
addOutliningForLeadingCommentsForNode(node, sourceFile, cancellationToken, out);
3535
// Add outlining spans for the import statement itself if applicable
36-
const span = getOutliningSpanForNode(node, sourceFile);
37-
if (span) out.push(span);
36+
if (isImportDeclaration(node) && node.importClause && node.importClause.namedBindings &&
37+
node.importClause.namedBindings.kind !== SyntaxKind.NamespaceImport && node.importClause.namedBindings.elements.length) {
38+
const openToken = findChildOfKind(node.importClause.namedBindings, SyntaxKind.OpenBraceToken, sourceFile);
39+
const closeToken = findChildOfKind(node.importClause.namedBindings, SyntaxKind.CloseBraceToken, sourceFile);
40+
if (openToken && closeToken) {
41+
out.push(createOutliningSpan(
42+
createTextSpanFromBounds(openToken.getStart(sourceFile), closeToken.getEnd()),
43+
OutliningSpanKind.Import, createTextSpanFromNode(node, sourceFile)));
44+
}
45+
}
3846
}
3947

4048
function visitNonImportNode(n: Node) {
@@ -177,10 +185,7 @@ namespace ts.OutliningElementsCollector {
177185
return spanForObjectOrArrayLiteral(n);
178186
case SyntaxKind.ArrayLiteralExpression:
179187
return spanForObjectOrArrayLiteral(n, SyntaxKind.OpenBracketToken);
180-
case SyntaxKind.ImportDeclaration:
181-
const importClause = (n as ImportDeclaration).importClause;
182-
return importClause && importClause.namedBindings && importClause.namedBindings.kind !== SyntaxKind.NamespaceImport ? spanForNode(importClause.namedBindings) : undefined;
183-
}
188+
}
184189

185190
function spanForObjectOrArrayLiteral(node: Node, open: SyntaxKind.OpenBraceToken | SyntaxKind.OpenBracketToken = SyntaxKind.OpenBraceToken): OutliningSpan | undefined {
186191
// If the block has no leading keywords and is inside an array literal,

tests/cases/fourslash/getOutliningSpansForImports.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
////[|import * as ns from "mod";
55
////
66
////import d from "mod";
7-
////import { a, b, c } from "mod";
7+
////import [|{ a, b, c }|] from "mod";
88
////
99
////import r = require("mod");|]
1010
////
@@ -14,7 +14,7 @@
1414
////// another set of imports
1515
////[|import * as ns from "mod";
1616
////import d from "mod";
17-
////import { a, b, c } from "mod";
17+
////import [|{ a, b, c }|] from "mod";
1818
////import r = require("mod");|]
1919

2020
verify.outliningSpansInCurrentFile(test.ranges(), "import");
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/// <reference path="fourslash.ts"/>
2+
3+
4+
////[|import [|{
5+
//// a,
6+
//// b as B,
7+
//// c
8+
////}|] from "mod";
9+
////
10+
////
11+
////import { } from "mod";
12+
////import * as ns from "mod";
13+
////import d from "mod";|]
14+
15+
verify.outliningSpansInCurrentFile(test.ranges(), "import");
16+
17+

0 commit comments

Comments
 (0)