18c339a94Sopenharmony_ci/* 28c339a94Sopenharmony_ci* Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. 38c339a94Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the 'License'); 48c339a94Sopenharmony_ci* you may not use this file except in compliance with the License. 58c339a94Sopenharmony_ci* You may obtain a copy of the License at 68c339a94Sopenharmony_ci* 78c339a94Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0 88c339a94Sopenharmony_ci* 98c339a94Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software 108c339a94Sopenharmony_ci* distributed under the License is distributed on an 'AS IS' BASIS, 118c339a94Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128c339a94Sopenharmony_ci* See the License for the specific language governing permissions and 138c339a94Sopenharmony_ci* limitations under the License. 148c339a94Sopenharmony_ci*/ 158c339a94Sopenharmony_ci 168c339a94Sopenharmony_ciconst { NapiLog } = require('../tools/NapiLog'); 178c339a94Sopenharmony_ciconst util = require('util'); 188c339a94Sopenharmony_ciconst path = require('path'); 198c339a94Sopenharmony_ciconst fs = require('fs'); 208c339a94Sopenharmony_ciconst { writeFile, readFile } = require('../tools/tool'); 218c339a94Sopenharmony_ciconst re = require('../tools/re'); 228c339a94Sopenharmony_ciconst LENGTH = 10; 238c339a94Sopenharmony_ciconst TWO_DECIMAL = 2; 248c339a94Sopenharmony_ci 258c339a94Sopenharmony_cifunction analyzeRetIsObject(retType, objectInfo) { 268c339a94Sopenharmony_ci // 去除 * 和 空格 278c339a94Sopenharmony_ci retType = retType.replace('*', '').replace('struct', '').trim(); 288c339a94Sopenharmony_ci let objKeys = Object.keys(objectInfo); 298c339a94Sopenharmony_ci for (let i = 0; i < objKeys.length; i++) { 308c339a94Sopenharmony_ci if (retType === objKeys[i]) { 318c339a94Sopenharmony_ci return true; 328c339a94Sopenharmony_ci } 338c339a94Sopenharmony_ci } 348c339a94Sopenharmony_ci return false; 358c339a94Sopenharmony_ci} 368c339a94Sopenharmony_ci 378c339a94Sopenharmony_ci 388c339a94Sopenharmony_cifunction analyzeRetIsTypeDef(type, info) { 398c339a94Sopenharmony_ci let typedefKeys = Object.keys(info); 408c339a94Sopenharmony_ci for (let i = 0; i < typedefKeys.length; i++) { 418c339a94Sopenharmony_ci if (type === typedefKeys[i]) { 428c339a94Sopenharmony_ci return info[type]; 438c339a94Sopenharmony_ci } 448c339a94Sopenharmony_ci } 458c339a94Sopenharmony_ci return null; 468c339a94Sopenharmony_ci} 478c339a94Sopenharmony_ci 488c339a94Sopenharmony_ci//tsFuncName 498c339a94Sopenharmony_cifunction generateDirectFunction(params, index, tsFuncName, directFuncPath, hFileName) { 508c339a94Sopenharmony_ci let funcInfo = { 518c339a94Sopenharmony_ci 'name': '', 528c339a94Sopenharmony_ci 'params': [], 538c339a94Sopenharmony_ci 'retType': '', 548c339a94Sopenharmony_ci }; 558c339a94Sopenharmony_ci 568c339a94Sopenharmony_ci let funcNameReplace = tsFuncName; 578c339a94Sopenharmony_ci 588c339a94Sopenharmony_ci // 方法的注册 598c339a94Sopenharmony_ci let initReplace = genInitFunction(directFuncPath, funcNameReplace); 608c339a94Sopenharmony_ci 618c339a94Sopenharmony_ci // 分析方法 分析第index个方法 628c339a94Sopenharmony_ci analyzeFunction(funcInfo, params, index); 638c339a94Sopenharmony_ci 648c339a94Sopenharmony_ci // 生成 658c339a94Sopenharmony_ci let paramGenResult = genParamInfo(directFuncPath, funcInfo, params); 668c339a94Sopenharmony_ci 678c339a94Sopenharmony_ci // 返回值处理 对于对象要使用循环处理 688c339a94Sopenharmony_ci let retGenResult = ''; 698c339a94Sopenharmony_ci let retObjInfo = { 708c339a94Sopenharmony_ci 'objName': '', 718c339a94Sopenharmony_ci 'flag': false 728c339a94Sopenharmony_ci }; 738c339a94Sopenharmony_ci 748c339a94Sopenharmony_ci let funcRetOutPath = directFuncPath.cppTempleteDetails.funcBody.funcReturnOut; 758c339a94Sopenharmony_ci retGenResult = returnTypeC2Js(funcRetOutPath, funcInfo, params, retGenResult, retObjInfo); 768c339a94Sopenharmony_ci 778c339a94Sopenharmony_ci let { bodyReplace, funcInfoParams } = getReplaceInfo(directFuncPath, funcInfo, funcNameReplace, hFileName); 788c339a94Sopenharmony_ci 798c339a94Sopenharmony_ci let funcGetParamTempletePath = path.join(__dirname, 808c339a94Sopenharmony_ci directFuncPath.cppTempleteDetails.funcBody.funcParamIn.funcGetParamTemplete); 818c339a94Sopenharmony_ci let funcGetParamTemplete = readFile(funcGetParamTempletePath); 828c339a94Sopenharmony_ci let genParamReplace = getGenParamReplace(funcGetParamTemplete, funcInfo, funcNameReplace, paramGenResult); 838c339a94Sopenharmony_ci bodyReplace = getBodyReplace2(funcInfo, bodyReplace, genParamReplace); 848c339a94Sopenharmony_ci if (funcInfo.retType.replace('*', '').trim() !== 'void') { 858c339a94Sopenharmony_ci let returnType = funcInfo.retType === 'std::string' ? 'const char *' : funcInfo.retType; 868c339a94Sopenharmony_ci returnType = returnType === 'size_t' ? 'int64_t' : returnType; 878c339a94Sopenharmony_ci let funcReturnTempletePath = path.join(__dirname, funcRetOutPath.funcReturnTemplete); 888c339a94Sopenharmony_ci let funcReturnTemplete = readFile(funcReturnTempletePath); 898c339a94Sopenharmony_ci let funcReturnReplace = replaceAll(funcReturnTemplete, '[return_name]', retObjInfo.objName); 908c339a94Sopenharmony_ci funcReturnReplace = replaceAll(funcReturnReplace, '[funcName]', funcNameReplace); 918c339a94Sopenharmony_ci funcReturnReplace = replaceAll(funcReturnReplace, '[return_replace]', retGenResult); 928c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[func_return_replace]', funcReturnReplace); 938c339a94Sopenharmony_ci } else { 948c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[func_return_replace]', ' return NULL;\n'); 958c339a94Sopenharmony_ci } 968c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[return_replace]', retGenResult); 978c339a94Sopenharmony_ci 988c339a94Sopenharmony_ci let funcHDeclare = genFuncHDeclare(directFuncPath, funcNameReplace, hFileName, funcInfo, funcInfoParams); 998c339a94Sopenharmony_ci 1008c339a94Sopenharmony_ci return [funcHDeclare, initReplace, bodyReplace]; 1018c339a94Sopenharmony_ci} 1028c339a94Sopenharmony_ci 1038c339a94Sopenharmony_cifunction getReplaceInfo(directFuncPath, funcInfo, funcNameReplace, hFileName) { 1048c339a94Sopenharmony_ci let funcBodyTempletePath = path.join(__dirname, directFuncPath.cppTempleteDetails.funcBody.funcBodyTemplete); 1058c339a94Sopenharmony_ci let bodyTemplete = readFile(funcBodyTempletePath); 1068c339a94Sopenharmony_ci let funcInfoParams = genFuncInfoParams(funcInfo); 1078c339a94Sopenharmony_ci let bodyReplace = replaceAll(bodyTemplete, '[funcName]', funcNameReplace); 1088c339a94Sopenharmony_ci bodyReplace = getBodyReplace(bodyReplace, funcNameReplace, hFileName, funcInfo, funcInfoParams); 1098c339a94Sopenharmony_ci return { bodyReplace, funcInfoParams }; 1108c339a94Sopenharmony_ci} 1118c339a94Sopenharmony_ci 1128c339a94Sopenharmony_cifunction getBodyReplace(bodyReplace, funcNameReplace, hFileName, funcInfo, funcInfoParams) { 1138c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[get_error_msg_tag]', funcNameReplace); 1148c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[file_introduce_replace]', hFileName); 1158c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[func_introduce_replace]', funcInfo.name); 1168c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[input_introduce_replace]', funcInfoParams === '' ? 'void' : funcInfoParams); 1178c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[output_introduce_replace]', funcInfo.retType); 1188c339a94Sopenharmony_ci return bodyReplace; 1198c339a94Sopenharmony_ci} 1208c339a94Sopenharmony_ci 1218c339a94Sopenharmony_cifunction getBodyReplace2(funcInfo, bodyReplace, genParamReplace) { 1228c339a94Sopenharmony_ci if (funcInfo.params.length !== 0) { 1238c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[func_getParam_replace]', genParamReplace); 1248c339a94Sopenharmony_ci } else { 1258c339a94Sopenharmony_ci bodyReplace = replaceAll(bodyReplace, '[func_getParam_replace]', ''); 1268c339a94Sopenharmony_ci } 1278c339a94Sopenharmony_ci return bodyReplace; 1288c339a94Sopenharmony_ci} 1298c339a94Sopenharmony_ci 1308c339a94Sopenharmony_cifunction getGenParamReplace(funcGetParamTemplete, funcInfo, funcNameReplace, paramGenResult) { 1318c339a94Sopenharmony_ci let genParamReplace = replaceAll(funcGetParamTemplete, '[param_length]', 'PARAMS' + funcInfo.params.length); 1328c339a94Sopenharmony_ci genParamReplace = replaceAll(genParamReplace, '[funcName]', funcNameReplace); 1338c339a94Sopenharmony_ci genParamReplace = replaceAll(genParamReplace, '[getParam_replace]', paramGenResult); 1348c339a94Sopenharmony_ci return genParamReplace; 1358c339a94Sopenharmony_ci} 1368c339a94Sopenharmony_ci 1378c339a94Sopenharmony_cifunction genFuncInfoParams(funcInfo) { 1388c339a94Sopenharmony_ci let funcInfoParams = ''; 1398c339a94Sopenharmony_ci let funcInfoParamTemp = '[paramName]: [paramType]; '; 1408c339a94Sopenharmony_ci for (let i = 0; i < funcInfo.params.length; i++) { 1418c339a94Sopenharmony_ci let funcInfoParamReplace = replaceAll(funcInfoParamTemp, '[paramName]', funcInfo.params[i].name); 1428c339a94Sopenharmony_ci funcInfoParamReplace = replaceAll(funcInfoParamReplace, '[paramType]', funcInfo.params[i].type); 1438c339a94Sopenharmony_ci funcInfoParams += funcInfoParamReplace; 1448c339a94Sopenharmony_ci } 1458c339a94Sopenharmony_ci return funcInfoParams; 1468c339a94Sopenharmony_ci} 1478c339a94Sopenharmony_ci 1488c339a94Sopenharmony_cifunction genFuncHDeclare(directFuncPath, funcNameReplace, hFileName, funcInfo, funcInfoParams) { 1498c339a94Sopenharmony_ci let funcHDeclarePath = path.join(__dirname, directFuncPath.cppTempleteDetails.funcHDeclare.funcHDeclare); 1508c339a94Sopenharmony_ci let funcHDeclare = readFile(funcHDeclarePath); 1518c339a94Sopenharmony_ci funcHDeclare = replaceAll(funcHDeclare, '[funcName]', funcNameReplace); 1528c339a94Sopenharmony_ci 1538c339a94Sopenharmony_ci funcHDeclare = replaceAll(funcHDeclare, '[file_introduce_replace]', hFileName); 1548c339a94Sopenharmony_ci funcHDeclare = replaceAll(funcHDeclare, '[func_introduce_replace]', funcInfo.name); 1558c339a94Sopenharmony_ci funcHDeclare = replaceAll(funcHDeclare, '[input_introduce_replace]', funcInfoParams === '' ? 'void' : funcInfoParams); 1568c339a94Sopenharmony_ci funcHDeclare = replaceAll(funcHDeclare, '[output_introduce_replace]', funcInfo.retType); 1578c339a94Sopenharmony_ci return funcHDeclare; 1588c339a94Sopenharmony_ci} 1598c339a94Sopenharmony_ci 1608c339a94Sopenharmony_cifunction genParamInfo(directFuncPath, funcInfo, params) { 1618c339a94Sopenharmony_ci let relativeParamGenPath = directFuncPath.cppTempleteDetails.funcBody.funcParamIn.paramGenTemplete; 1628c339a94Sopenharmony_ci let paramGenTempletePath = path.join(__dirname, relativeParamGenPath); 1638c339a94Sopenharmony_ci let paramGenTemplete = readFile(paramGenTempletePath); 1648c339a94Sopenharmony_ci let funcParamTypePath = directFuncPath.cppTempleteDetails.funcBody.funcParamIn.funcParamType; 1658c339a94Sopenharmony_ci let paramGenResult = ''; 1668c339a94Sopenharmony_ci // napi 获取参数 1678c339a94Sopenharmony_ci for (let i = 0; i < funcInfo.params.length; i++) { 1688c339a94Sopenharmony_ci paramGenResult = getParamJs2C(funcInfo, i, paramGenTemplete, funcParamTypePath, paramGenResult, params); 1698c339a94Sopenharmony_ci } 1708c339a94Sopenharmony_ci return paramGenResult; 1718c339a94Sopenharmony_ci} 1728c339a94Sopenharmony_ci 1738c339a94Sopenharmony_cifunction analyzeFunction(funcInfo, params, index) { 1748c339a94Sopenharmony_ci funcInfo.name = params.functions[index].name; 1758c339a94Sopenharmony_ci funcInfo.retType = params.functions[index].rtnType; 1768c339a94Sopenharmony_ci let parseParams = params.functions[index].parameters; 1778c339a94Sopenharmony_ci for (let i = 0; i < parseParams.length; ++i) { 1788c339a94Sopenharmony_ci let param = createParam(parseParams[i]); 1798c339a94Sopenharmony_ci funcInfo.params.push(param); 1808c339a94Sopenharmony_ci } 1818c339a94Sopenharmony_ci} 1828c339a94Sopenharmony_ci 1838c339a94Sopenharmony_cifunction genInitFunction(directFuncPath, funcNameReplace) { 1848c339a94Sopenharmony_ci let funcInitPath = path.join(__dirname, directFuncPath.initTempleteDetails.funcInitTemplete); 1858c339a94Sopenharmony_ci let funcInitTemplete = readFile(funcInitPath); 1868c339a94Sopenharmony_ci let initReplace = replaceAll(funcInitTemplete, '[func_name_replace]', funcNameReplace); 1878c339a94Sopenharmony_ci return initReplace; 1888c339a94Sopenharmony_ci} 1898c339a94Sopenharmony_ci 1908c339a94Sopenharmony_cifunction getParamJs2C(funcInfo, i, paramGenTemplete, funcParamTypePath, paramGenResult, params) { 1918c339a94Sopenharmony_ci let paramType = funcInfo.params[i].type === 'size_t' ? 'int64_t' : funcInfo.params[i].type; 1928c339a94Sopenharmony_ci // 去除const 和 * 1938c339a94Sopenharmony_ci paramType = paramType.replace('const', '').replace('*', '').trim(); 1948c339a94Sopenharmony_ci let paramName = funcInfo.params[i].name; 1958c339a94Sopenharmony_ci let paramGen = replaceAll(paramGenTemplete, '[param_index_replace]', 'PARAMS' + i); 1968c339a94Sopenharmony_ci paramGen = replaceAll(paramGen, '[param_name_replace]', paramName); 1978c339a94Sopenharmony_ci if (paramType === 'double') { 1988c339a94Sopenharmony_ci let getParamPath = path.join(__dirname, funcParamTypePath.double); 1998c339a94Sopenharmony_ci paramGen = getParamGenCon(getParamPath, i, paramName, paramGen); 2008c339a94Sopenharmony_ci paramGenResult += paramGen; 2018c339a94Sopenharmony_ci } else if (paramType === 'uint32_t') { 2028c339a94Sopenharmony_ci let getParamPath = path.join(__dirname, funcParamTypePath.uint32_t); 2038c339a94Sopenharmony_ci paramGen = getParamGenCon(getParamPath, i, paramName, paramGen); 2048c339a94Sopenharmony_ci paramGenResult += paramGen; 2058c339a94Sopenharmony_ci } else if (paramType === 'int32_t' || paramType === 'int') { 2068c339a94Sopenharmony_ci let getParamPath = path.join(__dirname, funcParamTypePath.int32_t); 2078c339a94Sopenharmony_ci paramGen = getParamGenCon(getParamPath, i, paramName, paramGen); 2088c339a94Sopenharmony_ci paramGenResult += paramGen; 2098c339a94Sopenharmony_ci } else if (paramType === 'int64_t' || paramType === 'size_t') { 2108c339a94Sopenharmony_ci let getParamPath = path.join(__dirname, funcParamTypePath.int64_t); 2118c339a94Sopenharmony_ci paramGen = getParamGenCon(getParamPath, i, paramName, paramGen); 2128c339a94Sopenharmony_ci paramGenResult += paramGen; 2138c339a94Sopenharmony_ci } else if (paramType === 'bool') { 2148c339a94Sopenharmony_ci let getParamPath = path.join(__dirname, funcParamTypePath.bool); 2158c339a94Sopenharmony_ci paramGen = getParamGenCon(getParamPath, i, paramName, paramGen); 2168c339a94Sopenharmony_ci paramGenResult += paramGen; 2178c339a94Sopenharmony_ci } else if (paramType === 'std::string' || paramType.indexOf('char') >= 0) { 2188c339a94Sopenharmony_ci let getParamPath = path.join(__dirname, funcParamTypePath.string); 2198c339a94Sopenharmony_ci paramGen = getParamGenCon(getParamPath, i, paramName, paramGen); 2208c339a94Sopenharmony_ci paramGenResult += paramGen; 2218c339a94Sopenharmony_ci } else if (analyzeRetIsTypeDef(paramType, params.typedefs)) { // typedefs 2228c339a94Sopenharmony_ci funcInfo.params[i].type = analyzeRetIsTypeDef(paramType, params.typedefs); 2238c339a94Sopenharmony_ci paramGenResult = getParamJs2C(funcInfo, i, paramGenTemplete, funcParamTypePath, paramGenResult, params); 2248c339a94Sopenharmony_ci } 2258c339a94Sopenharmony_ci // 其他情况,处理成对象 napi_get_cb_info之后不做任何处理 2268c339a94Sopenharmony_ci return paramGenResult; 2278c339a94Sopenharmony_ci} 2288c339a94Sopenharmony_ci 2298c339a94Sopenharmony_cifunction getParamGenCon(getParamPath, i, paramName, paramGen) { 2308c339a94Sopenharmony_ci let getParam = readFile(getParamPath); 2318c339a94Sopenharmony_ci getParam = replaceAll(getParam, '[param_index_replace]', 'PARAMS' + i); 2328c339a94Sopenharmony_ci getParam = replaceAll(getParam, '[param_name_replace]', paramName); 2338c339a94Sopenharmony_ci paramGen = replaceAll(paramGen, '[getParam_replace]', getParam); 2348c339a94Sopenharmony_ci return paramGen; 2358c339a94Sopenharmony_ci} 2368c339a94Sopenharmony_ci 2378c339a94Sopenharmony_cifunction returnTypeC2Js(funcRetOutPath, funcInfo, params, retGenResult, retObjInfo) { 2388c339a94Sopenharmony_ci let setRetPropertyPath = path.join(__dirname, funcRetOutPath.funcReturnType.returnObj.funcReturnObjectToSet); 2398c339a94Sopenharmony_ci let setRetProperty = readFile(setRetPropertyPath); 2408c339a94Sopenharmony_ci let returnName = funcInfo.name; 2418c339a94Sopenharmony_ci if (!retObjInfo.flag) { 2428c339a94Sopenharmony_ci retObjInfo.objName = returnName; 2438c339a94Sopenharmony_ci } 2448c339a94Sopenharmony_ci if (funcInfo.retType === 'uint32_t') { 2458c339a94Sopenharmony_ci let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.uint32_t); 2468c339a94Sopenharmony_ci retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty); 2478c339a94Sopenharmony_ci } else if (funcInfo.retType === 'double') { 2488c339a94Sopenharmony_ci let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.double); 2498c339a94Sopenharmony_ci retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty); 2508c339a94Sopenharmony_ci } else if (funcInfo.retType === 'int32_t' || funcInfo.retType === 'int') { 2518c339a94Sopenharmony_ci let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.int32_t); 2528c339a94Sopenharmony_ci retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty); 2538c339a94Sopenharmony_ci } else if (funcInfo.retType === 'int64_t' || funcInfo.retType === 'size_t') { 2548c339a94Sopenharmony_ci let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.int64_t); 2558c339a94Sopenharmony_ci retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty); 2568c339a94Sopenharmony_ci } else if (funcInfo.retType === 'bool') { 2578c339a94Sopenharmony_ci let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.bool); 2588c339a94Sopenharmony_ci retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty); 2598c339a94Sopenharmony_ci } else if (funcInfo.retType === 'std::string' || funcInfo.retType.substring(0, 10) === 'const char' || 2608c339a94Sopenharmony_ci funcInfo.retType === 'char *') { 2618c339a94Sopenharmony_ci let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.string); 2628c339a94Sopenharmony_ci retGenResult = getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty); 2638c339a94Sopenharmony_ci } else if (analyzeRetIsObject(funcInfo.retType, params.classes)) { // 返回值是对象 2648c339a94Sopenharmony_ci if (!retObjInfo.flag) { 2658c339a94Sopenharmony_ci retGenResult = getObjRetContent(funcRetOutPath, retGenResult, returnName); 2668c339a94Sopenharmony_ci retObjInfo.flag = true; 2678c339a94Sopenharmony_ci let objectProperty = getObjectProperty(funcInfo, params); 2688c339a94Sopenharmony_ci // 遍历属性 2698c339a94Sopenharmony_ci for (let i = 0; i < objectProperty.length; i++) { 2708c339a94Sopenharmony_ci let testRes = returnTypeC2Js(funcRetOutPath, objectProperty[i], params, retGenResult, retObjInfo); 2718c339a94Sopenharmony_ci retGenResult = testRes; 2728c339a94Sopenharmony_ci } 2738c339a94Sopenharmony_ci } else { 2748c339a94Sopenharmony_ci retGenResult = getObjRetGenResult(retObjInfo, retGenResult, funcRetOutPath, returnName, setRetPropertyPath); 2758c339a94Sopenharmony_ci } 2768c339a94Sopenharmony_ci } else if (analyzeRetIsTypeDef(funcInfo.retType, params.typedefs)) { // typedefs 2778c339a94Sopenharmony_ci funcInfo.retType = analyzeRetIsTypeDef(funcInfo.retType, params.typedefs); 2788c339a94Sopenharmony_ci retGenResult = returnTypeC2Js(funcRetOutPath, funcInfo, params, retGenResult, retObjInfo); 2798c339a94Sopenharmony_ci } 2808c339a94Sopenharmony_ci return retGenResult; 2818c339a94Sopenharmony_ci} 2828c339a94Sopenharmony_ci 2838c339a94Sopenharmony_cifunction getObjectProperty(funcInfo, params) { 2848c339a94Sopenharmony_ci let retType = funcInfo.retType.replace('*', '').trim(); 2858c339a94Sopenharmony_ci let objectName = ''; 2868c339a94Sopenharmony_ci let objectProperty = []; 2878c339a94Sopenharmony_ci 2888c339a94Sopenharmony_ci let myObject = params.classes[retType]; 2898c339a94Sopenharmony_ci objectName = myObject.bare_name; 2908c339a94Sopenharmony_ci let myObjectProperty = myObject.properties.public; 2918c339a94Sopenharmony_ci for (let j = 0; j < myObjectProperty.length; j++) { 2928c339a94Sopenharmony_ci let propertyObj = { 2938c339a94Sopenharmony_ci 'name': '', 2948c339a94Sopenharmony_ci 'retType': '' 2958c339a94Sopenharmony_ci }; 2968c339a94Sopenharmony_ci propertyObj.name = myObjectProperty[j].name; 2978c339a94Sopenharmony_ci propertyObj.retType = myObjectProperty[j].type; 2988c339a94Sopenharmony_ci 2998c339a94Sopenharmony_ci objectProperty.push(propertyObj); 3008c339a94Sopenharmony_ci } 3018c339a94Sopenharmony_ci return objectProperty; 3028c339a94Sopenharmony_ci} 3038c339a94Sopenharmony_ci 3048c339a94Sopenharmony_cifunction getObjRetGenResult(retObjInfo, retGenResult, funcRetOutPath, returnName, setRetPropertyPath) { 3058c339a94Sopenharmony_ci if (retObjInfo.objName !== '') { 3068c339a94Sopenharmony_ci retGenResult = getObjRetContent(funcRetOutPath, retGenResult, returnName); 3078c339a94Sopenharmony_ci let setRetPropertyObj = readFile(setRetPropertyPath); 3088c339a94Sopenharmony_ci setRetPropertyObj = replaceAll(setRetPropertyObj, '[set_objname_replace]', retObjInfo.objName); 3098c339a94Sopenharmony_ci setRetPropertyObj = replaceAll(setRetPropertyObj, '[set_propname_replace]', returnName); 3108c339a94Sopenharmony_ci setRetPropertyObj = replaceAll(setRetPropertyObj, '[set_propvalue_replace]', returnName); 3118c339a94Sopenharmony_ci retGenResult += setRetPropertyObj; 3128c339a94Sopenharmony_ci } 3138c339a94Sopenharmony_ci return retGenResult; 3148c339a94Sopenharmony_ci} 3158c339a94Sopenharmony_ci 3168c339a94Sopenharmony_cifunction getObjRetContent(funcRetOutPath, retGenResult, returnName) { 3178c339a94Sopenharmony_ci let funcReturnTypePath = path.join(__dirname, funcRetOutPath.funcReturnType.returnObj.object); 3188c339a94Sopenharmony_ci let funcReturnType = readFile(funcReturnTypePath); 3198c339a94Sopenharmony_ci retGenResult += replaceAll(funcReturnType, '[return_name_replace]', returnName); 3208c339a94Sopenharmony_ci return retGenResult; 3218c339a94Sopenharmony_ci} 3228c339a94Sopenharmony_ci 3238c339a94Sopenharmony_cifunction getRetTypeContent(funcReturnTypePath, returnName, retGenResult, retObjInfo, setRetProperty) { 3248c339a94Sopenharmony_ci let funcReturnType = readFile(funcReturnTypePath); 3258c339a94Sopenharmony_ci funcReturnType = replaceAll(funcReturnType, '[return_name_replace]', returnName); 3268c339a94Sopenharmony_ci retGenResult += funcReturnType; 3278c339a94Sopenharmony_ci if (retObjInfo.flag) { 3288c339a94Sopenharmony_ci setRetProperty = replaceAll(setRetProperty, '[set_objname_replace]', retObjInfo.objName); 3298c339a94Sopenharmony_ci setRetProperty = replaceAll(setRetProperty, '[set_propname_replace]', returnName); 3308c339a94Sopenharmony_ci setRetProperty = replaceAll(setRetProperty, '[set_propvalue_replace]', returnName); 3318c339a94Sopenharmony_ci retGenResult += setRetProperty; 3328c339a94Sopenharmony_ci } 3338c339a94Sopenharmony_ci return retGenResult; 3348c339a94Sopenharmony_ci} 3358c339a94Sopenharmony_ci 3368c339a94Sopenharmony_cifunction replaceAll(s, sfrom, sto) { 3378c339a94Sopenharmony_ci while (s.indexOf(sfrom) >= 0) { 3388c339a94Sopenharmony_ci s = s.replace(sfrom, sto); 3398c339a94Sopenharmony_ci } 3408c339a94Sopenharmony_ci return s; 3418c339a94Sopenharmony_ci} 3428c339a94Sopenharmony_ci 3438c339a94Sopenharmony_cifunction createParam(parseParamInfo) { 3448c339a94Sopenharmony_ci let param = { 3458c339a94Sopenharmony_ci 'name': '', 3468c339a94Sopenharmony_ci 'type': '' 3478c339a94Sopenharmony_ci }; 3488c339a94Sopenharmony_ci param.name = parseParamInfo.name; 3498c339a94Sopenharmony_ci param.type = parseParamInfo.type; 3508c339a94Sopenharmony_ci return param; 3518c339a94Sopenharmony_ci} 3528c339a94Sopenharmony_ci 3538c339a94Sopenharmony_cimodule.exports = { 3548c339a94Sopenharmony_ci generateDirectFunction 3558c339a94Sopenharmony_ci};