• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}