mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-24 12:19:20 +00:00
Expand js/ts document symbols to have entries for each span
Fixes #54855
This commit is contained in:
@@ -40,7 +40,6 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let tree: Proto.NavigationTree;
|
let tree: Proto.NavigationTree;
|
||||||
try {
|
try {
|
||||||
const args: Proto.FileRequestArgs = { file };
|
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 {
|
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);
|
let shouldInclude = TypeScriptDocumentSymbolProvider.shouldInclueEntry(item);
|
||||||
|
|
||||||
if (item.childItems) {
|
const children = new Set(item.childItems || []);
|
||||||
for (const child of item.childItems) {
|
for (const span of item.spans) {
|
||||||
const includedChild = TypeScriptDocumentSymbolProvider.convertNavTree(resource, symbolInfo.children, child);
|
const range = typeConverters.Range.fromTextSpan(span);
|
||||||
shouldInclude = shouldInclude || includedChild;
|
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;
|
return shouldInclude;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user