diff --git a/src/gen/analyze/namespace.js b/src/gen/analyze/namespace.js index 775e6f2c36f64c24744a16de202de0144f79bcd3..8d537a8d98ea0559424d5524a115b3f9988ba061 100644 --- a/src/gen/analyze/namespace.js +++ b/src/gen/analyze/namespace.js @@ -180,7 +180,11 @@ function parseFunction(matchs, data, result) { data = data.substring(matchs.regs.length == 5 ? matchs.regs[4][0] : matchs.regs[3][0] + funcValue.length + funcRet.length) let matchFunc = re.match(" *: *([A-Za-z0-9_<>{}:, .=]+);*", funcRet) - if (matchFunc) { + let matchFuncArray = re.match(" *: *([A-Za-z0-9]+)(\\[]);*", funcRet) + if (matchFuncArray) { + funcRet = re.getReg(funcRet, [matchFuncArray.regs[1][0], matchFuncArray.regs[2][1]]) + } + else if (matchFunc) { funcRet = re.getReg(funcRet, matchFunc.regs[1]) } else { diff --git a/src/gen/analyze/params.js b/src/gen/analyze/params.js index 6528c8a077976788a0eb7ae5e8af524cfecd9b79..7befd1309735cdcc3df0daf3cc3f34d116e85ba6 100644 --- a/src/gen/analyze/params.js +++ b/src/gen/analyze/params.js @@ -26,7 +26,7 @@ function analyzeParams(values) { if (v == null) v = values values = values.substring(v.length, values.length) - let matchs = re.match("([a-zA-Z0-9\\.]+)\\?*:([a-zA-Z<>_0-9\\[\\]\\(\\):='{}]+)", v) + let matchs = re.match("([a-zA-Z0-9\\.]+)\\?*: *([a-zA-Z<>_0-9\\[\\]\\(\\):='{}]+)", v) if (matchs != null) { let type = re.getReg(v, matchs.regs[2]) result.push({ "name": re.getReg(v, matchs.regs[1]), "type": type }) diff --git a/src/gen/generate/param_generate.js b/src/gen/generate/param_generate.js index afcf275417f4161bca021af7bac6ea22bbbe3737..5084a895e4e7c712d52a724e406da425854a81ef 100644 --- a/src/gen/generate/param_generate.js +++ b/src/gen/generate/param_generate.js @@ -41,7 +41,7 @@ function jsToC(dest, napiVn, type) { return "pxt->SwapJs2CUtf8(%s, %s);".format(napiVn, dest) } - else if (type.indexOf("[]") > 0) { + else if (type.substring(type.length - 2) == "[]") { return arrTemplete(dest, napiVn, type); } else if (type.substring(0, 12) == "NUMBER_TYPE_") { @@ -76,7 +76,7 @@ function jsToC(dest, napiVn, type) { function arrTemplete(dest, napiVn, type) { let arrayType - if (type.indexOf("[]") > 0) { + if (type.substring(type.length - 2) == "[]") { arrayType = getArrayTypeTwo(type) } else { arrayType = getArrayType(type) @@ -113,7 +113,7 @@ function arrTemplete(dest, napiVn, type) { } function paramGenerateArray(p, name, type, param) { - if (type.indexOf("[]") > 0) { + if (type.substring(type.length - 2) == "[]") { let arrayType = getArrayTypeTwo(type) if (arrayType == "string") arrayType = "std::string" if (arrayType == "boolean") arrayType = "bool" @@ -189,5 +189,6 @@ function paramGenerate(p, name, type, param, data) { } module.exports = { jsToC, + arrTemplete, paramGenerate } \ No newline at end of file diff --git a/src/gen/generate/return_generate.js b/src/gen/generate/return_generate.js index e5d86b9e14dc6e38ed96ec6710aa5dffc9bedf60..d6f923749d1a546f693d0290cd614622d3a8785b 100644 --- a/src/gen/generate/return_generate.js +++ b/src/gen/generate/return_generate.js @@ -12,7 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const { InterfaceList, getArrayType, NumberIncrease, enumIndex, isEnum, EnumValueType } = require("../tools/common"); +const { InterfaceList, getArrayType, NumberIncrease, enumIndex, + isEnum, EnumValueType, getArrayTypeTwo } = require("../tools/common"); const { NapiLog } = require("../tools/NapiLog"); function cToJs(value, type, dest, deep = 1) { @@ -38,8 +39,8 @@ function cToJs(value, type, dest, deep = 1) { } return result } - else if (type.substring(0, 6) == "Array<") { - let arrayType = getArrayType(type) + else if (type.substring(0, 6) == "Array<" || type.substring(type.length - 2) == "[]") { + let arrayType = checkArrayParamType(type) let lt = deep let tnv = dest let tnvdef = `uint32_t len%d=%s.size(); @@ -64,6 +65,17 @@ function cToJs(value, type, dest, deep = 1) { NapiLog.logError(`This type do not generate cToJs %s,%s,%s`.format(value, type, dest)); } +function checkArrayParamType(type) { + let arrayType + if (type.substring(type.length - 2) == "[]") { + arrayType = getArrayTypeTwo(type) + } + else { + arrayType = getArrayType(type) + } + return arrayType +} + function returnGenerate(type, param, data) { param.valueFill += "%svio->out".format(param.valueFill.length > 0 ? ", " : "") if (!isEnum(type, data)) { @@ -97,6 +109,12 @@ function returnGenerate(type, param, data) { param.valueOut = "std::vector<%s> out;".format(arrayType) param.valueDefine += "%sstd::vector<%s> &out".format(param.valueDefine.length > 0 ? ", " : "", arrayType) } + else if (type.substring(type.length - 2) == "[]") { + let arrayType = getArrayTypeTwo(type) + if (arrayType == "string") arrayType = "std::string" + param.valueOut = "std::vector<%s> out;".format(arrayType) + param.valueDefine += "%sstd::vector<%s> &out".format(param.valueDefine.length > 0 ? ", " : "", arrayType) + } else { NapiLog.logError("The current version do not support this type return %s`.format(type)"); } diff --git a/test/unittest/analyze.test.js b/test/unittest/analyze.test.js index 1d982cb28e315027840101d3a48dce16a471755b..a66b3bd8428419861fbbbdfe004fb333d0a8657a 100755 --- a/test/unittest/analyze.test.js +++ b/test/unittest/analyze.test.js @@ -65,13 +65,13 @@ describe('Analyze', function () { it('test gen/analyze/params analyzeParams', function () { let ret = analyzeParams("name: boolean"); let retJson = JSON.stringify(ret) - assert.strictEqual(retJson, correctResult['Analyze']['analyzeParams']); + assert.strictEqual(retJson, correctResult['Analyze']['analyzeParamsBool']); }); it('test gen/analyze/params analyzeParams', function () { let ret = analyzeParams("name: number"); let retJson = JSON.stringify(ret) - assert.strictEqual(retJson, correctResult['Analyze']['analyzeParams']); + assert.strictEqual(retJson, correctResult['Analyze']['analyzeParamsNum']); }); it('test gen/analyze/return analyzeReturn', function () { @@ -79,4 +79,4 @@ describe('Analyze', function () { let retJson = JSON.stringify(ret) assert.strictEqual(retJson, correctResult['Analyze']['analyzeReturn']); }); -}); +}); \ No newline at end of file diff --git a/test/unittest/generate.test.js b/test/unittest/generate.test.js index 673d765b6d8c59fff5f26ec2f81aa0bf3ed1d4fd..01810e3718b297a404fd1f9f3db7f2f629bdc1b8 100755 --- a/test/unittest/generate.test.js +++ b/test/unittest/generate.test.js @@ -16,16 +16,13 @@ let genDir = "../../src/gen/" const { generateNamespace } = require(genDir + "generate/namespace"); const { analyzeFile } = require(genDir + "analyze"); var assert = require("assert"); -const { readFile, writeFile } = require(genDir + "tools/FileRW"); +const { readFile } = require(genDir + "tools/FileRW"); const { jsToC, paramGenerate } = require(genDir + "generate/param_generate"); const { cToJs, returnGenerate } = require(genDir + "generate/return_generate"); const { generateInterface } = require(genDir + "generate/interface"); const { generateFunctionAsync } = require(genDir + "generate/function_async"); const { generateFunctionDirect } = require(genDir + "generate/function_direct"); const { generateFunctionSync } = require(genDir + "generate/function_sync"); -const { AssertionError } = require("assert"); -const { Console } = require("console"); -const rewire = require("rewire"); function funcAsyncAssert() { let valueFi = { name: 'v1', type: 'string' }; @@ -65,6 +62,16 @@ function cToJsParam() { return value } +function cToJsParamArray() { + let value = 'uint32_t len1=a.size();\n' + + ' for(uint32_t i=0;iSwapC2JsUtf8(a[i].c_str());\n' + + ' pxt->SetArrayElement(b, i, tnv1);\n' + + ' }' + return value +} + function jsToCParam() { let value = ' uint32_t len13=pxt->GetArrayLength(b);\n' + ' for(uint32_t i13=0;i13SwapJs2CUtf8(pxt->GetArrayElement(b,i14), tt14);\n' + + ' a.push_back(tt14);\n' + + ' }' + return value +} + function paramGenerateAndAssert(dataType) { param = { valueIn: "", @@ -110,7 +127,9 @@ function partOfTest() { assert.strictEqual(jsToC("a", "b", "string"), "pxt->SwapJs2CUtf8(b, a);"); assert.strictEqual(jsToC("a", "b", "NUMBER_TYPE_1"), "NUMBER_JS_2_C(b,NUMBER_TYPE_1,a);"); + assert.strictEqual(jsToC("a", "b", "boolean"), "BOOLEAN_JS_2_C(b,bool,a);"); assert.strictEqual(jsToC("a", "b", "Array"), jsToCParam()); + assert.strictEqual(jsToC("a", "b", "string[]"), jsToCParamArray()); }); it('test gen/generate/return_generate cToJs', function () { @@ -119,7 +138,12 @@ function partOfTest() { ret = cToJs("a", "NUMBER_TYPE_1", "b", 1) assert.strictEqual(ret, "b = NUMBER_C_2_JS(pxt, a);"); + ret = cToJs("a", "boolean", "b", 1) + assert.strictEqual(ret, "b = pxt->SwapC2JsBool(a);"); + assert.strictEqual(cToJs("a", "Array", "b", 1), cToJsParam()); + + assert.strictEqual(cToJs("a", "string[]", "b", 1), cToJsParamArray()); }); } @@ -137,6 +161,15 @@ function returnGenerateParam(correctResult) { let retJson3 = returnGenerateAndAssert("Array") assert.strictEqual(retJson3, correctResult['Generate3']['returnGenerate']); + + let retJson4 = returnGenerateAndAssert("[string]") + assert.strictEqual(retJson4, correctResult['Generate4']['returnGenerate']); + + let retJson5 = returnGenerateAndAssert("[boolean]") + assert.strictEqual(retJson5, correctResult['Generate5']['returnGenerate']); + + let retJson6 = returnGenerateAndAssert("[boolean]") + assert.strictEqual(retJson6, correctResult['Generate6']['returnGenerate']); }); } @@ -192,8 +225,14 @@ describe('Generate', function () { let retJson3 = paramGenerateAndAssert("Array") assert.strictEqual(retJson3, correctResult['Generate3']['ParamGenerate']); + let retJson4 = paramGenerateAndAssert("[string]") + assert.strictEqual(retJson4, correctResult['Generate4']['ParamGenerate']); + + let retJson5 = paramGenerateAndAssert("[boolean]") + assert.strictEqual(retJson5, correctResult['Generate5']['ParamGenerate']); + }); it('test gen/generate/return_generate returnGenerate', function () { returnGenerateParam(correctResult); }); -}); +}); \ No newline at end of file diff --git a/test/unittest/result.json b/test/unittest/result.json index 48b49be2a47b82b6fcd576c22fedf08e66be1b2b..318c0406518596c47c910b9247c57fd4e2c52b15 100644 --- a/test/unittest/result.json +++ b/test/unittest/result.json @@ -17,8 +17,10 @@ "analyzeFunction": "{\"name\":\"a\",\"type\":1,\"value\":[{\"name\":\"b\",\"type\":\"NUMBER_TYPE_1\"}],\"ret\":\"string\"}", "analyzeInterface": "{\"value\":[{\"name\":\"name\",\"type\":\"string\"}],\"function\":[]}", "analyzeNamespace": "{\"exports\":[],\"enum\":[],\"const\":[],\"type\":[],\"function\":[],\"interface\":[],\"class\":[],\"namespace\":[]}", - "analyzeParams": "[[],1]", - "analyzeReturn": "[\"string\",false]" + "analyzeParams": "[[{\"name\":\"name\",\"type\":\"string\"}],1]", + "analyzeReturn": "[\"string\",false]", + "analyzeParamsBool": "[[{\"name\":\"name\",\"type\":\"boolean\"}],1]", + "analyzeParamsNum": "[[{\"name\":\"name\",\"type\":\"number\"}],1]" }, "Generate": { "generateFunctionAsync": "[\"\\nstruct if_async_value_struct {\\n std::string in0;\\n \\n std::string out;\\n};\\n\\nstatic void if_async_execute(XNapiTool *pxt, void *data)\\n{\\n if_async_value_struct *vio = (if_async_value_struct *)data;\\n TestClass1 *pInstance = (TestClass1 *)pxt->GetAsyncInstance();\\n\\n pInstance->if_async(vio->in0, vio->out);\\n}\\n\\nstatic void if_async_complete(XNapiTool *pxt, void *data)\\n{\\n if_async_value_struct *vio = (if_async_value_struct *)data;\\n \\n napi_value result = nullptr;\\n result = pxt->SwapC2JsUtf8(vio->out.c_str());\\n \\n {\\n napi_value args[1] = {result};\\n pxt->FinishAsync(1, args);\\n }\\n\\n delete vio;\\n}\\n\\nstatic napi_value if_async_middle(napi_env env, napi_callback_info info)\\n{\\n XNapiTool *pxt = std::make_unique(env, info).release();\\n if (pxt->IsFailed()) {\\n napi_value err = pxt->GetError();\\n delete pxt;\\n return err;\\n }\\n pxt->SetAsyncInstance(pxt->UnWarpInstance());\\n\\n struct if_async_value_struct *vio = new if_async_value_struct();\\n \\n pxt->SwapJs2CUtf8(pxt->GetArgv(0), vio->in0);\\n\\n \\n napi_value result = pxt->StartAsync(if_async_execute, vio, if_async_complete, pxt->GetArgc() == 2 ? pxt->GetArgv(1) : nullptr);\\n\\n if (pxt->IsFailed()) {\\n result = pxt->GetError();\\n }\\n return result;\\n}\",\"\\nbool if_async(std::string &v1, std::string &out);\",\"\\nbool TestClass1::if_async(std::string &v1, std::string &out)\\n{\\n return true;\\n}\\n\"]", @@ -41,13 +43,19 @@ }, "Generate2": { "returnGenerate": "{\"valueIn\":\"\",\"valueOut\":\"std::vector out;\",\"valueCheckout\":\"\",\"valueFill\":\"vio->out\",\"valuePackage\":\"napi_value result = nullptr;\\n uint32_t len1=vio->out.size();\\n for(uint32_t i=0;iSwapC2JsUtf8(vio->out[i].c_str());\\n pxt->SetArrayElement(result, i, tnv1);\\n }\",\"valueDefine\":\"std::vector &out\"}", - "ParamGenerate": "{\"valueIn\":\"\\n std::vector in0;\",\"valueOut\":\"\",\"valueCheckout\":\" uint32_t len14=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i14=0;i14SwapJs2CUtf8(pxt->GetArrayElement(pxt->GetArgv(0),i14), tt14);\\n vio->in0.push_back(tt14);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" + "ParamGenerate": "{\"valueIn\":\"\\n std::vector in0;\",\"valueOut\":\"\",\"valueCheckout\":\" uint32_t len15=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i15=0;i15SwapJs2CUtf8(pxt->GetArrayElement(pxt->GetArgv(0),i15), tt15);\\n vio->in0.push_back(tt15);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" }, "Generate3": { "returnGenerate": "{\"valueIn\":\"\",\"valueOut\":\"std::vector out;\",\"valueCheckout\":\"\",\"valueFill\":\"vio->out\",\"valuePackage\":\"napi_value result = nullptr;\\n \",\"valueDefine\":\"std::vector &out\"}", - "ParamGenerate": "{\"valueIn\":\"\\n std::vector in0;\",\"valueOut\":\"\",\"valueCheckout\":\" uint32_t len15=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i15=0;i15SwapJs2CBool(pxt->GetArrayElement(pxt->GetArgv(0),i15));\\n vio->in0.push_back(tt15);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" + "ParamGenerate": "{\"valueIn\":\"\\n std::vector in0;\",\"valueOut\":\"\",\"valueCheckout\":\" uint32_t len16=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i16=0;i16SwapJs2CBool(pxt->GetArrayElement(pxt->GetArgv(0),i16));\\n vio->in0.push_back(tt16);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" }, "retJson2": { "ParamGenerate": "{\"valueIn\":\"\\n std::vector in0;\",\"valueOut\":\"\",\"valueCheckout\":\" uint32_t len16=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i16=0;i16SwapJs2CUtf8(pxt->GetArrayElement(pxt->GetArgv(0),i16), tt16);\\n vio->in0.push_back(tt16);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" + }, + "Generate4": { + "ParamGenerate": "{\"valueIn\":\"\",\"valueOut\":\"\",\"valueCheckout\":\"\",\"valueFill\":\"\",\"valuePackage\":\"\",\"valueDefine\":\"\"}" + }, + "Generate5": { + "ParamGenerate": "{\"valueIn\":\"\",\"valueOut\":\"\",\"valueCheckout\":\"\",\"valueFill\":\"\",\"valuePackage\":\"\",\"valueDefine\":\"\"}" } } \ No newline at end of file