1/* 2* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. 3* Licensed under the Apache License, Version 2.0 (the "License"); 4* you may not use this file except in compliance with the License. 5* You may obtain a copy of the License at 6* 7* http://www.apache.org/licenses/LICENSE-2.0 8* 9* Unless required by applicable law or agreed to in writing, software 10* distributed under the License is distributed on an "AS IS" BASIS, 11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12* See the License for the specific language governing permissions and 13* limitations under the License. 14*/ 15const { replaceAll, getPrefix } = require("../tools/tool"); 16const { paramGenerate } = require("./param_generate"); 17const { returnGenerate } = require("./return_generate"); 18 19/** 20 * 结果直接返回 21 */ 22let funcDirectTemplete = ` 23struct [funcName]_value_struct {[valueIn][valueOut] 24}; 25 26[static_define]napi_value [funcName]_middle(napi_env env, napi_callback_info info) 27{ 28 XNapiTool *pxt = std::make_unique<XNapiTool>(env, info).release(); 29 if (pxt->IsFailed()) { 30 napi_value err = pxt->GetError(); 31 delete pxt; 32 return err; 33 } 34 [unwarp_instance] 35 struct [funcName]_value_struct *vio = new [funcName]_value_struct(); 36 [valueCheckout] 37 [callFunc] 38 napi_value result = nullptr; 39 [valuePackage][optionalParamDestory] 40 delete vio; 41 if (pxt->IsFailed()) { 42 result = pxt->GetError(); 43 } 44 delete pxt; // release 45 return result; 46}` 47 48let cppTemplate = ` 49bool %s%s(%s) 50{ 51 return true; 52} 53` 54 55function removeEndlineEnter(value) { 56 for (var i = value.length; i > 0; i--) { 57 let len = value.length 58 if (value.substring(len - 1, len) == "\n" || value.substring(len - 1, len) == ' ') { 59 value = value.substring(0, len - 1) 60 } else { 61 value = ' ' + value 62 break 63 } 64 } 65 return value 66} 67 68function generateFunctionDirect(func, data, className) { 69 let middleFunc = replaceAll(funcDirectTemplete, "[funcName]", func.name) 70 if (className == null) { 71 middleFunc = middleFunc.replaceAll("[static_define]", "") 72 middleFunc = middleFunc.replaceAll("[unwarp_instance]", "") 73 } 74 else { 75 middleFunc = middleFunc.replaceAll("[static_define]", "static ") 76 middleFunc = middleFunc.replaceAll("[unwarp_instance]", 77 `void *instPtr = pxt->UnWarpInstance(); 78 %s *pInstance = static_cast<%s *>(instPtr);`.format(className, className)) 79 } 80 // 定义输入,定义输出,解析,填充到函数内,输出参数打包,impl参数定义,可选参数内存释放 81 let param = { valueIn: "", valueOut: "", valueCheckout: "", valueFill: "", 82 valuePackage: "", valueDefine: "", optionalParamDestory: "" } 83 84 for (let i in func.value) { 85 paramGenerate(i, func.value[i], param, data) 86 } 87 let returnInfo = {type: func.ret, optional: false} 88 if (func.ret == 'void') { 89 param.valuePackage = "result = pxt->UndefinedValue();"; 90 } else { 91 returnGenerate(returnInfo, param, data) 92 } 93 middleFunc = replaceAll(middleFunc, "[valueIn]", param.valueIn) // # 输入参数定义 94 if (param.valueOut == "") { 95 middleFunc = replaceAll(middleFunc, "[valueOut]", param.valueOut) // # 输出参数定义 96 } else { 97 middleFunc = replaceAll(middleFunc, "[valueOut]", "\n " + param.valueOut) // # 输出参数定义 98 } 99 param.valueCheckout = removeEndlineEnter(param.valueCheckout) 100 middleFunc = replaceAll(middleFunc, "[valueCheckout]", param.valueCheckout) // # 输入参数解析 101 let callFunc = "%s%s(%s);".format(className == null ? "" : "pInstance->", func.name, param.valueFill) 102 middleFunc = replaceAll(middleFunc, "[callFunc]", callFunc) // 执行 103 middleFunc = replaceAll(middleFunc, "[valuePackage]", param.valuePackage) // 输出参数打包 104 if (param.optionalParamDestory == "") { 105 middleFunc = replaceAll(middleFunc, "[optionalParamDestory]", param.optionalParamDestory) // 可选参数内存释放 106 } else { 107 middleFunc = replaceAll(middleFunc, "[optionalParamDestory]", "\n " + param.optionalParamDestory) // 可选参数内存释放 108 } 109 let prefixArr = getPrefix(data, func) 110 let implH = "" 111 let implCpp = "" 112 if (!func.isParentMember) { 113 // 只有类/接口自己的成员方法需要在.h.cpp中生成,父类/父接口不需要 114 implH = "\n%s%s%sbool %s(%s)%s;".format( 115 prefixArr[0], prefixArr[1], prefixArr[2], func.name, param.valueDefine, prefixArr[3]) 116 implCpp = cppTemplate.format(className == null ? "" : className + "::", func.name, param.valueDefine) 117 } 118 return [middleFunc, implH, implCpp] 119} 120 121module.exports = { 122 generateFunctionDirect 123}