This commit is contained in:
Matt Bierner
2020-02-12 15:45:59 -08:00
parent 88a1564e9c
commit 43e268ad72

View File

@@ -32,6 +32,7 @@ const getSymbolKind = (kind: string): vscode.SymbolKind => {
};
class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
public constructor(
private readonly client: ITypeScriptServiceClient,
private cachedResponse: CachedResponse<Proto.NavTreeResponse>,
@@ -45,23 +46,27 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider
const args: Proto.FileRequestArgs = { file };
const response = await this.cachedResponse.execute(document, () => this.client.execute('navtree', args, token));
if (response.type !== 'response' || !response.body) {
if (response.type !== 'response' || !response.body?.childItems) {
return undefined;
}
let tree = response.body;
if (tree && tree.childItems) {
// The root represents the file. Ignore this when showing in the UI
const result: vscode.DocumentSymbol[] = [];
tree.childItems.forEach(item => TypeScriptDocumentSymbolProvider.convertNavTree(document.uri, result, item));
for (const item of response.body.childItems) {
TypeScriptDocumentSymbolProvider.convertNavTree(document.uri, result, item);
}
return result;
}
return undefined;
}
private static convertNavTree(resource: vscode.Uri, bucket: vscode.DocumentSymbol[], item: Proto.NavigationTree): boolean {
private static convertNavTree(
resource: vscode.Uri,
output: vscode.DocumentSymbol[],
item: Proto.NavigationTree,
): boolean {
let shouldInclude = TypeScriptDocumentSymbolProvider.shouldInclueEntry(item);
if (!shouldInclude && !item.childItems?.length) {
return false;
}
const children = new Set(item.childItems || []);
for (const span of item.spans) {
@@ -83,7 +88,7 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider
}
if (shouldInclude) {
bucket.push(symbolInfo);
output.push(symbolInfo);
}
}
@@ -98,7 +103,6 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,