diff --git a/packages/component-meta/lib/checker.ts b/packages/component-meta/lib/checker.ts index 9ceb57e4b5..dbd8da5370 100644 --- a/packages/component-meta/lib/checker.ts +++ b/packages/component-meta/lib/checker.ts @@ -100,7 +100,6 @@ export function createCheckerBase( printer, vueOptions, language, - sourceFile, componentNode, componentType, checkerOptions.schema ?? false, diff --git a/packages/component-meta/lib/componentMeta.ts b/packages/component-meta/lib/componentMeta.ts index b098025f81..f48e19a60c 100644 --- a/packages/component-meta/lib/componentMeta.ts +++ b/packages/component-meta/lib/componentMeta.ts @@ -19,12 +19,27 @@ export function getComponentMeta( printer: ts.Printer, vueOptions: core.VueCompilerOptions, language: core.Language, - sourceFile: ts.SourceFile, componentNode: ts.Node, componentType: ts.Type, options: MetaCheckerSchemaOptions, ): ComponentMeta { const typeChecker = program.getTypeChecker(); + const componentSymbol = typeChecker.getSymbolAtLocation(componentNode); + + let componentFile = componentNode.getSourceFile(); + + if (componentSymbol) { + const symbol = componentSymbol.flags & ts.SymbolFlags.Alias + ? typeChecker.getAliasedSymbol(componentType.symbol) + : componentType.symbol; + const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0]; + + if (declaration) { + componentFile = declaration.getSourceFile(); + componentNode = declaration; + } + } + let name: string | undefined; let description: string | undefined; @@ -80,14 +95,14 @@ export function getComponentMeta( .map(prop => { const { resolveNestedProperties, - } = createSchemaResolvers(ts, typeChecker, printer, language, sourceFile, options); + } = createSchemaResolvers(ts, typeChecker, printer, language, options); return resolveNestedProperties(prop); }) .filter((prop): prop is PropertyMeta => !!prop && !vnodeEventRegex.test(prop.name) && !eventProps.has(prop.name)); // Merge default props from script setup - const defaults = getDefaultsFromScriptSetup(ts, printer, language, sourceFile.fileName, vueOptions); + const defaults = getDefaultsFromScriptSetup(ts, printer, language, componentFile.fileName, vueOptions); if (defaults?.size) { for (const prop of result) { @@ -109,7 +124,7 @@ export function getComponentMeta( return calls.map(call => { const { resolveEventSignature, - } = createSchemaResolvers(ts, typeChecker, printer, language, sourceFile, options); + } = createSchemaResolvers(ts, typeChecker, printer, language, options); return resolveEventSignature(call); }).filter(event => event.name); @@ -127,7 +142,7 @@ export function getComponentMeta( return properties.map(prop => { const { resolveSlotProperties, - } = createSchemaResolvers(ts, typeChecker, printer, language, sourceFile, options); + } = createSchemaResolvers(ts, typeChecker, printer, language, options); return resolveSlotProperties(prop); }); @@ -155,7 +170,7 @@ export function getComponentMeta( return properties.map(prop => { const { resolveExposedProperties, - } = createSchemaResolvers(ts, typeChecker, printer, language, sourceFile, options); + } = createSchemaResolvers(ts, typeChecker, printer, language, options); return resolveExposedProperties(prop); }); @@ -168,9 +183,9 @@ export function getComponentMeta( let decl = componentNode; // const __VLS_export = ... - const text = sourceFile.text.slice(decl.pos, decl.end); + const text = componentFile.text.slice(decl.pos, decl.end); if (text.includes(core.names._export)) { - ts.forEachChild(sourceFile, child2 => { + ts.forEachChild(componentFile, child2 => { if (ts.isVariableStatement(child2)) { for (const { name, initializer } of child2.declarationList.declarations) { if (name.getText() === core.names._export && initializer) { @@ -181,7 +196,7 @@ export function getComponentMeta( }); } - return core.parseOptionsFromExtression(ts, decl, sourceFile)?.name?.node.text; + return core.parseOptionsFromExtression(ts, decl, componentFile)?.name?.node.text; } function getDescription() { diff --git a/packages/component-meta/lib/schemaResolvers.ts b/packages/component-meta/lib/schemaResolvers.ts index b39f6747e2..9bb5cf19ae 100644 --- a/packages/component-meta/lib/schemaResolvers.ts +++ b/packages/component-meta/lib/schemaResolvers.ts @@ -15,7 +15,6 @@ export function createSchemaResolvers( typeChecker: ts.TypeChecker, printer: ts.Printer, language: core.Language, - sourceFile: ts.SourceFile, options: import('./types').MetaCheckerSchemaOptions, ) { const visited = new Set(); @@ -68,10 +67,7 @@ export function createSchemaResolvers( let required = !(propSymbol.flags & ts.SymbolFlags.Optional); for (const decl of propSymbol.declarations ?? []) { - if ( - decl.getSourceFile() !== sourceFile - && isPublicProp(decl) - ) { + if (isPublicProp(decl)) { global = true; } if (ts.isPropertyAssignment(decl) && ts.isObjectLiteralExpression(decl.initializer)) { diff --git a/packages/language-service/lib/plugins/vue-template.ts b/packages/language-service/lib/plugins/vue-template.ts index e24e2c6622..f5a4a78c7f 100644 --- a/packages/language-service/lib/plugins/vue-template.ts +++ b/packages/language-service/lib/plugins/vue-template.ts @@ -26,7 +26,7 @@ import { } from 'volar-service-typescript/lib/utils/lspConverters.js'; import * as html from 'vscode-html-languageservice'; import { URI, Utils } from 'vscode-uri'; -import { ComponentMeta, PropertyMeta } from '../../../component-meta'; +import type { ComponentMeta, PropertyMeta } from '../../../component-meta'; import { loadModelModifiersData, loadTemplateData } from '../data'; import { format } from '../htmlFormatter'; import { AttrNameCasing, getAttrNameCasing, getTagNameCasing, TagNameCasing } from '../nameCasing'; @@ -547,7 +547,9 @@ export function create( if (p.default) { _default = '`' + p.default + '`'; } - markdown += `| ${name} | \`${p.type.replace(/\|/g, '\\|')}\` | ${p.description ?? ''} | ${_default} |\n`; + markdown += `| ${name} | \`${p.type.replace(/\|/g, '\\|')}\` | ${ + p.description ?? '' + } | ${_default} |\n`; } } diff --git a/packages/typescript-plugin/lib/requests/getComponentMeta.ts b/packages/typescript-plugin/lib/requests/getComponentMeta.ts index 5a8874eba7..8d34a454b5 100644 --- a/packages/typescript-plugin/lib/requests/getComponentMeta.ts +++ b/packages/typescript-plugin/lib/requests/getComponentMeta.ts @@ -23,7 +23,6 @@ export function getComponentMeta( ts.createPrinter(), virtualCode.vueCompilerOptions, language, - sourceFile, componentType.node, componentType.type, false,