From 5e40bd7df9ff3226939a21a94f318d1633389aca Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 26 Jul 2018 16:01:34 -0700 Subject: [PATCH] Expand js/ts document symbols to have entries for each span Fixes #54855 --- .../src/features/documentSymbol.ts | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/extensions/typescript-language-features/src/features/documentSymbol.ts b/extensions/typescript-language-features/src/features/documentSymbol.ts index 7d3e198ffd3..506aaa676a7 100644 --- a/extensions/typescript-language-features/src/features/documentSymbol.ts +++ b/extensions/typescript-language-features/src/features/documentSymbol.ts @@ -40,7 +40,6 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider return undefined; } - let tree: Proto.NavigationTree; try { const args: Proto.FileRequestArgs = { file }; @@ -64,26 +63,33 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider } private static convertNavTree(resource: vscode.Uri, bucket: vscode.DocumentSymbol[], item: Proto.NavigationTree): boolean { - const symbolInfo = new vscode.DocumentSymbol( - item.text, - '', - getSymbolKind(item.kind), - typeConverters.Range.fromTextSpan(item.spans[0]), - typeConverters.Range.fromTextSpan(item.spans[0]), - ); - let shouldInclude = TypeScriptDocumentSymbolProvider.shouldInclueEntry(item); - if (item.childItems) { - for (const child of item.childItems) { - const includedChild = TypeScriptDocumentSymbolProvider.convertNavTree(resource, symbolInfo.children, child); - shouldInclude = shouldInclude || includedChild; + const children = new Set(item.childItems || []); + for (const span of item.spans) { + const range = typeConverters.Range.fromTextSpan(span); + const symbolInfo = new vscode.DocumentSymbol( + item.text, + '', + getSymbolKind(item.kind), + range, + range); + + if (item.childItems) { + for (const child of children) { + if (child.spans.some(span => !!range.intersection(typeConverters.Range.fromTextSpan(span)))) { + const includedChild = TypeScriptDocumentSymbolProvider.convertNavTree(resource, symbolInfo.children, child); + shouldInclude = shouldInclude || includedChild; + children.delete(child); + } + } } - } - if (shouldInclude) { - bucket.push(symbolInfo); + if (shouldInclude) { + bucket.push(symbolInfo); + } } + return shouldInclude; } -- GitLab