diff --git a/packages/core/src/generate-doc/generator/panel-generator/panel-generator.ts b/packages/core/src/generate-doc/generator/panel-generator/panel-generator.ts index 7fb2df40bfa9154ddf4690884cffda4d43ea95fe..4a7fd51fae2726178b983e6d50cdabd7f1ecb0b5 100644 --- a/packages/core/src/generate-doc/generator/panel-generator/panel-generator.ts +++ b/packages/core/src/generate-doc/generator/panel-generator/panel-generator.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable no-await-in-loop */ /* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -6,6 +8,7 @@ import ts from 'typescript'; import fs from 'fs'; import { GeneratorBase } from '../generator-base/generator-base'; import { + findImportedFilePath, getTargetPathByFullPath, parseField, parseMethod, @@ -318,6 +321,17 @@ export class PanelGenerator extends GeneratorBase { doc.tags.some((tag: any) => tag.tagName.text === 'primary'), ); if (hasPrimaryTag) { + // 处理继承接口 + this.processInheritance( + targetSourceFileAst, + targetFilePath, + targetNode, + (member: any, targetAst: ts.SourceFile) => { + if (ts.isPropertySignature(member)) { + docObject.states.push(parseField(member, targetAst)); + } + }, + ); targetNode.members.forEach(member => { if (ts.isPropertySignature(member)) { docObject.states.push(parseField(member, targetSourceFileAst)); @@ -486,4 +500,86 @@ export class PanelGenerator extends GeneratorBase { return markdownContent; } + + /** + * 解析继承接口 + * + * @author tony001 + * @date 2025-03-17 15:03:15 + * @param {ts.SourceFile} fileAst + * @param {string} tempFilePath + * @param {*} node + * @param {Function} callback + */ + processInheritance( + fileAst: ts.SourceFile, + tempFilePath: string, + node: any, + callback: Function, + ): void { + if (node.heritageClauses) { + node.heritageClauses.forEach((clause: any) => { + const jsDocs = ts.getJSDocCommentsAndTags(node); + const hasPrimaryTag = jsDocs.some( + (doc: any) => + doc.tags && + doc.tags.some((tag: any) => tag.tagName.text === 'primary'), + ); + if (hasPrimaryTag) { + clause.types.forEach((type: any) => { + const importPath = findImportedFilePath( + fileAst, + type.expression.text, + ); + if (importPath) { + const targetFilePath = path.resolve( + path.dirname(tempFilePath), + importPath, + ); + const targetFileContent = fs.readFileSync( + `${targetFilePath}.ts`, + 'utf8', + ); + const targetSourceFileAst = ts.createSourceFile( + path.basename(targetFilePath), + targetFileContent, + ts.ScriptTarget.Latest, + true, + ); + + ts.forEachChild(targetSourceFileAst, targetNode => { + if (ts.isInterfaceDeclaration(targetNode)) { + const tempJSDocs = ts.getJSDocCommentsAndTags(targetNode); + const tempHasPrimaryTag = tempJSDocs.some( + (doc: any) => + doc.tags && + doc.tags.some( + (tag: any) => tag.tagName.text === 'primary', + ), + ); + // 继承接口文件也需根据@primary标记过滤 + if (tempHasPrimaryTag) { + // 递归处理继承接口 + this.processInheritance( + targetSourceFileAst, + targetFilePath, + targetNode, + callback, + ); + targetNode.members.forEach(member => { + callback(member, targetSourceFileAst); + }); + } + } + }); + } else { + console.error( + `${type.expression.text}-未找到导入路径-${importPath}`, + ); + } + }); + } + }); + } + } }