Browse Source

Merge pull request #3894 from tamayika/feature/json_docsym

Change JSON symbol information to document symbol
Martin Aeschlimann 1 year ago
parent
commit
dfca77d071
2 changed files with 36 additions and 13 deletions
  1. 34 11
      src/language/common/lspLanguageFeatures.ts
  2. 2 2
      src/language/json/jsonWorker.ts

+ 34 - 11
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<lsTypes.SymbolInformation[]>;
+	findDocumentSymbols(uri: string): Promise<lsTypes.SymbolInformation[] | lsTypes.DocumentSymbol[]>;
 }
 
 export class DocumentSymbolAdapter<T extends ILanguageWorkerWithDocumentSymbols>
@@ -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:

+ 2 - 2
src/language/json/jsonWorker.ts

@@ -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[]> {