diff --git a/src/language/common/lspLanguageFeatures.ts b/src/language/common/lspLanguageFeatures.ts index 48982dafeb..7197a2d263 100644 --- a/src/language/common/lspLanguageFeatures.ts +++ b/src/language/common/lspLanguageFeatures.ts @@ -651,7 +651,7 @@ function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit | null): languages.Workspac //#region DocumentSymbolAdapter export interface ILanguageWorkerWithDocumentSymbols { - findDocumentSymbols(uri: string): Promise; + findDocumentSymbols(uri: string): Promise; } export class DocumentSymbolAdapter @@ -671,25 +671,48 @@ export class DocumentSymbolAdapter if (!items) { return; } - return items.map((item) => ({ - name: item.name, - detail: '', - containerName: item.containerName, - kind: toSymbolKind(item.kind), - range: toRange(item.location.range), - selectionRange: toRange(item.location.range), - tags: [] - })); + return items.map((item) => { + if (isDocumentSymbol(item)) { + return toDocumentSymbol(item); + } + return { + name: item.name, + detail: '', + containerName: item.containerName, + kind: toSymbolKind(item.kind), + range: toRange(item.location.range), + selectionRange: toRange(item.location.range), + tags: [] + }; + }); }); } } +function isDocumentSymbol( + symbol: lsTypes.SymbolInformation | lsTypes.DocumentSymbol +): symbol is lsTypes.DocumentSymbol { + return 'children' in symbol; +} + +function toDocumentSymbol(symbol: lsTypes.DocumentSymbol): languages.DocumentSymbol { + return { + name: symbol.name, + detail: symbol.detail ?? '', + kind: toSymbolKind(symbol.kind), + range: toRange(symbol.range), + selectionRange: toRange(symbol.selectionRange), + tags: symbol.tags ?? [], + children: (symbol.children ?? []).map((item) => toDocumentSymbol(item)) + }; +} + function toSymbolKind(kind: lsTypes.SymbolKind): languages.SymbolKind { let mKind = languages.SymbolKind; switch (kind) { case lsTypes.SymbolKind.File: - return mKind.Array; + return mKind.File; case lsTypes.SymbolKind.Module: return mKind.Module; case lsTypes.SymbolKind.Namespace: diff --git a/src/language/json/jsonWorker.ts b/src/language/json/jsonWorker.ts index c8f0cf8833..02900d80c3 100644 --- a/src/language/json/jsonWorker.ts +++ b/src/language/json/jsonWorker.ts @@ -85,13 +85,13 @@ export class JSONWorker { async resetSchema(uri: string): Promise { return Promise.resolve(this._languageService.resetSchema(uri)); } - async findDocumentSymbols(uri: string): Promise { + async findDocumentSymbols(uri: string): Promise { let document = this._getTextDocument(uri); if (!document) { return []; } let jsonDocument = this._languageService.parseJSONDocument(document); - let symbols = this._languageService.findDocumentSymbols(document, jsonDocument); + let symbols = this._languageService.findDocumentSymbols2(document, jsonDocument); return Promise.resolve(symbols); } async findDocumentColors(uri: string): Promise {