• 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][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}