diff --git a/build-tools/delete_systemapi_plugin.js b/build-tools/delete_systemapi_plugin.js index 2f584e4f5e099643962ca47cdb41020228931121..460af932284e3bceaa035072186fd3d7c26298af 100644 --- a/build-tools/delete_systemapi_plugin.js +++ b/build-tools/delete_systemapi_plugin.js @@ -121,17 +121,17 @@ function tsTransformKitFile(kitPath) { kitFiles.forEach((kitFile) => { const kitName = processFileNameWithoutExt(kitFile).replace('@kit.', ''); const content = fs.readFileSync(kitFile, 'utf-8'); + const fileAndKitComment = getFileAndKitComment(content); + const copyrightMessage = getCopyrightComment(content); const fileName = processFileName(kitFile); let sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ES2017, true); - const sourceInfo = getKitNewSourceFile(sourceFile, kitName); - if (isEmptyFile(sourceInfo.sourceFile)) { + const newSourceFile = getKitNewSourceFile(sourceFile, kitName); + if (isEmptyFile(newSourceFile)) { return; } const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); - let result = printer.printNode(ts.EmitHint.Unspecified, sourceInfo.sourceFile, sourceFile); - if (sourceInfo.copyrightMessage !== '') { - result = sourceInfo.copyrightMessage + result; - } + let result = printer.printNode(ts.EmitHint.Unspecified, newSourceFile, sourceFile); + result = collectCopyrightMessage(result, copyrightMessage, fileAndKitComment); writeFile(kitFile, result); }); } @@ -153,18 +153,18 @@ function getKitNewSourceFile(sourceFile, kitName) { const newStatement = processKitImportDeclaration(statement, needDeleteExportName); if (newStatement) { newStatements.push(newStatement); - } else if (index === 0) { - copyrightMessage = sourceFile.getFullText().replace(sourceFile.getText(), ''); } } else if (ts.isExportDeclaration(statement)) { const newStatement = processKitExportDeclaration(statement, needDeleteExportName); if (newStatement) { newStatements.push(newStatement); } + } else { + newStatements.push(statement); } }); sourceFile = factory.updateSourceFile(sourceFile, newStatements); - return { sourceFile, copyrightMessage }; + return sourceFile; } function addImportToNeedDeleteExportName(importClause, needDeleteExportName) { @@ -596,7 +596,7 @@ function visitEachChild(context, node) { * @param {boolean} firstNodeIsStatic 第一个节点是否为use static * @returns {Function} */ -function formatImportDeclaration(url, copyrightMessage = '', fileAndKitComment = '', firstNodeIsStatic = false) { +function formatImportDeclaration(url, copyrightMessage = '', fileAndKitComment = '') { const allIdentifierSet = new Set([]); return (context) => { return (node) => { @@ -610,7 +610,7 @@ function formatImportDeclaration(url, copyrightMessage = '', fileAndKitComment = } const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); let result = printer.printNode(ts.EmitHint.Unspecified, node, sourceFile); - result = collectCopyrightMessage(result, copyrightMessage, fileAndKitComment, firstNodeIsStatic); + result = collectCopyrightMessage(result, copyrightMessage, fileAndKitComment); copyrightMessage = node.getFullText().replace(node.getText(), ''); if (referencesMessage) { // 将references写入文件 result = result.substring(0, copyrightMessage.length) + '\n' + referencesMessage + @@ -657,18 +657,16 @@ function collectillegalNodes(decorator, allIdentifierSet) { * @param {string} result 文件内容 * @param {string} copyrightMessage 版权头注释 * @param {string} fileAndKitComment 文件kit注释 - * @param {boolean} firstNodeIsStatic 第一个节点是否为use static * @returns */ -function collectCopyrightMessage(result, copyrightMessage, fileAndKitComment, firstNodeIsStatic) { +function collectCopyrightMessage(result, copyrightMessage, fileAndKitComment) { const newFileAndKitComment = getFileAndKitComment(result); const newCopyrightMessage = getCopyrightComment(result); let commentIndex = 0; - if (firstNodeIsStatic) { - const indexStatic = result.match(/use static.*\n/); - if (indexStatic) { - commentIndex = indexStatic.index + indexStatic[0].length; - } + const useStaticRegex = /^\s*(['"])use static\1\s*;?$/gm; + if (useStaticRegex.test(result) && useStaticRegex.exec(result) && + useStaticRegex.exec(result).index === 0) { + commentIndex = indexStatic.index + indexStatic[0].length; } if (newFileAndKitComment === '') { result = @@ -969,7 +967,7 @@ function deleteSystemApi(url) { ts.transpileModule(result, { compilerOptions: COMPILER_OPTIONS, fileName: fileName, - transformers: { before: [formatImportDeclaration(url, copyrightMessage, fileAndKitComment, deleteNode.firstNodeIsStatic)] }, + transformers: { before: [formatImportDeclaration(url, copyrightMessage, fileAndKitComment)] }, }); } return ts.factory.createSourceFile([], ts.SyntaxKind.EndOfFileToken, ts.NodeFlags.None); diff --git a/build-tools/handleApiFiles.js b/build-tools/handleApiFiles.js index 10cd699309bd8f279e2680e3da1a4f797d895223..8298f30ee794b007cd9c226880e1cd11bc0be3dc 100755 --- a/build-tools/handleApiFiles.js +++ b/build-tools/handleApiFiles.js @@ -21,6 +21,7 @@ const commander = require('commander'); let dirType = ''; const deleteApiSet = new Set(); const importNameSet = new Set(); +const ARKTS_FLAG = 'use static'; // 处理的目录类型,ets代表处理的是1.1目录,ets2代表处理的是1.2目录里有@arkts 1.1&1.2标签的文件, // noTagInEts2代表处理的是1.2目录里无标签的文件 @@ -435,8 +436,8 @@ function handleFileInSecondType(apiRelativePath, fullPath, type, output) { if (sourceFile.statements.length === 0) { // 有1.2标签的文件,删除标记 if (secondRegx.test(sourceFile.getFullText())) { - let newFileContent = deleteUnsportedTag(fileContent); - newFileContent = getFileContent(newFileContent, fullPath); + let newFileContent = getFileContent(deleteUnsportedTag(fileContent), fullPath); + newFileContent = addStaticString(newFileContent); writeFile(outputPath, deleteArktsTag(newFileContent)); return; } @@ -461,8 +462,8 @@ function handleFileInSecondType(apiRelativePath, fullPath, type, output) { } // 有1.2标签的文件,删除标记 if (secondRegx.test(firstJsdocText)) { - let newFileContent = deleteUnsportedTag(fileContent); - newFileContent = getFileContent(newFileContent, fullPath); + let newFileContent = getFileContent(deleteUnsportedTag(fileContent), fullPath); + newFileContent = addStaticString(newFileContent); writeFile(outputPath, deleteArktsTag(newFileContent)); return; } @@ -620,6 +621,7 @@ function saveApiByArktsDefinition(sourceFile, fileContent, outputPath) { }); let fileJsdoc = firstNode ? getFileJsdoc(firstNode) + '*/\n' : ''; let newContent = copyrightMessage + fileJsdoc + Array.from(fileContent.matchAll(regx), match => match[4]).join('\n'); + newContent = addStaticString(newContent); writeFile(outputPath, saveLatestJsDoc(newContent)); } @@ -654,6 +656,7 @@ function joinFileJsdoc(deletionContent, sourceFile) { if (dirType !== DirType.typeOne) { // TODO:添加use static字符串 + newContent = addStaticString(newContent); } return newContent; } @@ -695,14 +698,18 @@ function writeFile(outputPath, fileContent) { * @param {*} copyrightMessage 版权头内容 * @returns */ -function addStaticString(fileContent, copyrightMessage) { - const hasStaticMessage = /use\s+static/g.test(fileContent); - const regex = /\/\*\r?\n\s*\*\s*Copyright[\s\S]*?limitations under the License\.\r?\n\s*\*\//g; - const staticMessage = 'use static'; +function addStaticString(fileContent) { let newContent = fileContent; + //判断是否存在use static且位置在第一个行 + const fileContentRegex = /^\s*(['"])use static\1\s*;?$/gm; + if (fileContentRegex.test(fileContent) && fileContentRegex.exec(fileContent) && + fileContentRegex.exec(fileContent).index > 0) { + newContent = newContent.replace(/^\s*(['"])use static\1\s*;?$/gm, ''); + } + const hasStaticMessage = fileContentRegex.test(newContent); + const staticMessage = 'use static'; if (!hasStaticMessage) { - const newfileJsdoc = `${copyrightMessage}'${staticMessage}'\r\n`; - newContent = newContent.replace(regex, newfileJsdoc); + newContent = `'${staticMessage}'\r\n${newContent}`; } return newContent; } @@ -805,12 +812,28 @@ const transformExportApi = (context) => { }; }; +/** + * 判断是否为use static标记 + * @param { ts.Node } node + * @returns { boolean } + */ +function isStaticFlag(node) { + return ts.isExpressionStatement(node) && + node.expression && + ts.isStringLiteral(node.expression) && + node.expression.text && + node.expression.text === ARKTS_FLAG; +} + function isEmptyFile(node) { let isEmpty = true; if (ts.isSourceFile(node) && node.statements) { const needExportName = new Set(); for (let i = 0; i < node.statements.length; i++) { const statement = node.statements[i]; + if (isStaticFlag(statement)) { + continue; + } if (ts.isExportDeclaration(statement) && statement.moduleSpecifier) { isEmpty = false; break;