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] 24 25 [valueOut] 26}; 27 28[static_define]napi_value [funcName]_middle(napi_env env, napi_callback_info info) 29{ 30 XNapiTool *pxt = std::make_unique<XNapiTool>(env, info).release(); 31 if (pxt->IsFailed()) { 32 napi_value err = pxt->GetError(); 33 delete pxt; 34 return err; 35 } 36 [unwarp_instance] 37 38 struct [funcName]_value_struct *vio = new [funcName]_value_struct(); 39 40 [valueCheckout] 41 42 [callFunc] 43 44 napi_value result = nullptr; 45 [valuePackage] 46 47 [optionalParamDestory] 48 49 delete vio; 50 if (pxt->IsFailed()) { 51 result = pxt->GetError(); 52 } 53 54 delete pxt; // release 55 return result; 56}` 57 58let cppTemplate = ` 59bool %s%s(%s) 60{ 61 return true; 62} 63` 64 65function generateFunctionDirect(func, data, className) { 66 let middleFunc = replaceAll(funcDirectTemplete, "[funcName]", func.name) 67 if (className == null) { 68 middleFunc = middleFunc.replaceAll("[static_define]", "") 69 middleFunc = middleFunc.replaceAll("[unwarp_instance]", "") 70 } 71 else { 72 middleFunc = middleFunc.replaceAll("[static_define]", "static ") 73 middleFunc = middleFunc.replaceAll("[unwarp_instance]", 74 "%s *pInstance = (%s *)pxt->UnWarpInstance();".format(className, className)) 75 } 76 let param = { 77 valueIn: "",//定义输入 78 valueOut: "",//定义输出 79 valueCheckout: "",//解析 80 valueFill: "",//填充到函数内 81 valuePackage: "",//输出参数打包 82 valueDefine: "",//impl参数定义 83 optionalParamDestory: ""//可选参数内存释放 84 } 85 86 for (let i in func.value) { 87 paramGenerate(i, func.value[i], param, data) 88 } 89 let returnInfo = {type: func.ret, optional: false} 90 if (func.ret == 'void') { 91 param.valuePackage = "result = pxt->UndefinedValue();"; 92 } else { 93 returnGenerate(returnInfo, param, data) 94 } 95 middleFunc = replaceAll(middleFunc, "[valueIn]", param.valueIn)// # 输入参数定义 96 middleFunc = replaceAll(middleFunc, "[valueOut]", param.valueOut)// # 输出参数定义 97 middleFunc = replaceAll(middleFunc, "[valueCheckout]", param.valueCheckout)// # 输入参数解析 98 let callFunc = "%s%s(%s);".format(className == null ? "" : "pInstance->", func.name, param.valueFill) 99 middleFunc = replaceAll(middleFunc, "[callFunc]", callFunc)//执行 100 middleFunc = replaceAll(middleFunc, "[valuePackage]", param.valuePackage)//输出参数打包 101 middleFunc = replaceAll(middleFunc, "[optionalParamDestory]", param.optionalParamDestory)//可选参数内存释放 102 let prefixArr = getPrefix(data, func.isStatic) 103 let implH = "" 104 let implCpp = "" 105 if (!func.isParentMember) { 106 // 只有类/接口自己的成员方法需要在.h.cpp中生成,父类/父接口不需要 107 implH = "\n%s%s%sbool %s(%s);".format( 108 prefixArr[0], prefixArr[1], prefixArr[2], func.name, param.valueDefine) 109 implCpp = cppTemplate.format(className == null ? "" : className + "::", func.name, param.valueDefine) 110 } 111 return [middleFunc, implH, implCpp] 112} 113 114module.exports = { 115 generateFunctionDirect 116}