diff --git a/packages/language-service/src/documentFeatures/selectionRanges.ts b/packages/language-service/src/documentFeatures/selectionRanges.ts index 14c1dab0f..4025894dd 100644 --- a/packages/language-service/src/documentFeatures/selectionRanges.ts +++ b/packages/language-service/src/documentFeatures/selectionRanges.ts @@ -13,12 +13,35 @@ export function register(context: DocumentServiceRuntimeContext) { context, document, positions, - sourceMap => !!sourceMap.embeddedFile.capabilities.foldingRange, - (positions, sourceMap) => [positions - .map(position => sourceMap.toGeneratedPosition(position)) - .filter(shared.notEmpty)], - (plugin, document, positions) => positions.length ? plugin.getSelectionRanges?.(document, positions) : undefined, + sourceMap => !!sourceMap.embeddedFile.capabilities.documentFormatting, + (positions, sourceMap) => { + const result = positions + .map(position => sourceMap.toGeneratedPosition(position)) + .filter(shared.notEmpty); + if (result.length) { + return [result]; + } + return []; + }, + (plugin, document, positions) => plugin.getSelectionRanges?.(document, positions), (item, sourceMap) => transformSelectionRanges(item, range => sourceMap.toSourceRange(range)), + results => { + for (let i = 0; i < results[0].length; i++) { + const first = results[0][i]; + let lastParent = first; + while (lastParent.parent) { + lastParent = lastParent.parent; + } + for (let j = 1; j < results.length; j++) { + const other = results[j][i]; + lastParent.parent = other; + while (lastParent.parent) { + lastParent = lastParent.parent; + } + } + } + return results[0]; + }, ); }; } diff --git a/packages/language-service/src/utils/featureWorkers.ts b/packages/language-service/src/utils/featureWorkers.ts index 7ed139435..f3b3a8711 100644 --- a/packages/language-service/src/utils/featureWorkers.ts +++ b/packages/language-service/src/utils/featureWorkers.ts @@ -29,7 +29,7 @@ export async function documentArgFeatureWorker( document: TextDocument, arg: K, isValidSourceMap: (sourceMap: EmbeddedDocumentSourceMap) => boolean, - transformArg: (arg: K, sourceMap: EmbeddedDocumentSourceMap) => Generator | [K], + transformArg: (arg: K, sourceMap: EmbeddedDocumentSourceMap) => Generator | K[], worker: (plugin: LanguageServicePlugin, document: TextDocument, arg: K) => T, transform: (result: NonNullable>, sourceMap: EmbeddedDocumentSourceMap) => T | undefined, combineResult?: (results: NonNullable>[]) => NonNullable>,