From 588dceaf835a4b7a939634d242fd4cedd098ce84 Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Fri, 30 Aug 2024 16:03:14 +0200 Subject: [PATCH] fix(typescript): fix inlay hints mapping for large chunks of source code mapped verbatim to generated code. --- .../lib/node/proxyLanguageService.ts | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/typescript/lib/node/proxyLanguageService.ts b/packages/typescript/lib/node/proxyLanguageService.ts index d03fc0f9..eba7de52 100644 --- a/packages/typescript/lib/node/proxyLanguageService.ts +++ b/packages/typescript/lib/node/proxyLanguageService.ts @@ -936,14 +936,29 @@ function provideInlayHints(language: Language, provideInlayHints: ts.Lan if (serviceScript) { let start: number | undefined; let end: number | undefined; - const map = language.maps.get(serviceScript.code, targetScript); + const map = language.maps.get(serviceScript.code, sourceScript); for (const mapping of map.mappings) { - if (isInlayHintsEnabled(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) { - start ??= mapping.generatedOffsets[0]; - end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1]; - start = Math.min(start, mapping.generatedOffsets[0]); - end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1]); + if (!isInlayHintsEnabled(mapping.data)) { + continue; + } + let mappingStart = mapping.sourceOffsets[0]; + let genStart: number | undefined; + let genEnd: number | undefined; + if (mappingStart >= span.start && mappingStart <= span.start + span.length) { + genStart = mapping.generatedOffsets[0]; + genEnd = mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + + (mapping.generatedLengths ?? mapping.lengths)[mapping.generatedOffsets.length - 1]; + } else if (mappingStart < span.start && span.start < mappingStart + mapping.lengths[0] + && mapping.sourceOffsets.length == 1 + && (!mapping.generatedLengths || mapping.generatedLengths[0] === mapping.lengths[0]) + ) { + genStart = mapping.generatedOffsets[0] + span.start - mappingStart + genEnd = Math.min(genStart + span.length, mapping.generatedOffsets[0] + mapping.lengths[0]) + } else { + continue; } + start = Math.min(start ?? genStart, genStart); + end = Math.max(end ?? genEnd, genEnd); } if (start === undefined || end === undefined) { start = 0;