diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5c000a2481501e0e338fcf563ad8d7fac9f233df --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +/entry/.preview +.cxx +/node_modules +/src/node_modules +/src/gen/ttt.js diff --git a/src/gen/analyze.js b/src/gen/analyze.js index d1439ce3c63b91f1929b67459759df35cced949d..8db9dcaf319fbbcfc7a4342a30ac08b50cd6a644 100644 --- a/src/gen/analyze.js +++ b/src/gen/analyze.js @@ -93,7 +93,7 @@ function analyze(data, result) { } function analyzeMatchNamespace(matchs, data, result) { - matchs = re.match("declare namespace ([a-zA-Z0-9]+) ({)", data); + matchs = re.match("declare namespace ([a-zA-Z0-9]+) *({)", data); // 解析declare if (matchs != null) { let namespaceName = re.getReg(data, matchs.regs[1]) diff --git a/src/gen/generate/interface.js b/src/gen/generate/interface.js index c902e08a47f463712bc9a2e5fc8a302a1056b8e7..cf81017cd37542afa34bdb939568725d1444c351 100644 --- a/src/gen/generate/interface.js +++ b/src/gen/generate/interface.js @@ -19,6 +19,7 @@ const { FuncType, InterfaceList, getArrayType } = require("../tools/common"); const { jsToC } = require("./param_generate"); const { cToJs } = require("./return_generate"); const re = require("../tools/re"); +const { NapiLog } = require("../tools/NapiLog"); let middleBodyTmplete = ` class [className]_middle { diff --git a/test/unittest/@ohos.input_sample.d.ts b/test/unittest/@ohos.input_sample.d.ts index dc521ec3cc003642a1540319e5f4c756ce56bd92..1d55c305a547d2c09af94082d04823aed557af62 100755 --- a/test/unittest/@ohos.input_sample.d.ts +++ b/test/unittest/@ohos.input_sample.d.ts @@ -18,6 +18,7 @@ declare namespace napitest { interface Human { name: string; age: number; + isAboy: true; } interface TestClass1 { @@ -27,7 +28,7 @@ declare namespace napitest { nums: Array; strs: Array; mans: Array; - if_direct(v1: string): string; + if_direct(v1: string, v2: boolean): string; if_callback(v1: string, cb: Callback): string; if_async(v1: string, cb: AsyncCallback): string; } @@ -35,6 +36,8 @@ declare namespace napitest { function fun2(v2: string, numcc: Array, mancc: Human): Array; function fun3(v2: string, cb: Callback): void; function fun4(v2: string, cb: AsyncCallback): void; + function fun5(v2: boolean, cb: Callback): boolean; + function fun6(v2: Array): boolean; namespace Space3 { function fun3(v3: string): string; diff --git a/test/unittest/analyze.test.js b/test/unittest/analyze.test.js index d5b07c273837e3b802b66da7631ca85fc1927098..1d982cb28e315027840101d3a48dce16a471755b 100755 --- a/test/unittest/analyze.test.js +++ b/test/unittest/analyze.test.js @@ -12,23 +12,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -let genDir="../../src/gen/" -const { analyzeFile } = require(genDir+"analyze"); -const { analyzeFunction } = require(genDir+"analyze/function"); -const { analyzeInterface } = require(genDir+"analyze/interface"); -const { analyzeNamespace } = require(genDir+"analyze/namespace"); -const { analyzeParams } = require(genDir+"analyze/params"); -const { analyzeReturn } = require(genDir+"analyze/return"); +let genDir = "../../src/gen/" +const { analyzeFile } = require(genDir + "analyze"); +const { analyzeFunction } = require(genDir + "analyze/function"); +const { analyzeInterface } = require(genDir + "analyze/interface"); +const { analyzeNamespace } = require(genDir + "analyze/namespace"); +const { analyzeParams } = require(genDir + "analyze/params"); +const { analyzeReturn } = require(genDir + "analyze/return"); var assert = require("assert"); -const { readFile} = require("../../src/gen/tools/FileRW"); +const { readFile } = require("../../src/gen/tools/FileRW"); describe('Analyze', function () { var correctResult; - before(function(){ - let data=readFile("test/unittest/result.json") - if(data){ - correctResult=JSON.parse(data); + before(function () { + let data = readFile("test/unittest/result.json") + if (data) { + correctResult = JSON.parse(data); } }); @@ -37,13 +37,13 @@ describe('Analyze', function () { let ret = JSON.stringify(structOfTs) assert.strictEqual(ret, correctResult['Analyze']['analyzeFile']); }); - + it('test gen/analyze/function analyzeFunction', function () { let ret = analyzeFunction("a", `b:number`, "string"); let retJson = JSON.stringify(ret) assert.strictEqual(retJson, correctResult['Analyze']['analyzeFunction']); }); - + it('test gen/analyze/interface analyzeInterface', function () { let ret = analyzeInterface("name: string;"); let retJson = JSON.stringify(ret) @@ -62,10 +62,21 @@ describe('Analyze', function () { assert.strictEqual(retJson, correctResult['Analyze']['analyzeParams']); }); + it('test gen/analyze/params analyzeParams', function () { + let ret = analyzeParams("name: boolean"); + let retJson = JSON.stringify(ret) + assert.strictEqual(retJson, correctResult['Analyze']['analyzeParams']); + }); + + it('test gen/analyze/params analyzeParams', function () { + let ret = analyzeParams("name: number"); + let retJson = JSON.stringify(ret) + assert.strictEqual(retJson, correctResult['Analyze']['analyzeParams']); + }); + it('test gen/analyze/return analyzeReturn', function () { let ret = analyzeReturn("string"); let retJson = JSON.stringify(ret) assert.strictEqual(retJson, correctResult['Analyze']['analyzeReturn']); }); - }); diff --git a/test/unittest/generate.test.js b/test/unittest/generate.test.js index 706669f0765a1fde706266e29d6b73c47f3e0330..cb8e30ac23ba84009fd737d54146426cb4878081 100755 --- a/test/unittest/generate.test.js +++ b/test/unittest/generate.test.js @@ -12,69 +12,70 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -let genDir="../../src/gen/" -const { generateNamespace } = require(genDir+"generate/namespace"); -const { analyzeFile } = require(genDir+"analyze"); +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 { 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 { readFile, writeFile } = 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'}; - let value1Se = {name: 'cb', type: 'AsyncCallback'}; - let funParam = {name: 'if_async', type: 4, value: [valueFi,value1Se], ret: 'string'} - let ret = generateFunctionAsync(funParam, 'TestClass1'); - let retJson=JSON.stringify(ret); - return retJson +function funcAsyncAssert() { + let valueFi = { name: 'v1', type: 'string' }; + let value1Se = { name: 'cb', type: 'AsyncCallback' }; + let funParam = { name: 'if_async', type: 4, value: [valueFi, value1Se], ret: 'string' } + let ret = generateFunctionAsync(funParam, 'data', 'TestClass1'); + let retJson = JSON.stringify(ret); + return retJson } -function funcDirectAssert(){ - let valueFi = {name: 'v1', type: 'string'}; - let value1Se = {name: 'cb', type: 'AsyncCallback'}; - let funParam = {name: 'if_async', type: 4, value:[valueFi,value1Se], ret: 'string'}; - let ret = generateFunctionDirect(funParam, 'TestClass1'); - let retJson=JSON.stringify(ret); - return retJson +function funcDirectAssert() { + let valueFi = { name: 'v1', type: 'string' }; + let value1Se = { name: 'cb', type: 'AsyncCallback' }; + let funParam = { name: 'if_async', type: 4, value: [valueFi, value1Se], ret: 'string' }; + let ret = generateFunctionDirect(funParam, 'data', 'TestClass1'); + let retJson = JSON.stringify(ret); + return retJson } -function funcSyncAssert(){ - let valueFi = {name: 'v1', type: 'string'}; - let value1Se = {name: 'cb', type: 'Callback'}; - let funParam = {name: 'if_callback', type: 2, value: [valueFi,value1Se], ret: 'string'}; - let ret = generateFunctionSync(funParam, 'TestClass1'); - let retJson=JSON.stringify(ret); +function funcSyncAssert() { + let valueFi = { name: 'v1', type: 'string' }; + let value1Se = { name: 'cb', type: 'Callback' }; + let funParam = { name: 'if_callback', type: 2, value: [valueFi, value1Se], ret: 'string' }; + let ret = generateFunctionSync(funParam, 'data', 'TestClass1'); + let retJson = JSON.stringify(ret); return retJson } -function cToJsParam(){ +function cToJsParam() { 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' + - ' }' + ' 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 len12=pxt->GetArrayLength(b);\n' + - ' for(uint32_t i12=0;i12SwapJs2CUtf8(pxt->GetArrayElement(b,i12), tt12);\n' + - ' a.push_back(tt12);\n' + - ' }' +function jsToCParam() { + let value = ' uint32_t len2=pxt->GetArrayLength(b);\n' + + ' for(uint32_t i2=0;i2SwapJs2CUtf8(pxt->GetArrayElement(b,i2), tt2);\n' + + ' a.push_back(tt2);\n' + + ' }' return value } -function paramGenerateAndAssert(dataType){ +function paramGenerateAndAssert(dataType) { param = { valueIn: "", valueOut: "", @@ -85,11 +86,11 @@ function paramGenerateAndAssert(dataType){ valueDefine: "" } paramGenerate(0, "a", dataType, param) - let result=JSON.stringify(param); + let result = JSON.stringify(param); return result } -function returnGenerateAndAssert(dataType){ +function returnGenerateAndAssert(dataType) { param = { valueIn: "", valueOut: "", @@ -100,38 +101,55 @@ function returnGenerateAndAssert(dataType){ valueDefine: "" } returnGenerate(dataType, param) - let result=JSON.stringify(param); + let result = JSON.stringify(param); return result } -function partOfTest(){ +function partOfTest() { it('test gen/generate/param_generate jsToC', function () { 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);"); - + writeFile("test/unittest/write1.json", jsToC("a", "b", "Array")); + writeFile("test/unittest/write2.json", jsToCParam()); assert.strictEqual(jsToC("a", "b", "Array"), jsToCParam()); }); it('test gen/generate/return_generate cToJs', function () { - assert.strictEqual(cToJs("a", "string", "b",1), "b = pxt->SwapC2JsUtf8(a.c_str());"); + assert.strictEqual(cToJs("a", "string", "b", 1), "b = pxt->SwapC2JsUtf8(a.c_str());"); - ret = cToJs("a","NUMBER_TYPE_1","b",1) + ret = cToJs("a", "NUMBER_TYPE_1", "b", 1) assert.strictEqual(ret, "b = NUMBER_C_2_JS(pxt, a);"); - assert.strictEqual(cToJs("a","Array","b",1), cToJsParam()); + assert.strictEqual(cToJs("a", "Array", "b", 1), cToJsParam()); }); } +function returnGenerate() { + it('test gen/generate/return_generate returnGenerate', function () { + let retJson = returnGenerateAndAssert("string") + assert.strictEqual(retJson, correctResult['Generate']['returnGenerate']); + + let retJson1 = returnGenerateAndAssert("NUMBER_TYPE_1") + assert.strictEqual(retJson1, correctResult['Generate1']['returnGenerate']); + + let retJson2 = returnGenerateAndAssert("Array") + assert.strictEqual(retJson2, correctResult['Generate2']['returnGenerate']); + + let retJson3 = returnGenerateAndAssert("Array") + assert.strictEqual(retJson3, correctResult['Generate3']['returnGenerate']); + }); +} + describe('Generate', function () { var structOfTs; var testStr; var correctResult; - before(function(){ - let data=readFile("test/unittest/result.json") - if(data){ - correctResult=JSON.parse(data); + before(function () { + let data = readFile("test/unittest/result.json") + if (data) { + correctResult = JSON.parse(data); } structOfTs = analyzeFile("test/unittest/@ohos.input_sample.d.ts"); testStr = readFile("test/unittest/test.txt"); @@ -151,7 +169,7 @@ describe('Generate', function () { it('test gen/generate/interface generateInterface', function () { let ns = structOfTs.declareNamespace[0]; - let ret = generateInterface('a', 'name:string',ns); + let ret = generateInterface('a', 'name:string', ns); assert.strictEqual(JSON.stringify(ret), correctResult['Generate']['generateInterface']); }); @@ -164,26 +182,18 @@ describe('Generate', function () { partOfTest(); it('test gen/generate/param_generate ParamGenerate', function () { - let retJson= paramGenerateAndAssert("string") + let retJson = paramGenerateAndAssert("string") assert.strictEqual(retJson, correctResult['Generate']['ParamGenerate']); - let retJson1= paramGenerateAndAssert("NUMBER_TYPE_1") + let retJson1 = paramGenerateAndAssert("NUMBER_TYPE_1") assert.strictEqual(retJson1, correctResult['Generate1']['ParamGenerate']); - let retJson2= paramGenerateAndAssert("Array") + let retJson2 = paramGenerateAndAssert("Array") assert.strictEqual(retJson2, correctResult['Generate2']['ParamGenerate']); - }); - - it('test gen/generate/return_generate returnGenerate', function () { - let retJson= returnGenerateAndAssert("string") - assert.strictEqual(retJson, correctResult['Generate']['returnGenerate']); - - let retJson1= returnGenerateAndAssert("NUMBER_TYPE_1") - assert.strictEqual(retJson1, correctResult['Generate1']['returnGenerate']); + let retJson3 = paramGenerateAndAssert("Array") + assert.strictEqual(retJson3, correctResult['Generate3']['ParamGenerate']); - let retJson2= returnGenerateAndAssert("Array") - assert.strictEqual(retJson2, correctResult['Generate2']['returnGenerate']); - }); - + }); + returnGenerate(); }); diff --git a/test/unittest/result.json b/test/unittest/result.json index a78827e83dbb7cb15c94d3edec369bf0c254365d..92f7c5d741924abddc27b8fdc17a965f015d8fe7 100644 --- a/test/unittest/result.json +++ b/test/unittest/result.json @@ -35,6 +35,13 @@ }, "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 len13=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i13=0;i13SwapJs2CUtf8(pxt->GetArrayElement(pxt->GetArgv(0),i13), tt13);\\n vio->in0.push_back(tt13);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" + "ParamGenerate": "{\"valueIn\":\"\\n std::vector in0;\",\"valueOut\":\"\",\"valueCheckout\":\" uint32_t len3=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i3=0;i3SwapJs2CUtf8(pxt->GetArrayElement(pxt->GetArgv(0),i3), tt3);\\n vio->in0.push_back(tt3);\\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 len4=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i4=0;i4SwapJs2CBool(pxt->GetArrayElement(pxt->GetArgv(0),i4));\\n vio->in0.push_back(tt4);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" + }, + "retJson2": { + "ParamGenerate": "{\"valueIn\":\"\\n std::vector in0;\",\"valueOut\":\"\",\"valueCheckout\":\" uint32_t len3=pxt->GetArrayLength(pxt->GetArgv(0));\\n for(uint32_t i3=0;i3SwapJs2CUtf8(pxt->GetArrayElement(pxt->GetArgv(0),i3), tt3);\\n vio->in0.push_back(tt3);\\n }\",\"valueFill\":\"vio->in0\",\"valuePackage\":\"\",\"valueDefine\":\"std::vector &a\"}" } } \ No newline at end of file