Skip to content

Commit

Permalink
Merge pull request microsoft#3894 from tamayika/feature/json_docsym
Browse files Browse the repository at this point in the history
Change JSON symbol information to document symbol
  • Loading branch information
aeschli committed Dec 20, 2023
2 parents d8144cf + 84a181b commit dfca77d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 13 deletions.
45 changes: 34 additions & 11 deletions src/language/common/lspLanguageFeatures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,7 @@ function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit | null): languages.Workspac
//#region DocumentSymbolAdapter

export interface ILanguageWorkerWithDocumentSymbols {
findDocumentSymbols(uri: string): Promise<lsTypes.SymbolInformation[]>;
findDocumentSymbols(uri: string): Promise<lsTypes.SymbolInformation[] | lsTypes.DocumentSymbol[]>;
}

export class DocumentSymbolAdapter<T extends ILanguageWorkerWithDocumentSymbols>
Expand All @@ -671,25 +671,48 @@ export class DocumentSymbolAdapter<T extends ILanguageWorkerWithDocumentSymbols>
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:
Expand Down
4 changes: 2 additions & 2 deletions src/language/json/jsonWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,13 @@ export class JSONWorker {
async resetSchema(uri: string): Promise<boolean> {
return Promise.resolve(this._languageService.resetSchema(uri));
}
async findDocumentSymbols(uri: string): Promise<jsonService.SymbolInformation[]> {
async findDocumentSymbols(uri: string): Promise<jsonService.DocumentSymbol[]> {
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<jsonService.ColorInformation[]> {
Expand Down

0 comments on commit dfca77d

Please sign in to comment.