Skip to content

Commit

Permalink
perf: don't computed props, emits if no script content update
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Aug 20, 2021
1 parent a6001b3 commit 4af8f29
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 67 deletions.
18 changes: 5 additions & 13 deletions packages/vscode-vue-languageservice/src/languageService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -346,12 +346,8 @@ export function createLanguageService(
) {
const handler = {
async apply(target: (...args: any) => any, thisArg: any, argumentsList: Parameters<T>) {
if (typeof shouldUpdateTemplateScript === 'boolean') {
update(shouldUpdateTemplateScript);
}
else {
update(shouldUpdateTemplateScript.apply(null, argumentsList));
}
const _shouldUpdateTemplateScript = typeof shouldUpdateTemplateScript === 'boolean' ? shouldUpdateTemplateScript : shouldUpdateTemplateScript.apply(null, argumentsList);
update(_shouldUpdateTemplateScript);
return target.apply(thisArg, argumentsList);
}
};
Expand All @@ -367,12 +363,8 @@ export function createLanguageService(
for (const runningRequest of blockingRequests) {
await runningRequest;
}
if (typeof shouldUpdateTemplateScript === 'boolean') {
update(shouldUpdateTemplateScript);
}
else {
update(shouldUpdateTemplateScript.apply(null, argumentsList));
}
const _shouldUpdateTemplateScript = typeof shouldUpdateTemplateScript === 'boolean' ? shouldUpdateTemplateScript : shouldUpdateTemplateScript.apply(null, argumentsList);
update(_shouldUpdateTemplateScript);
const runner = target.apply(thisArg, argumentsList);
if (blockNewRequest && runner instanceof Promise) {
blockingRequests.add(runner);
Expand Down Expand Up @@ -486,7 +478,7 @@ export function createLanguageService(
}
: undefined,
getProjectVersion: () => {
return vueHost.getProjectVersion?.() + ':' + (lsType === 'template' ? templateProjectVersion : scriptProjectVersion);
return (lsType === 'template' ? templateProjectVersion : scriptProjectVersion).toString();
},
getScriptFileNames,
getScriptVersion,
Expand Down
49 changes: 13 additions & 36 deletions packages/vscode-vue-languageservice/src/services/completion.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as shared from '@volar/shared';
import { transformCompletionItem, transformCompletionList } from '@volar/transforms';
import { computed, ref } from '@vue/reactivity';
import { computed, pauseTracking, resetTracking, ref } from '@vue/reactivity';
import { camelize, capitalize, hyphenate, isGloballyWhitelisted } from '@vue/shared';
import type * as ts from 'typescript/lib/tsserverlibrary';
import * as path from 'upath';
Expand Down Expand Up @@ -85,7 +85,7 @@ export const eventModifiers: Record<string, string> = {
passive: 'attaches a DOM event with { passive: true }.',
};

export function register({ modules: { html, emmet }, sourceFiles, getTsLs, htmlLs, pugLs, getCssLs, jsonLs, documentContext, vueHost, templateTsLs }: ApiLanguageServiceContext) {
export function register({ modules: { html, emmet }, sourceFiles, getTsLs, htmlLs, pugLs, getCssLs, jsonLs, documentContext, vueHost, templateTsLs, scriptTsLs }: ApiLanguageServiceContext) {

const getEmbeddedDoc = getEmbeddedDocument.register(arguments[0]);
let cache: {
Expand Down Expand Up @@ -261,8 +261,7 @@ export function register({ modules: { html, emmet }, sourceFiles, getTsLs, htmlL
{ name: 'v-else', valueSet: 'v' },
{ name: 'v-for' },
];
const slots: html.IAttributeData[] = [];
for (const [_componentName, { item, bind, on, slot }] of componentCompletion) {
for (const [_componentName, { item, bind, on }] of componentCompletion) {
const componentNames =
nameCases.tag === 'kebabCase'
? new Set([hyphenate(_componentName)])
Expand Down Expand Up @@ -314,16 +313,6 @@ export function register({ modules: { html, emmet }, sourceFiles, getTsLs, htmlL
});
tsItems.set(propKey, event);
}
for (const _slot of slot) {
const data: Data = _slot.data;
const propName = '#' + data.name;
const propKey = componentName + ':' + propName;
slots.push({
name: propName,
description: propKey,
});
tsItems.set(propKey, _slot);
}
if (componentName !== '*') {
tags.push({
name: componentName,
Expand All @@ -336,10 +325,6 @@ export function register({ modules: { html, emmet }, sourceFiles, getTsLs, htmlL
}
}
}
tags.push({
name: 'template',
attributes: slots,
});
const descriptor = sourceFile.getDescriptor();
if (descriptor.script || descriptor.scriptSetup) {
for (const vueFile of sourceFiles.getAll()) {
Expand Down Expand Up @@ -605,24 +590,24 @@ export function register({ modules: { html, emmet }, sourceFiles, getTsLs, htmlL

const {
sfcTemplateScript,
sfcTemplate,
templateScriptData,
} = sourceFile.refs;

const templateTsProjectVersion = ref<string>();
const projectVersion = ref<string>();
const result = computed(() => {
{ // watching
templateTsProjectVersion.value;
projectVersion.value;
}
const data = new Map<string, { item: vscode.CompletionItem | undefined, bind: vscode.CompletionItem[], on: vscode.CompletionItem[], slot: vscode.CompletionItem[] }>();
if (sfcTemplateScript.textDocument.value && sfcTemplate.textDocument.value) {
const doc = sfcTemplateScript.textDocument.value;
const data = new Map<string, { item: vscode.CompletionItem | undefined, bind: vscode.CompletionItem[], on: vscode.CompletionItem[] }>();
pauseTracking();
const doc = sfcTemplateScript.textDocument.value;
resetTracking();
if (doc) {
const text = doc.getText();
for (const tag of templateScriptData.componentItems) {
const tagName = (tag.data as TsCompletionData).name;
let bind: vscode.CompletionItem[] = [];
let on: vscode.CompletionItem[] = [];
let slot: vscode.CompletionItem[] = [];
{
const searchText = `__VLS_componentPropsBase['${tagName}']['`;
let offset = text.indexOf(searchText);
Expand All @@ -639,23 +624,15 @@ export function register({ modules: { html, emmet }, sourceFiles, getTsLs, htmlL
on = templateTsLs.__internal__.doCompleteSync(doc.uri, doc.positionAt(offset));
}
}
{
const searchText = `__VLS_components_0['${tagName}'].__VLS_slots['`;
let offset = text.indexOf(searchText);
if (offset >= 0) {
offset += searchText.length;
slot = templateTsLs.__internal__.doCompleteSync(doc.uri, doc.positionAt(offset));
}
}
data.set(tagName, { item: tag, bind, on, slot });
data.set(tagName, { item: tag, bind, on });
}
const globalBind = templateTsLs.__internal__.doCompleteSync(doc.uri, doc.positionAt(doc.getText().indexOf(SearchTexts.GlobalAttrs)));
data.set('*', { item: undefined, bind: globalBind, on: [], slot: [] });
data.set('*', { item: undefined, bind: globalBind, on: [] });
}
return data;
});
return () => {
templateTsProjectVersion.value = templateTsLs.__internal__.host.getProjectVersion?.();
projectVersion.value = scriptTsLs.__internal__.host.getProjectVersion?.();
return result.value;
};
}
Expand Down
39 changes: 26 additions & 13 deletions packages/vscode-vue-languageservice/src/sourceFile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -437,20 +437,33 @@ export function createSourceFile(
const propNames = props.map(entry => (entry.data as TsCompletionData).name);
const setupReturnNames = setupReturns.map(entry => (entry.data as TsCompletionData).name);

if (shared.eqSet(new Set(contextNames), new Set(templateScriptData.context))
&& shared.eqSet(new Set(componentNames), new Set(templateScriptData.components))
&& shared.eqSet(new Set(propNames), new Set(templateScriptData.props))
&& shared.eqSet(new Set(setupReturnNames), new Set(templateScriptData.setupReturns))
) {
return false;
let dirty = false;

if (!shared.eqSet(new Set(contextNames), new Set(templateScriptData.context))) {
templateScriptData.context = contextNames;
dirty = true;
}

templateScriptData.context = contextNames;
templateScriptData.components = componentNames;
templateScriptData.props = propNames;
templateScriptData.setupReturns = setupReturnNames;
templateScriptData.componentItems = components;
sfcTemplateScript.update(); // TODO
return true;
if (!shared.eqSet(new Set(componentNames), new Set(templateScriptData.components))) {
templateScriptData.components = componentNames;
templateScriptData.componentItems = components;
dirty = true;
}

if (!shared.eqSet(new Set(propNames), new Set(templateScriptData.props))) {
templateScriptData.props = propNames;
dirty = true;
}

if (!shared.eqSet(new Set(setupReturnNames), new Set(templateScriptData.setupReturns))) {
templateScriptData.setupReturns = setupReturnNames;
dirty = true;
}

if (dirty) {
sfcTemplateScript.update(); // TODO
}

return dirty;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,6 @@ export function useSfcTemplateScript(
codeGen.addText(`// @ts-ignore\n`);
codeGen.addText(`__VLS_componentPropsBase['${name}'][''];\n`); // TODO
}
codeGen.addText('/* Completion: Slots */\n');
for (const name of templateCodeGens.value.usedComponents) {
codeGen.addText(`// @ts-ignore\n`);
codeGen.addText(`__VLS_components_0['${name}'].__VLS_slots[''];\n`); // TODO
}

/* CSS Module */
codeGen.addText('/* CSS Module */\n');
Expand Down

0 comments on commit 4af8f29

Please sign in to comment.