diff --git a/src/gen/analyze/function.js b/src/gen/analyze/function.js index cb030505e1b5ca96ded50884c9a3fc508694253d..d3c4679b680cae5619857fbd2793058447049154 100644 --- a/src/gen/analyze/function.js +++ b/src/gen/analyze/function.js @@ -17,10 +17,55 @@ const { FuncType, NumberIncrease, isEnum, EnumValueType, enumIndex } = require(" const { analyzeParams } = require("./params"); const { analyzeReturn } = require("./return"); const { NapiLog } = require("../tools/NapiLog"); +const { randomInt } = require("crypto"); +const { analyzeInterface } = require("./interface"); + +function getFuncParaType(v, interfaceName, data) { + let arrayType = re.match("(Async)*Callback<(Array<([a-zA-Z_0-9]+)>)>", v["type"]) + let parameter = v["type"] + if (arrayType) { + parameter = re.getReg(v["type"], arrayType.regs[2]) + } + if (isEnum(parameter, data)) { + let index = enumIndex(parameter, data) + if (data.enum[index].body.enumValueType == EnumValueType.ENUM_VALUE_TYPE_NUMBER) { + v["type"] = v["type"].replace(parameter, "NUMBER_TYPE_" + NumberIncrease.getAndIncrease()) + } else if (data.enum[index].body.enumValueType == EnumValueType.ENUM_VALUE_TYPE_STRING) { + v["type"] = v["type"].replace(parameter, "string") + } else { + NapiLog.logError(`returnGenerate is not support`); + return null + } + } + + let interfaceType = re.match("{([A-Za-z0-9_]+:[A-Za-z0-9_,]+)([A-Za-z0-9_]+:[A-Za-z0-9_]+)}$", v["type"]) + if (interfaceType) { + v["type"] = interfaceName + } + + if (parameter.indexOf("number") >= 0) { + v["type"] = v["type"].replace("number", "NUMBER_TYPE_" + NumberIncrease.getAndIncrease()) + } + return v +} /**函数解析 */ function analyzeFunction(data, name, values, ret) { values = re.replaceAll(re.replaceAll(values, " ", ""), "\n", "") + let matchs = re.match("([a-zA-Z_0-9]*):{([A-Za-z0-9_]+:[A-Za-z0-9_,]+)([A-Za-z0-9_]+:[A-Za-z0-9_]+)}$", values) + let interfaceName = '' + if (matchs) { + let interfacePara = re.getReg(values, matchs.regs[1]) + let number = randomInt(10); + interfaceName = 'AUTO_INTERFACE_%s_%s'.format(interfacePara, number) + let interfaceBody = values.substring(interfacePara.length+2, values.length-1) + interfaceBody = re.replaceAll(interfaceBody, ",", ";") + data.interface.push({ + name: interfaceName, + body: analyzeInterface(interfaceBody) + }) + } + let tmp = analyzeParams(values) values = tmp[0] let funcType = tmp[1] @@ -35,24 +80,9 @@ function analyzeFunction(data, name, values, ret) { } for (let j in values) { let v = values[j] - let arrayType = re.match("(Async)*Callback<(Array<([a-zA-Z_0-9]+)>)>", v["type"]) - let parameter = v["type"] - if (arrayType) { - parameter = re.getReg(v["type"], arrayType.regs[2]) - } - if(isEnum(parameter, data)){ - let index = enumIndex(parameter, data) - if (data.enum[index].body.enumValueType == EnumValueType.ENUM_VALUE_TYPE_NUMBER) { - v["type"] = v["type"].replace(parameter, "NUMBER_TYPE_" + NumberIncrease.getAndIncrease()) - } else if (data.enum[index].body.enumValueType == EnumValueType.ENUM_VALUE_TYPE_STRING) { - v["type"] = v["type"].replace(parameter, "string") - } else { - NapiLog.logError(`returnGenerate is not support`); - return - } - } - if (parameter.indexOf("number") >= 0) { - v["type"] = v["type"].replace("number", "NUMBER_TYPE_" + NumberIncrease.getAndIncrease()) + v = getFuncParaType(v, interfaceName, data) + if (v == null) { + NapiLog.logError(`returnGenerate is not support`); } } if (ret.indexOf("number") >= 0) { diff --git a/src/gen/generate/param_generate.js b/src/gen/generate/param_generate.js index f9fcaf6703b2b56d1dad5d0c2f6cd17c82a83811..c2adb988d93144a84093f2dd731a8f53e615cf56 100644 --- a/src/gen/generate/param_generate.js +++ b/src/gen/generate/param_generate.js @@ -440,6 +440,13 @@ function paramGenerateCallBack(data, type, param, p) { } } +function isArrayType(type) { + if (type.substring(type.length - 2) == "[]" || type.substring(0, 6) == "Array<") { + return true; + } + return false; +} + // 函数的参数处理 function paramGenerate(p, name, type, param, data) { if (type == "string") { @@ -474,9 +481,10 @@ function paramGenerate(p, name, type, param, data) { } else if (type.substring(0, 4) == "Map<" || type.indexOf("{") == 0) { paramGenerateMap(type, param, p, name) - } - else { + } else if (isArrayType(type)) { paramGenerateArray(p, name, type, param); + } else { + NapiLog.logError("The current version do not support to this param to generate :", name, "type :", type); } } module.exports = { diff --git a/test/storytest/test_interface_no_name/@ohos.test.d.ts b/test/storytest/test_interface_no_name/@ohos.test.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e66a4ce7f5af8037313d66be6ae098b43796bf28 --- /dev/null +++ b/test/storytest/test_interface_no_name/@ohos.test.d.ts @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import { AsyncCallback, Callback } from './../basic'; + +declare namespace napitest { + function fun1(mancc: {name: string, age: number}): string; +} + +export default napitest; \ No newline at end of file diff --git a/test/storytest/test_interface_no_name/test.js b/test/storytest/test_interface_no_name/test.js new file mode 100644 index 0000000000000000000000000000000000000000..f74a29ee2c4c806f7adf73d6ba3ec589e97067d1 --- /dev/null +++ b/test/storytest/test_interface_no_name/test.js @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +const { fun1} = require("./out/build/Release/napitest") +var assert = require("assert"); + +describe('interface_no_name', function () { + it('test interface_no_name fun1', function () { + //let mc = {"name":"abc","age":20} + let ret = fun1({"name":"abc","age":20}); + assert.strictEqual(ret, ''); + }); +}); + +