From 62dfcdac099f7f9c835934bc867c04addf48aed9 Mon Sep 17 00:00:00 2001 From: Cano1997 <1978141412@qq.com> Date: Tue, 29 Apr 2025 21:21:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9D=A2=E6=9D=BF=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=96=87=E6=A1=A3cli=E8=AF=86=E5=88=AB=E7=BB=A7=E6=89=BF?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../panel-generator/panel-generator.ts | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) 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 7fb2df4..4a7fd51 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}`, + ); + } + }); + } + }); + } + } } -- Gitee