Skip to content

Commit 3e6393b

Browse files
committed
fix(language-service): more responsive .value insertion
1 parent 1d005d5 commit 3e6393b

20 files changed

+59
-80
lines changed

packages/language-service/lib/plugins/data.ts renamed to packages/language-service/lib/data.ts

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,34 @@ export function loadTemplateData(lang: string) {
88
let data: html.HTMLDataV1;
99

1010
if (lang === 'ja') {
11-
data = require('../../data/template/ja.json');
11+
data = require('../data/template/ja.json');
1212
}
1313
else if (lang === 'fr') {
14-
data = require('../../data/template/fr.json');
14+
data = require('../data/template/fr.json');
1515
}
1616
else if (lang === 'ko') {
17-
data = require('../../data/template/ko.json');
17+
data = require('../data/template/ko.json');
1818
}
1919
else if (lang === 'pt-br') {
20-
data = require('../../data/template/pt.json');
20+
data = require('../data/template/pt.json');
2121
}
2222
else if (lang === 'zh-cn') {
23-
data = require('../../data/template/zh-cn.json');
23+
data = require('../data/template/zh-cn.json');
2424
}
2525
else if (lang === 'zh-tw') {
26-
data = require('../../data/template/zh-hk.json');
26+
data = require('../data/template/zh-hk.json');
2727
}
2828
else if (lang === 'it') {
29-
data = require('../../data/template/it.json');
29+
data = require('../data/template/it.json');
3030
}
3131
else if (lang === 'cs') {
32-
data = require('../../data/template/cs.json');
32+
data = require('../data/template/cs.json');
3333
}
3434
else if (lang === 'ru') {
35-
data = require('../../data/template/ru.json');
35+
data = require('../data/template/ru.json');
3636
}
3737
else {
38-
data = require('../../data/template/en.json');
38+
data = require('../data/template/en.json');
3939
}
4040

4141
resolveReferences(data);
@@ -73,34 +73,34 @@ export function loadLanguageBlocks(lang: string): html.HTMLDataV1 {
7373
let data: html.HTMLDataV1;
7474

7575
if (lang === 'ja') {
76-
data = require('../../data/language-blocks/ja.json');
76+
data = require('../data/language-blocks/ja.json');
7777
}
7878
else if (lang === 'fr') {
79-
data = require('../../data/language-blocks/fr.json');
79+
data = require('../data/language-blocks/fr.json');
8080
}
8181
else if (lang === 'ko') {
82-
data = require('../../data/language-blocks/ko.json');
82+
data = require('../data/language-blocks/ko.json');
8383
}
8484
else if (lang === 'pt-br') {
85-
data = require('../../data/language-blocks/pt.json');
85+
data = require('../data/language-blocks/pt.json');
8686
}
8787
else if (lang === 'zh-cn') {
88-
data = require('../../data/language-blocks/zh-cn.json');
88+
data = require('../data/language-blocks/zh-cn.json');
8989
}
9090
else if (lang === 'zh-tw') {
91-
data = require('../../data/language-blocks/zh-hk.json');
91+
data = require('../data/language-blocks/zh-hk.json');
9292
}
9393
else if (lang === 'it') {
94-
data = require('../../data/language-blocks/it.json');
94+
data = require('../data/language-blocks/it.json');
9595
}
9696
else if (lang === 'cs') {
97-
data = require('../../data/language-blocks/cs.json');
97+
data = require('../data/language-blocks/cs.json');
9898
}
9999
else if (lang === 'ru') {
100-
data = require('../../data/language-blocks/ru.json');
100+
data = require('../data/language-blocks/ru.json');
101101
}
102102
else {
103-
data = require('../../data/language-blocks/en.json');
103+
data = require('../data/language-blocks/en.json');
104104
}
105105

106106
resolveReferences(data);
@@ -114,34 +114,34 @@ export function loadModelModifiersData(lang: string): html.HTMLDataV1 {
114114
let data: html.HTMLDataV1;
115115

116116
if (lang === 'ja') {
117-
data = require('../../data/model-modifiers/ja.json');
117+
data = require('../data/model-modifiers/ja.json');
118118
}
119119
else if (lang === 'fr') {
120-
data = require('../../data/model-modifiers/fr.json');
120+
data = require('../data/model-modifiers/fr.json');
121121
}
122122
else if (lang === 'ko') {
123-
data = require('../../data/model-modifiers/ko.json');
123+
data = require('../data/model-modifiers/ko.json');
124124
}
125125
else if (lang === 'pt-br') {
126-
data = require('../../data/model-modifiers/pt.json');
126+
data = require('../data/model-modifiers/pt.json');
127127
}
128128
else if (lang === 'zh-cn') {
129-
data = require('../../data/model-modifiers/zh-cn.json');
129+
data = require('../data/model-modifiers/zh-cn.json');
130130
}
131131
else if (lang === 'zh-tw') {
132-
data = require('../../data/model-modifiers/zh-hk.json');
132+
data = require('../data/model-modifiers/zh-hk.json');
133133
}
134134
else if (lang === 'it') {
135-
data = require('../../data/model-modifiers/it.json');
135+
data = require('../data/model-modifiers/it.json');
136136
}
137137
else if (lang === 'cs') {
138-
data = require('../../data/model-modifiers/cs.json');
138+
data = require('../data/model-modifiers/cs.json');
139139
}
140140
else if (lang === 'ru') {
141-
data = require('../../data/model-modifiers/ru.json');
141+
data = require('../data/model-modifiers/ru.json');
142142
}
143143
else {
144-
data = require('../../data/model-modifiers/en.json');
144+
data = require('../data/model-modifiers/en.json');
145145
}
146146

147147
resolveReferences(data);
@@ -150,7 +150,7 @@ export function loadModelModifiersData(lang: string): html.HTMLDataV1 {
150150
}
151151

152152
function resolveReferences(data: html.HTMLDataV1) {
153-
locale ??= require('../../data/locale.json');
153+
locale ??= require('../data/locale.json');
154154

155155
for (
156156
const item of [

packages/language-service/lib/plugins/css.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { LanguageServicePlugin, TextDocument, VirtualCode } from '@volar/la
22
import { isRenameEnabled } from '@vue/language-core';
33
import { create as baseCreate, type Provide } from 'volar-service-css';
44
import type * as css from 'vscode-css-languageservice';
5-
import { getEmbeddedInfo } from './utils';
5+
import { getEmbeddedInfo } from '../utils';
66

77
export function create(): LanguageServicePlugin {
88
const base = baseCreate({ scssDocumentSelector: ['scss', 'postcss'] });

packages/language-service/lib/plugins/typescript-semantic-tokens.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { LanguageServicePlugin } from '@volar/language-service';
22
import { convertClassificationsToSemanticTokens } from 'volar-service-typescript/lib/semanticFeatures/semanticTokens';
3-
import { getEmbeddedInfo } from './utils';
3+
import { getEmbeddedInfo } from '../utils';
44

55
export function create(
66
{ getEncodedSemanticClassifications }: import('@vue/typescript-plugin/lib/requests').Requests,

packages/language-service/lib/plugins/vue-autoinsert-dotvalue.ts

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { LanguageServicePlugin, TextDocument } from '@volar/language-service';
22
import { hyphenateAttr } from '@vue/language-core';
33
import type * as ts from 'typescript';
4-
import { getEmbeddedInfo, sleep } from './utils';
4+
import { getEmbeddedInfo } from '../utils';
55

66
export function create(
77
ts: typeof import('typescript'),
@@ -16,8 +16,6 @@ export function create(
1616
},
1717
},
1818
create(context) {
19-
let currentReq = 0;
20-
2119
return {
2220
async provideAutoInsertSnippet(document, selection, change) {
2321
const info = getEmbeddedInfo(context, document, id => id.startsWith('script_'));
@@ -34,37 +32,27 @@ export function create(
3432
return;
3533
}
3634

37-
const req = ++currentReq;
38-
// Wait for tsserver to sync
39-
await sleep(250);
40-
if (req !== currentReq) {
41-
return;
42-
}
43-
44-
const enabled = await context.env.getConfiguration<boolean>?.('vue.autoInsert.dotValue') ?? true;
45-
if (!enabled) {
46-
return;
47-
}
35+
let sourceOffset: number | undefined;
4836

4937
const { sourceScript, virtualCode, root } = info;
50-
5138
const { sfc } = root;
52-
const blocks = [sfc.script, sfc.scriptSetup].filter(block => !!block);
53-
if (!blocks.length) {
39+
const scriptBlocks = [sfc.script, sfc.scriptSetup].filter(block => !!block);
40+
const map = context.language.maps.get(virtualCode, sourceScript);
41+
42+
if (!scriptBlocks.length) {
5443
return;
5544
}
5645

57-
let sourceOffset: number | undefined;
58-
const map = context.language.maps.get(virtualCode, sourceScript);
5946
for (const [offset] of map.toSourceLocation(document.offsetAt(selection))) {
6047
sourceOffset = offset;
6148
break;
6249
}
50+
6351
if (sourceOffset === undefined) {
6452
return;
6553
}
6654

67-
for (const { ast, startTagEnd, endTagStart } of blocks) {
55+
for (const { ast, startTagEnd, endTagStart } of scriptBlocks) {
6856
if (sourceOffset < startTagEnd || sourceOffset > endTagStart) {
6957
continue;
7058
}

packages/language-service/lib/plugins/vue-autoinsert-space.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,10 @@ export function create(): LanguageServicePlugin {
99
configurationSections: ['vue.autoInsert.bracketSpacing'],
1010
},
1111
},
12-
create(context) {
12+
create() {
1313
return {
14-
async provideAutoInsertSnippet(document, selection, change) {
14+
provideAutoInsertSnippet(document, selection, change) {
1515
if (document.languageId === 'html' || document.languageId === 'jade') {
16-
const enabled = await context.env.getConfiguration<boolean>?.('vue.autoInsert.bracketSpacing') ?? true;
17-
if (!enabled) {
18-
return;
19-
}
20-
2116
if (
2217
change.text === '{}'
2318
&& document.getText().slice(change.rangeOffset - 1, change.rangeOffset + 3) === '{{}}'

packages/language-service/lib/plugins/vue-compiler-dom-errors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Diagnostic, DiagnosticSeverity, LanguageServicePlugin } from '@volar/language-service';
2-
import { getEmbeddedInfo } from './utils';
2+
import { getEmbeddedInfo } from '../utils';
33

44
export function create(): LanguageServicePlugin {
55
return {

packages/language-service/lib/plugins/vue-component-semantic-tokens.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { LanguageServicePlugin, SemanticToken } from '@volar/language-service';
22
import { forEachElementNode, hyphenateTag } from '@vue/language-core';
33
import type * as ts from 'typescript';
4-
import { getEmbeddedInfo } from './utils';
4+
import { getEmbeddedInfo } from '../utils';
55

66
export function create(
77
{ getComponentNames, getElementNames }: import('@vue/typescript-plugin/lib/requests').Requests,

packages/language-service/lib/plugins/vue-document-drop.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { getUserPreferences } from 'volar-service-typescript/lib/configs/getUser
66
import { URI } from 'vscode-uri';
77
import { checkCasing, TagNameCasing } from '../nameCasing';
88
import { createAddComponentToOptionEdit, getLastImportNode } from '../plugins/vue-extract-file';
9-
import { getEmbeddedInfo } from './utils';
9+
import { getEmbeddedInfo } from '../utils';
1010

1111
export function create(
1212
ts: typeof import('typescript'),

packages/language-service/lib/plugins/vue-document-highlights.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { DocumentHighlightKind, LanguageServicePlugin } from '@volar/language-service';
2-
import { getEmbeddedInfo } from './utils';
2+
import { getEmbeddedInfo } from '../utils';
33

44
export function create(
55
{ getDocumentHighlights }: import('@vue/typescript-plugin/lib/requests').Requests,

packages/language-service/lib/plugins/vue-extract-file.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { ExpressionNode, TemplateChildNode } from '@vue/compiler-dom';
33
import { type Sfc, tsCodegen } from '@vue/language-core';
44
import type * as ts from 'typescript';
55
import { URI } from 'vscode-uri';
6-
import { getEmbeddedInfo } from './utils';
6+
import { getEmbeddedInfo } from '../utils';
77

88
interface ActionData {
99
uri: string;

0 commit comments

Comments
 (0)