Skip to content

Commit 5a1a41a

Browse files
committed
feat: Speed up a bit JSX linked editing by simply caching previous response
1 parent 9bf21eb commit 5a1a41a

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

src/configurationType.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,12 @@ export type Configuration = {
582582
* @default false
583583
*/
584584
'experiments.enableInsertNameOfSuggestionFix': boolean
585+
/**
586+
* Speed up JSX linked editing by not using actual tsserver command when possible, which in theory may introduce some inconsistencies.
587+
* Note that currently it doesn't really help if you have `"typescript.tsserver.useSyntaxServer": "auto"` in the settings.
588+
* @default true
589+
*/
590+
'experiments.speedLinkedEditing': boolean
585591
/**
586592
* Map *symbol - array of modules* to change sorting of imports - first available takes precedence in auto import code fixes (+ import all action)
587593
*
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { GetConfig } from './types'
2+
3+
export default (proxy: ts.LanguageService, languageService: ts.LanguageService, languageServiceHost: ts.LanguageServiceHost, c: GetConfig) => {
4+
// patch JSX tag linked editing to improve performance (needed for great user experience)
5+
6+
let lastLinkedEditingRangeRequest:
7+
| {
8+
pos: number
9+
fileName: string
10+
result: ts.LinkedEditingInfo
11+
}
12+
| undefined
13+
proxy.getLinkedEditingRangeAtPosition = (fileName, position) => {
14+
if (
15+
c('experiments.speedLinkedEditing') &&
16+
lastLinkedEditingRangeRequest &&
17+
lastLinkedEditingRangeRequest.pos === position - 1 &&
18+
lastLinkedEditingRangeRequest.fileName === fileName
19+
) {
20+
lastLinkedEditingRangeRequest.pos = position
21+
lastLinkedEditingRangeRequest.result.ranges[0]!.length++
22+
lastLinkedEditingRangeRequest.result.ranges[1]!.start++
23+
lastLinkedEditingRangeRequest.result.ranges[1]!.length++
24+
return lastLinkedEditingRangeRequest.result
25+
}
26+
lastLinkedEditingRangeRequest = undefined
27+
28+
const prior = languageService.getLinkedEditingRangeAtPosition(fileName, position)
29+
if (!prior) return
30+
lastLinkedEditingRangeRequest = {
31+
pos: position,
32+
fileName,
33+
result: globalThis.structuredClone(prior),
34+
}
35+
return prior
36+
}
37+
}

typescript/src/decorateProxy.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import decorateSignatureHelp from './decorateSignatureHelp'
1919
import decorateFindRenameLocations from './decorateFindRenameLocations'
2020
import decorateQuickInfoAtPosition from './decorateQuickInfoAtPosition'
2121
import decorateEditsForFileRename from './decorateEditsForFileRename'
22+
import decorateLinkedEditing from './decorateLinkedEditing'
2223

2324
/** @internal */
2425
export const thisPluginMarker = '__essentialPluginsMarker__'
@@ -102,6 +103,7 @@ export const decorateLanguageService = (
102103
decorateSignatureHelp(proxy, languageService, languageServiceHost, c)
103104
decorateFindRenameLocations(proxy, languageService, c)
104105
decorateQuickInfoAtPosition(proxy, languageService, languageServiceHost, c)
106+
decorateLinkedEditing(proxy, languageService, languageServiceHost, c)
105107

106108
libDomPatching(languageServiceHost, c)
107109

0 commit comments

Comments
 (0)