From 82223ed2677c4c6d7ff451669d91eb2ffdfe9a3a Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Wed, 6 Nov 2024 18:23:29 +0800 Subject: [PATCH 1/9] feat: support global directives completion --- .../language-core/lib/codegen/globalTypes.ts | 3 ++ .../lib/codegen/script/template.ts | 2 +- .../lib/plugins/vue-template.ts | 42 +++++++------------ packages/typescript-plugin/lib/client.ts | 9 ++++ .../lib/requests/componentInfos.ts | 22 +++++++++- packages/typescript-plugin/lib/server.ts | 7 +++- 6 files changed, 54 insertions(+), 31 deletions(-) diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index 9908372d43..5303d467c3 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -83,6 +83,9 @@ export function generateGlobalTypes(lib: string, target: number, strictTemplates > >; type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; + type __VLS_PickDirectives = { + [K in keyof T as K extends \`v\${infer N}\` ? N extends Capitalize ? K : never : never]: T[K]; + }; type __VLS_PickFunctionalComponentCtx = NonNullable<__VLS_PickNotAny< '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: infer Ctx } ? Ctx : never : any , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index b9524dbd66..88c032dda4 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -94,7 +94,7 @@ export function* generateTemplateDirectives(options: ScriptCodegenOptions): Gene } exps.push(`{} as NonNullable`); - exps.push(`__VLS_ctx`); + exps.push(`{} as __VLS_PickDirectives`); yield `const __VLS_localDirectives = {${newLine}`; for (const type of exps) { diff --git a/packages/language-service/lib/plugins/vue-template.ts b/packages/language-service/lib/plugins/vue-template.ts index afef4331ad..3038228b9e 100644 --- a/packages/language-service/lib/plugins/vue-template.ts +++ b/packages/language-service/lib/plugins/vue-template.ts @@ -1,5 +1,5 @@ import type { Disposable, LanguageServiceContext, LanguageServicePluginInstance } from '@volar/language-service'; -import { VueCompilerOptions, VueVirtualCode, hyphenateAttr, hyphenateTag, parseScriptSetupRanges, tsCodegen } from '@vue/language-core'; +import { VueCompilerOptions, VueVirtualCode, hyphenateAttr, hyphenateTag, parseScriptSetupRanges } from '@vue/language-core'; import { camelize, capitalize } from '@vue/shared'; import { getComponentSpans } from '@vue/typescript-plugin/lib/common'; import { create as createHtmlService } from 'volar-service-html'; @@ -456,11 +456,11 @@ export function create( attrs: string[]; propsInfo: { name: string, commentMarkdown: string; }[]; events: string[]; + directives: string[]; }>(); let version = 0; let components: string[] | undefined; - let templateContextProps: string[] | undefined; tsDocumentations.clear(); @@ -527,46 +527,25 @@ export function create( const attrs = await tsPluginClient?.getElementAttrs(vueCode.fileName, tag) ?? []; const propsInfo = await tsPluginClient?.getComponentProps(vueCode.fileName, tag) ?? []; const events = await tsPluginClient?.getComponentEvents(vueCode.fileName, tag) ?? []; + const directives = await tsPluginClient?.getComponentDirectives(vueCode.fileName) ?? []; tagInfos.set(tag, { attrs, propsInfo: propsInfo.filter(prop => !prop.name.startsWith('ref_') ), events, + directives: directives.filter(name => + !['vBind', 'vIf', 'vOn', 'VOnce', 'vShow', 'VSlot'].includes(name) + ), }); version++; })()); return []; } - const { attrs, propsInfo, events } = tagInfo; + const { attrs, propsInfo, events, directives } = tagInfo; const props = propsInfo.map(prop => prop.name); const attributes: html.IAttributeData[] = []; - const _tsCodegen = tsCodegen.get(vueCode._sfc); - - if (_tsCodegen) { - if (!templateContextProps) { - promises.push((async () => { - templateContextProps = await tsPluginClient?.getTemplateContextProps(vueCode.fileName) ?? []; - version++; - })()); - return []; - } - let ctxVars = [ - ..._tsCodegen.scriptRanges.get()?.bindings.map(binding => vueCode._sfc.script!.content.slice(binding.start, binding.end)) ?? [], - ..._tsCodegen.scriptSetupRanges.get()?.bindings.map(binding => vueCode._sfc.scriptSetup!.content.slice(binding.start, binding.end)) ?? [], - ...templateContextProps, - ]; - ctxVars = [...new Set(ctxVars)]; - const dirs = ctxVars.map(hyphenateAttr).filter(v => v.startsWith('v-')); - for (const dir of dirs) { - attributes.push( - { - name: dir, - } - ); - } - } const propsSet = new Set(props); @@ -642,6 +621,13 @@ export function create( ); } + for (const directive of directives) { + const name = hyphenateAttr(directive); + attributes.push({ + name + }); + } + const models: [boolean, string][] = []; for (const prop of [...props, ...attrs]) { diff --git a/packages/typescript-plugin/lib/client.ts b/packages/typescript-plugin/lib/client.ts index ce8d82db99..bcba34e45c 100644 --- a/packages/typescript-plugin/lib/client.ts +++ b/packages/typescript-plugin/lib/client.ts @@ -57,6 +57,15 @@ export function getComponentEvents( }); } +export function getComponentDirectives( + ...args: Parameters +) { + return sendRequest>({ + type: 'getComponentDirectives', + args, + }); +} + export function getTemplateContextProps( ...args: Parameters ) { diff --git a/packages/typescript-plugin/lib/requests/componentInfos.ts b/packages/typescript-plugin/lib/requests/componentInfos.ts index 9436fd9255..c7d1d6103f 100644 --- a/packages/typescript-plugin/lib/requests/componentInfos.ts +++ b/packages/typescript-plugin/lib/requests/componentInfos.ts @@ -160,6 +160,24 @@ export function getComponentEvents( return [...result]; } +export function getComponentDirectives( + this: RequestContext, + fileName: string +) { + const { typescript: ts, language, languageService, getFileId } = this; + const volarFile = language.scripts.get(getFileId(fileName)); + if (!(volarFile?.generated?.root instanceof vue.VueVirtualCode)) { + return; + } + const vueCode = volarFile.generated.root; + const directives = getVariableType(ts, languageService, vueCode, '__VLS_directives'); + if (!directives) { + return []; + } + + return directives.type.getProperties().map(({ name }) => name); +} + export function getTemplateContextProps( this: RequestContext, fileName: string @@ -225,7 +243,9 @@ export function getElementAttrs( if (tsSourceFile = program.getSourceFile(fileName)) { - const typeNode = tsSourceFile.statements.find((node): node is ts.TypeAliasDeclaration => ts.isTypeAliasDeclaration(node) && node.name.getText() === '__VLS_IntrinsicElementsCompletion'); + const typeNode = tsSourceFile.statements + .filter(ts.isTypeAliasDeclaration) + .find(node => node.name.getText() === '__VLS_IntrinsicElementsCompletion'); const checker = program.getTypeChecker(); if (checker && typeNode) { diff --git a/packages/typescript-plugin/lib/server.ts b/packages/typescript-plugin/lib/server.ts index c3b83c3f5c..f309dbfe10 100644 --- a/packages/typescript-plugin/lib/server.ts +++ b/packages/typescript-plugin/lib/server.ts @@ -3,7 +3,7 @@ import * as fs from 'node:fs'; import * as net from 'node:net'; import type * as ts from 'typescript'; import { collectExtractProps } from './requests/collectExtractProps'; -import { getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from './requests/componentInfos'; +import { getComponentDirectives, getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from './requests/componentInfos'; import { getImportPathForFile } from './requests/getImportPathForFile'; import { getPropertiesAtLocation } from './requests/getPropertiesAtLocation'; import { getQuickInfoAtPosition } from './requests/getQuickInfoAtPosition'; @@ -20,6 +20,7 @@ export interface Request { // Component Infos | 'getComponentProps' | 'getComponentEvents' + | 'getComponentDirectives' | 'getTemplateContextProps' | 'getComponentNames' | 'getElementAttrs'; @@ -92,6 +93,10 @@ export async function startNamedPipeServer( const result = getComponentEvents.apply(requestContext, request.args as any); sendResponse(result); } + else if (request.type === 'getComponentDirectives') { + const result = getComponentDirectives.apply(requestContext, request.args as any); + sendResponse(result); + } else if (request.type === 'getTemplateContextProps') { const result = getTemplateContextProps.apply(requestContext, request.args as any); sendResponse(result); From 1662d0a68a0c45a094e0f8688d1ec2eeadcd923a Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Wed, 6 Nov 2024 18:33:12 +0800 Subject: [PATCH 2/9] fix: missing type --- packages/language-service/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/language-service/index.ts b/packages/language-service/index.ts index 237444e3d5..d239b95dec 100644 --- a/packages/language-service/index.ts +++ b/packages/language-service/index.ts @@ -31,7 +31,7 @@ import { create as createVueTwoslashQueriesPlugin } from './lib/plugins/vue-twos import { parse, VueCompilerOptions } from '@vue/language-core'; import { proxyLanguageServiceForVue } from '@vue/typescript-plugin/lib/common'; import { collectExtractProps } from '@vue/typescript-plugin/lib/requests/collectExtractProps'; -import { getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from '@vue/typescript-plugin/lib/requests/componentInfos'; +import { getComponentDirectives, getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from '@vue/typescript-plugin/lib/requests/componentInfos'; import { getImportPathForFile } from '@vue/typescript-plugin/lib/requests/getImportPathForFile'; import { getPropertiesAtLocation } from '@vue/typescript-plugin/lib/requests/getPropertiesAtLocation'; import type { RequestContext } from '@vue/typescript-plugin/lib/requests/types'; @@ -118,6 +118,9 @@ export function getFullLanguageServicePlugins( async getComponentEvents(...args) { return await getComponentEvents.apply(requestContext, args); }, + async getComponentDirectives(...args) { + return await getComponentDirectives.apply(requestContext, args); + }, async getComponentNames(...args) { return await getComponentNames.apply(requestContext, args); }, From 219a7c0494495ef586d0efff8365af7b836848d6 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Sat, 21 Dec 2024 00:06:10 +0800 Subject: [PATCH 3/9] refactor: simplify ts plugin request declaration --- packages/language-service/index.ts | 18 ++-- packages/typescript-plugin/lib/client.ts | 114 +++++++---------------- 2 files changed, 43 insertions(+), 89 deletions(-) diff --git a/packages/language-service/index.ts b/packages/language-service/index.ts index d239b95dec..43fd1e5368 100644 --- a/packages/language-service/index.ts +++ b/packages/language-service/index.ts @@ -107,31 +107,31 @@ export function getFullLanguageServicePlugins( }; return { async collectExtractProps(...args) { - return await collectExtractProps.apply(requestContext, args); + return collectExtractProps.apply(requestContext, args); }, async getPropertiesAtLocation(...args) { - return await getPropertiesAtLocation.apply(requestContext, args); + return getPropertiesAtLocation.apply(requestContext, args); }, async getImportPathForFile(...args) { - return await getImportPathForFile.apply(requestContext, args); + return getImportPathForFile.apply(requestContext, args); }, async getComponentEvents(...args) { - return await getComponentEvents.apply(requestContext, args); + return getComponentEvents.apply(requestContext, args); }, async getComponentDirectives(...args) { - return await getComponentDirectives.apply(requestContext, args); + return getComponentDirectives.apply(requestContext, args); }, async getComponentNames(...args) { - return await getComponentNames.apply(requestContext, args); + return getComponentNames.apply(requestContext, args); }, async getComponentProps(...args) { - return await getComponentProps.apply(requestContext, args); + return getComponentProps.apply(requestContext, args); }, async getElementAttrs(...args) { - return await getElementAttrs.apply(requestContext, args); + return getElementAttrs.apply(requestContext, args); }, async getTemplateContextProps(...args) { - return await getTemplateContextProps.apply(requestContext, args); + return getTemplateContextProps.apply(requestContext, args); }, async getQuickInfoAtPosition(fileName, position) { const languageService = context.getLanguageService(); diff --git a/packages/typescript-plugin/lib/client.ts b/packages/typescript-plugin/lib/client.ts index 1daa4fdafb..5c0e1ba58f 100644 --- a/packages/typescript-plugin/lib/client.ts +++ b/packages/typescript-plugin/lib/client.ts @@ -1,82 +1,39 @@ import type { RequestData } from './server'; import { getBestServer } from './utils'; -export function collectExtractProps( - ...args: Parameters -) { - return sendRequest>( - 'collectExtractProps', - ...args - ); -} +export const collectExtractProps = createRequest< + typeof import('./requests/collectExtractProps.js')['collectExtractProps'] +>('collectExtractProps'); -export async function getImportPathForFile( - ...args: Parameters -) { - return await sendRequest>( - 'getImportPathForFile', - ...args - ); -} +export const getImportPathForFile = createRequest< + typeof import('./requests/getImportPathForFile.js')['getImportPathForFile'] +>('getImportPathForFile'); -export async function getPropertiesAtLocation( - ...args: Parameters -) { - return await sendRequest>( - 'getPropertiesAtLocation', - ...args - ); -} +export const getPropertiesAtLocation = createRequest< + typeof import('./requests/getPropertiesAtLocation.js')['getPropertiesAtLocation'] +>('getPropertiesAtLocation'); -export function getQuickInfoAtPosition( - ...args: Parameters -) { - return sendRequest>( - 'getQuickInfoAtPosition', - ...args - ); -} +export const getQuickInfoAtPosition = createRequest< + typeof import('./requests/getQuickInfoAtPosition.js')['getQuickInfoAtPosition'] +>('getQuickInfoAtPosition'); // Component Infos -export async function getComponentProps(fileName: string, componentName: string) { - const server = await getBestServer(fileName); - if (!server) { - return; - } - const componentAndProps = await server.componentNamesAndProps.get(fileName); - if (!componentAndProps) { - return; - } - return componentAndProps[componentName]; -} +export const getComponentProps = createRequest< + typeof import('./requests/componentInfos.js')['getComponentProps'] +>('getComponentProps'); -export function getComponentEvents( - ...args: Parameters -) { - return sendRequest>( - 'getComponentEvents', - ...args - ); -} +export const getComponentEvents = createRequest< + typeof import('./requests/componentInfos.js')['getComponentEvents'] +>('getComponentEvents'); -export function getComponentDirectives( - ...args: Parameters -) { - return sendRequest>( - 'getComponentDirectives', - ...args - ); -} +export const getComponentDirectives = createRequest< + typeof import('./requests/componentInfos.js')['getComponentDirectives'] +>('getComponentDirectives'); -export function getTemplateContextProps( - ...args: Parameters -) { - return sendRequest>( - 'getTemplateContextProps', - ...args - ); -} +export const getTemplateContextProps = createRequest< + typeof import('./requests/componentInfos.js')['getTemplateContextProps'] +>('getTemplateContextProps'); export async function getComponentNames(fileName: string) { const server = await getBestServer(fileName); @@ -90,19 +47,16 @@ export async function getComponentNames(fileName: string) { return Object.keys(componentAndProps); } -export function getElementAttrs( - ...args: Parameters -) { - return sendRequest>( - 'getElementAttrs', - ...args - ); -} +export const getElementAttrs = createRequest< + typeof import('./requests/componentInfos.js')['getElementAttrs'] +>('getElementAttrs'); -async function sendRequest(requestType: RequestData[1], fileName: string, ...rest: any[]) { - const server = await getBestServer(fileName); - if (!server) { - return; +function createRequest any>(requestType: RequestData[1]) { + return async function(...[fileName, ...rest]: Parameters) { + const server = await getBestServer(fileName); + if (!server) { + return; + } + return server.request>(requestType, fileName, ...rest); } - return server.request(requestType, fileName, ...rest); } From b34de73dc5543527c750d2f1dbf962ffbef70097 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 21 Dec 2024 07:02:41 +0800 Subject: [PATCH 4/9] revert getComponentProps --- packages/typescript-plugin/lib/client.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/typescript-plugin/lib/client.ts b/packages/typescript-plugin/lib/client.ts index 5c0e1ba58f..b861a8a4fd 100644 --- a/packages/typescript-plugin/lib/client.ts +++ b/packages/typescript-plugin/lib/client.ts @@ -19,9 +19,17 @@ export const getQuickInfoAtPosition = createRequest< // Component Infos -export const getComponentProps = createRequest< - typeof import('./requests/componentInfos.js')['getComponentProps'] ->('getComponentProps'); +export async function getComponentProps(fileName: string, componentName: string) { + const server = await getBestServer(fileName); + if (!server) { + return; + } + const componentAndProps = server.componentNamesAndProps.get(fileName); + if (!componentAndProps) { + return; + } + return componentAndProps[componentName]; +} export const getComponentEvents = createRequest< typeof import('./requests/componentInfos.js')['getComponentEvents'] @@ -52,11 +60,11 @@ export const getElementAttrs = createRequest< >('getElementAttrs'); function createRequest any>(requestType: RequestData[1]) { - return async function(...[fileName, ...rest]: Parameters) { + return async function (...[fileName, ...rest]: Parameters) { const server = await getBestServer(fileName); if (!server) { return; } return server.request>(requestType, fileName, ...rest); - } + }; } From 1906a08c4add76d0a43eee35afb365ff1bd0c41c Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Tue, 31 Dec 2024 23:46:55 +0800 Subject: [PATCH 5/9] fix: request --- packages/typescript-plugin/lib/client.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/typescript-plugin/lib/client.ts b/packages/typescript-plugin/lib/client.ts index 6ce2d789df..e1735370fa 100644 --- a/packages/typescript-plugin/lib/client.ts +++ b/packages/typescript-plugin/lib/client.ts @@ -24,11 +24,7 @@ export async function getComponentProps(fileName: string, componentName: string) if (!server) { return; } - const componentAndProps = server.componentNamesAndProps.get(fileName); - if (!componentAndProps) { - return; - } - return componentAndProps[componentName]; + return await server.getComponentProps(fileName, componentName); } export const getComponentEvents = createRequest< From 7b0880a2176922cde04f0d4b03129a13597deab4 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Tue, 31 Dec 2024 23:55:53 +0800 Subject: [PATCH 6/9] refactor: remove `getTemplateContextProps` --- packages/language-service/index.ts | 21 ++++++++----------- packages/typescript-plugin/lib/client.ts | 4 ---- .../lib/requests/componentInfos.ts | 17 --------------- packages/typescript-plugin/lib/server.ts | 9 ++------ 4 files changed, 11 insertions(+), 40 deletions(-) diff --git a/packages/language-service/index.ts b/packages/language-service/index.ts index 43fd1e5368..73b086d39d 100644 --- a/packages/language-service/index.ts +++ b/packages/language-service/index.ts @@ -31,7 +31,7 @@ import { create as createVueTwoslashQueriesPlugin } from './lib/plugins/vue-twos import { parse, VueCompilerOptions } from '@vue/language-core'; import { proxyLanguageServiceForVue } from '@vue/typescript-plugin/lib/common'; import { collectExtractProps } from '@vue/typescript-plugin/lib/requests/collectExtractProps'; -import { getComponentDirectives, getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from '@vue/typescript-plugin/lib/requests/componentInfos'; +import { getComponentDirectives, getComponentEvents, getComponentNames, getComponentProps, getElementAttrs } from '@vue/typescript-plugin/lib/requests/componentInfos'; import { getImportPathForFile } from '@vue/typescript-plugin/lib/requests/getImportPathForFile'; import { getPropertiesAtLocation } from '@vue/typescript-plugin/lib/requests/getPropertiesAtLocation'; import type { RequestContext } from '@vue/typescript-plugin/lib/requests/types'; @@ -107,31 +107,28 @@ export function getFullLanguageServicePlugins( }; return { async collectExtractProps(...args) { - return collectExtractProps.apply(requestContext, args); + return await collectExtractProps.apply(requestContext, args); }, async getPropertiesAtLocation(...args) { - return getPropertiesAtLocation.apply(requestContext, args); + return await getPropertiesAtLocation.apply(requestContext, args); }, async getImportPathForFile(...args) { - return getImportPathForFile.apply(requestContext, args); + return await getImportPathForFile.apply(requestContext, args); }, async getComponentEvents(...args) { - return getComponentEvents.apply(requestContext, args); + return await getComponentEvents.apply(requestContext, args); }, async getComponentDirectives(...args) { - return getComponentDirectives.apply(requestContext, args); + return await getComponentDirectives.apply(requestContext, args); }, async getComponentNames(...args) { - return getComponentNames.apply(requestContext, args); + return await getComponentNames.apply(requestContext, args); }, async getComponentProps(...args) { - return getComponentProps.apply(requestContext, args); + return await getComponentProps.apply(requestContext, args); }, async getElementAttrs(...args) { - return getElementAttrs.apply(requestContext, args); - }, - async getTemplateContextProps(...args) { - return getTemplateContextProps.apply(requestContext, args); + return await getElementAttrs.apply(requestContext, args); }, async getQuickInfoAtPosition(fileName, position) { const languageService = context.getLanguageService(); diff --git a/packages/typescript-plugin/lib/client.ts b/packages/typescript-plugin/lib/client.ts index e1735370fa..4aab0b6ef4 100644 --- a/packages/typescript-plugin/lib/client.ts +++ b/packages/typescript-plugin/lib/client.ts @@ -35,10 +35,6 @@ export const getComponentDirectives = createRequest< typeof import('./requests/componentInfos.js')['getComponentDirectives'] >('getComponentDirectives'); -export const getTemplateContextProps = createRequest< - typeof import('./requests/componentInfos.js')['getTemplateContextProps'] ->('getTemplateContextProps'); - export async function getComponentNames(fileName: string) { const server = await getBestServer(fileName); if (!server) { diff --git a/packages/typescript-plugin/lib/requests/componentInfos.ts b/packages/typescript-plugin/lib/requests/componentInfos.ts index b3df60e98f..da60f76117 100644 --- a/packages/typescript-plugin/lib/requests/componentInfos.ts +++ b/packages/typescript-plugin/lib/requests/componentInfos.ts @@ -140,23 +140,6 @@ export function getComponentDirectives( return directives.type.getProperties().map(({ name }) => name); } -export function getTemplateContextProps( - this: RequestContext, - fileName: string -) { - const { typescript: ts, language, languageService, getFileId } = this; - const volarFile = language.scripts.get(getFileId(fileName)); - if (!(volarFile?.generated?.root instanceof vue.VueVirtualCode)) { - return; - } - const vueCode = volarFile.generated.root; - - return getVariableType(ts, languageService, vueCode, '__VLS_ctx') - ?.type - ?.getProperties() - .map(c => c.name); -} - export function getComponentNames( this: RequestContext, fileName: string diff --git a/packages/typescript-plugin/lib/server.ts b/packages/typescript-plugin/lib/server.ts index afed1d3759..89e583a952 100644 --- a/packages/typescript-plugin/lib/server.ts +++ b/packages/typescript-plugin/lib/server.ts @@ -4,7 +4,7 @@ import * as net from 'node:net'; import type * as ts from 'typescript'; import { getComponentDirectives } from './client'; import { collectExtractProps } from './requests/collectExtractProps'; -import { getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from './requests/componentInfos'; +import { getComponentEvents, getComponentNames, getComponentProps, getElementAttrs } from './requests/componentInfos'; import { getImportPathForFile } from './requests/getImportPathForFile'; import { getPropertiesAtLocation } from './requests/getPropertiesAtLocation'; import { getQuickInfoAtPosition } from './requests/getQuickInfoAtPosition'; @@ -22,7 +22,6 @@ export type RequestType = | 'subscribeComponentProps' | 'getComponentEvents' | 'getComponentDirectives' - | 'getTemplateContextProps' | 'getElementAttrs'; export type NotificationType = @@ -255,11 +254,7 @@ export async function startNamedPipeServer( return getComponentEvents.apply(requestContext, args as any); } else if (requestType === 'getComponentDirectives') { - const result = getComponentDirectives.apply(requestContext, args as any); - sendResponse(result); - } - else if (requestType === 'getTemplateContextProps') { - return getTemplateContextProps.apply(requestContext, args as any); + return getComponentDirectives.apply(requestContext, args as any); } else if (requestType === 'getElementAttrs') { return getElementAttrs.apply(requestContext, args as any); From 26344002efe2f32eac3b887011542b8c32ab1b96 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Tue, 31 Dec 2024 23:56:38 +0800 Subject: [PATCH 7/9] refactor: filter on server side --- packages/language-core/lib/codegen/globalTypes.ts | 3 --- packages/language-core/lib/codegen/script/template.ts | 2 +- packages/typescript-plugin/lib/requests/componentInfos.ts | 4 +++- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index 1bbe26f893..8e7b3c65f6 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -94,9 +94,6 @@ export function generateGlobalTypes(lib: string, target: number, strictTemplates > >; type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; - type __VLS_PickDirectives = { - [K in keyof T as K extends \`v\${infer N}\` ? N extends Capitalize ? K : never : never]: T[K]; - }; type __VLS_PickFunctionalComponentCtx = NonNullable<__VLS_PickNotAny< '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: infer Ctx } ? Ctx : never : any , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 9270cba1c5..92a49bf7ac 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -96,7 +96,7 @@ export function* generateTemplateDirectives(options: ScriptCodegenOptions): Gene types.push(`typeof __VLS_directivesOption`); } - types.push(`__VLS_PickDirectives`); + types.push(`typeof __VLS_ctx`); yield `type __VLS_LocalDirectives =`; for (const type of types) { diff --git a/packages/typescript-plugin/lib/requests/componentInfos.ts b/packages/typescript-plugin/lib/requests/componentInfos.ts index da60f76117..b0f6d1b992 100644 --- a/packages/typescript-plugin/lib/requests/componentInfos.ts +++ b/packages/typescript-plugin/lib/requests/componentInfos.ts @@ -137,7 +137,9 @@ export function getComponentDirectives( return []; } - return directives.type.getProperties().map(({ name }) => name); + return directives.type.getProperties() + .map(({ name }) => name) + .filter(name => name.startsWith('v') && name.length >= 2 && name[1] === name[1].toUpperCase()); } export function getComponentNames( From 71cacc80d625751ab022d9cc016cb36901e3b0b5 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Wed, 1 Jan 2025 00:02:48 +0800 Subject: [PATCH 8/9] fix: correct import --- packages/typescript-plugin/lib/server.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/typescript-plugin/lib/server.ts b/packages/typescript-plugin/lib/server.ts index 89e583a952..753d76d1a0 100644 --- a/packages/typescript-plugin/lib/server.ts +++ b/packages/typescript-plugin/lib/server.ts @@ -2,9 +2,8 @@ import { FileMap, Language } from '@vue/language-core'; import * as fs from 'node:fs'; import * as net from 'node:net'; import type * as ts from 'typescript'; -import { getComponentDirectives } from './client'; import { collectExtractProps } from './requests/collectExtractProps'; -import { getComponentEvents, getComponentNames, getComponentProps, getElementAttrs } from './requests/componentInfos'; +import { getComponentDirectives, getComponentEvents, getComponentNames, getComponentProps, getElementAttrs } from './requests/componentInfos'; import { getImportPathForFile } from './requests/getImportPathForFile'; import { getPropertiesAtLocation } from './requests/getPropertiesAtLocation'; import { getQuickInfoAtPosition } from './requests/getQuickInfoAtPosition'; From e4149adfb95caa70bae7402a6d17fb7dddba463f Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Wed, 1 Jan 2025 00:07:36 +0800 Subject: [PATCH 9/9] refactor: filter --- packages/language-service/lib/plugins/vue-template.ts | 4 +--- packages/typescript-plugin/lib/requests/componentInfos.ts | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/language-service/lib/plugins/vue-template.ts b/packages/language-service/lib/plugins/vue-template.ts index d85a4bf8f1..f1d26d468b 100644 --- a/packages/language-service/lib/plugins/vue-template.ts +++ b/packages/language-service/lib/plugins/vue-template.ts @@ -569,9 +569,7 @@ export function create( !prop.name.startsWith('ref_') ), events, - directives: directives.filter(name => - !['vBind', 'vIf', 'vOn', 'VOnce', 'vShow', 'VSlot'].includes(name) - ), + directives, }); version++; })()); diff --git a/packages/typescript-plugin/lib/requests/componentInfos.ts b/packages/typescript-plugin/lib/requests/componentInfos.ts index b0f6d1b992..1df0adcd5b 100644 --- a/packages/typescript-plugin/lib/requests/componentInfos.ts +++ b/packages/typescript-plugin/lib/requests/componentInfos.ts @@ -139,7 +139,8 @@ export function getComponentDirectives( return directives.type.getProperties() .map(({ name }) => name) - .filter(name => name.startsWith('v') && name.length >= 2 && name[1] === name[1].toUpperCase()); + .filter(name => name.startsWith('v') && name.length >= 2 && name[1] === name[1].toUpperCase()) + .filter(name => !['vBind', 'vIf', 'vOn', 'VOnce', 'vShow', 'VSlot'].includes(name)); } export function getComponentNames(