diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index cca5f843938..c58e122356a 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -33,8 +33,16 @@ namespace ts.OutliningElementsCollector { // Add outlining spans for comments if they exist addOutliningForLeadingCommentsForNode(node, sourceFile, cancellationToken, out); // Add outlining spans for the import statement itself if applicable - const span = getOutliningSpanForNode(node, sourceFile); - if (span) out.push(span); + if (isImportDeclaration(node) && node.importClause && node.importClause.namedBindings && + node.importClause.namedBindings.kind !== SyntaxKind.NamespaceImport && node.importClause.namedBindings.elements.length) { + const openToken = findChildOfKind(node.importClause.namedBindings, SyntaxKind.OpenBraceToken, sourceFile); + const closeToken = findChildOfKind(node.importClause.namedBindings, SyntaxKind.CloseBraceToken, sourceFile); + if (openToken && closeToken) { + out.push(createOutliningSpan( + createTextSpanFromBounds(openToken.getStart(sourceFile), closeToken.getEnd()), + OutliningSpanKind.Import, createTextSpanFromNode(node, sourceFile))); + } + } } function visitNonImportNode(n: Node) { @@ -177,10 +185,7 @@ namespace ts.OutliningElementsCollector { return spanForObjectOrArrayLiteral(n); case SyntaxKind.ArrayLiteralExpression: return spanForObjectOrArrayLiteral(n, SyntaxKind.OpenBracketToken); - case SyntaxKind.ImportDeclaration: - const importClause = (n as ImportDeclaration).importClause; - return importClause && importClause.namedBindings && importClause.namedBindings.kind !== SyntaxKind.NamespaceImport ? spanForNode(importClause.namedBindings) : undefined; - } + } function spanForObjectOrArrayLiteral(node: Node, open: SyntaxKind.OpenBraceToken | SyntaxKind.OpenBracketToken = SyntaxKind.OpenBraceToken): OutliningSpan | undefined { // If the block has no leading keywords and is inside an array literal, diff --git a/tests/cases/fourslash/getOutliningSpansForImports.ts b/tests/cases/fourslash/getOutliningSpansForImports.ts index 23b625059c5..198adc9c551 100644 --- a/tests/cases/fourslash/getOutliningSpansForImports.ts +++ b/tests/cases/fourslash/getOutliningSpansForImports.ts @@ -4,7 +4,7 @@ ////[|import * as ns from "mod"; //// ////import d from "mod"; -////import { a, b, c } from "mod"; +////import [|{ a, b, c }|] from "mod"; //// ////import r = require("mod");|] //// @@ -14,7 +14,7 @@ ////// another set of imports ////[|import * as ns from "mod"; ////import d from "mod"; -////import { a, b, c } from "mod"; +////import [|{ a, b, c }|] from "mod"; ////import r = require("mod");|] verify.outliningSpansInCurrentFile(test.ranges(), "import"); diff --git a/tests/cases/fourslash/getOutliningSpansForImportsWithNamedBindings.ts b/tests/cases/fourslash/getOutliningSpansForImportsWithNamedBindings.ts new file mode 100644 index 00000000000..4e5336ba3b0 --- /dev/null +++ b/tests/cases/fourslash/getOutliningSpansForImportsWithNamedBindings.ts @@ -0,0 +1,17 @@ +/// + + +////[|import [|{ +//// a, +//// b as B, +//// c +////}|] from "mod"; +//// +//// +////import { } from "mod"; +////import * as ns from "mod"; +////import d from "mod";|] + +verify.outliningSpansInCurrentFile(test.ranges(), "import"); + +