diff --git a/src/gen/analyze/function.js b/src/gen/analyze/function.js index 9aa0af0efa6631a6f4fefa83c142d0f8943c2151..731919e0037e00556fc9bdd61553982a6a8a0f79 100644 --- a/src/gen/analyze/function.js +++ b/src/gen/analyze/function.js @@ -85,26 +85,83 @@ function getFuncParaType(v, interfaceName, data) { return v } -/**函数解析 */ -function analyzeFunction(data, isStatic, 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 = '' +function analyzeFuncNoNameInterface(data, values) { + values = re.replaceAll(re.replaceAll(values, " ", ""), "\n", "") + let interfaceName = "" + let matchNoName = "([:{,;a-zA-Z_0-9]*)\\?*(:[A-Za-z0-9_,;]*)?:{([A-Za-z0-9_]+:"+ + "[A-Za-z0-9_,;]+)([A-Za-z0-9_]+:[A-Za-z0-9_]+)}(}|,|;)?$" + let matchs = re.match(matchNoName, values) 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) + let st = values.lastIndexOf("{") + let end = values.indexOf("}") + let number = NumberIncrease.getAndIncrease(); + interfaceName = "AUTO_INTERFACE_%s".format(number) + let interfaceBody = values.substring(st+1, end) + let typeInterface = "{%s}".format(interfaceBody) + values = re.replaceAll(values, typeInterface, interfaceName) + interfaceBody = re.replaceAll(interfaceBody, ",", ";") + data.interface.push({ + name: interfaceName, + body: analyzeSubInterface(interfaceBody) + }) + } + + matchs = re.match(matchNoName, values) + if(matchs) { + let resNoNameInter = analyzeFuncNoNameInterface(data, values) + values = resNoNameInter.values + } + + let result = { + interfaceName: interfaceName, + values: values + } + return result +} + +function analyseSubReturn(ret, data) { + //匿名interface返回值 function fun4(input: string): { read: number; written: number }; + ret = re.replaceAll(re.replaceAll(ret, " ", ""), "\n", "") + let tt = re.match("{([A-Za-z0-9_]+:[A-Za-z0-9_,;]+)([A-Za-z0-9_]+:[A-Za-z0-9_]+)}", ret) + if (tt) { + let len = tt.regs.length + let res = "" + let interfaceName = "" + for (let i=1; i= 0) { + ret = ret.replaceAll("number", "NUMBER_TYPE_" + NumberIncrease.getAndIncrease()) + } + return ret +} + +/**函数解析 */ +function analyzeFunction(data, isStatic, name, values, ret) { + let res = analyzeFuncNoNameInterface(data, values) + let tmp + let funcType + if (res) { + tmp = analyzeParams(name, res.values) + values = tmp[0] + funcType = tmp[1] + } - let tmp = analyzeParams(name, values) - values = tmp[0] - let funcType = tmp[1] tmp = analyzeReturn(ret) ret = tmp[0] if (tmp[1]) @@ -116,14 +173,12 @@ function analyzeFunction(data, isStatic, name, values, ret) { } for (let j in values) { let v = values[j] - v = getFuncParaType(v, interfaceName, data) + v = getFuncParaType(v, res.interfaceName, data) if (v == null) { NapiLog.logError("analyzeFunction is not support this type %s".format(v)); } } - if (ret.indexOf("number") >= 0) { - ret = ret.replace("number", "NUMBER_TYPE_" + NumberIncrease.getAndIncrease()) - } + ret = analyseSubReturn(ret, data) let result = { name: name, type: funcType, diff --git a/src/gen/analyze/interface.js b/src/gen/analyze/interface.js index 0de3be7e1e5a5190e3cc898220f5d6f58e131185..eb81c7c11c7b2644d5c6056f1744cb347b557bc6 100644 --- a/src/gen/analyze/interface.js +++ b/src/gen/analyze/interface.js @@ -14,11 +14,28 @@ */ const re = require("../tools/re"); const { NumberIncrease } = require("../tools/common"); - const { analyzeFunction } = require("./function"); +/* 匿名interface */ +function analyzeNoNameInterface(valueType, valueName, rsltInterface) { + valueType = re.replaceAll(valueType, " ", "") + let matchs = re.match("{([A-Za-z0-9_]+:[A-Za-z0-9_,;]+)([A-Za-z0-9_]+:[A-Za-z0-9_]+)}$", valueType) + if (matchs) { + let number = NumberIncrease.getAndIncrease(); + let interfaceTypeName = 'AUTO_INTERFACE_%s_%s'.format(valueName, number) + let interfaceBody = valueType.substring(1, valueType.length-1) + interfaceBody = re.replaceAll(interfaceBody, ",", ";") + rsltInterface.push({ + name: interfaceTypeName, + body: analyzeInterface(interfaceBody, rsltInterface) + }) + valueType = interfaceTypeName + } + return valueType +} + /**interface解析 */ -function analyzeInterface(data) {//same as class +function analyzeInterface(data, rsltInterface = null) {//same as class let body = re.replaceAll(data, "\n", "").split(";")// # replace(" ", ""). let result = { value: [], @@ -33,14 +50,14 @@ function analyzeInterface(data) {//same as class if (t == "") break//如果t为空直接返回 let tt = re.match(" *([a-zA-Z0-9_]+) *: *([a-zA-Z_0-9<>,:{}[\\] ]+)", t) if (tt) {//变量 - let valueName = re.getReg(t, tt.regs[1]) let valueType = re.getReg(t, tt.regs[2]) let index = valueType.indexOf("number") while (index !== -1) { valueType = valueType.replace("number", "NUMBER_TYPE_" + NumberIncrease.getAndIncrease()) index = valueType.indexOf("number") - } + } + valueType = analyzeNoNameInterface(valueType, valueName, rsltInterface) result.value.push({ name: valueName, type: valueType diff --git a/src/gen/analyze/namespace.js b/src/gen/analyze/namespace.js index 5d63a51315c856e798dd446dd7195ab6212bec07..e2eff80810e548d434480992bf381c58a8e48f77 100644 --- a/src/gen/analyze/namespace.js +++ b/src/gen/analyze/namespace.js @@ -172,7 +172,7 @@ function parseFunction(matchs, data, result) { matchs.regs[4][0] : matchs.regs[3][0] + funcValue.length), 0, ["", "\n"], null) 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) + let matchFunc = re.match(" *: *([A-Za-z0-9_<>{}:;, .=]+);*", funcRet) let matchFuncArray = re.match(" *: *([A-Za-z0-9]+)(\\[]);*", funcRet) if (matchFuncArray) { funcRet = re.getReg(funcRet, [matchFuncArray.regs[1][0], matchFuncArray.regs[2][1]]) @@ -183,6 +183,11 @@ function parseFunction(matchs, data, result) { else { funcRet = "void" } + funcRet = re.replaceAll(re.replaceAll(funcRet, " ", ""), "\n", "") + + if(funcRet[funcRet.length-1] == ";"){ + funcRet = funcRet.substring(0, funcRet.length-1) + } let funcDetail = analyzeFunction( result, false, funcName, funcValue.substring(1, funcValue.length - 1), funcRet) if (funcDetail != null) @@ -236,7 +241,7 @@ function getParentNameList(firstKey, secondKey, parentStr) { function createInterfaceData (matchs, data, result) { let interfaceName = re.getReg(data, matchs.regs[2]) let interfaceBody = checkOutBody(data, matchs.regs[6][0], null, null) - let bodyObj = analyzeInterface(interfaceBody.substring(1, interfaceBody.length - 1)) + let bodyObj = analyzeInterface(interfaceBody.substring(1, interfaceBody.length - 1), result.interface) let extendsParent = re.getReg(data, matchs.regs[4]) let implementParent = re.getReg(data, matchs.regs[5]) bodyObj.parentNameList = [] @@ -262,6 +267,9 @@ function createInterfaceData (matchs, data, result) { name: interfaceName, body: bodyObj }) + let rr = matchs.regs[6][0] + rr = matchs.regs[6][0] + interfaceBody.length + let tmp = data[rr] data = data.substring(matchs.regs[6][0] + interfaceBody.length, data.length) if (matchs.regs[1][0] != -1) { result.exports.push(interfaceName) diff --git a/src/gen/generate/interface.js b/src/gen/generate/interface.js index b373404272660ff2696c76b3f806ffed7ea99eee..20bdf57b7194c65380826753fb7e5dc1c8125ec5 100644 --- a/src/gen/generate/interface.js +++ b/src/gen/generate/interface.js @@ -58,7 +58,7 @@ function getHDefineOfVariable(name, type, variable) { let arrayType = getArrayTypeTwo(type) let cType = jsType2CType(arrayType) variable.hDefine += "\n std::vector<%s> %s;".format(cType, name) - } else if (type.substring(0, 4) == "Map<" || type.indexOf("{") == 0) { + } else if (type.substring(0, 4) == "Map<" || type.indexOf("{[key:") == 0) { variable.hDefine += mapTypeString(type, name) } else if (type.substring(0, 12) == "NUMBER_TYPE_") { @@ -167,7 +167,7 @@ function getAllPropties(interfaceBody, properties, isParentClass) { interfaceBody.function[i].isParentMember = isParentClass addUniqFunc2List(interfaceBody.function[i], properties.functions) } - if (!isParentClass && interfaceBody.parentNameList.length > 0) { + if (!isParentClass && interfaceBody.parentNameList && interfaceBody.parentNameList.length > 0) { getAllPropties(interfaceBody.parentBody, properties, true) } } @@ -217,7 +217,7 @@ function connectResult(data, inNamespace, name) { implCpp += tmp[2] middleInit += `\n funcList["%s"] = %s%s_middle::%s_middle;`.format(func.name, inNamespace, name, func.name) } - if (data.childList.length > 0) { + if (data.childList && data.childList.length > 0) { // 如果是父类,增加虚析构函数使其具备泛型特征 (基类必须有虚函数才能正确使用dynamic_cast和typeinfo等方法) implH += "\n virtual ~%s(){};".format(name) } diff --git a/src/gen/generate/namespace.js b/src/gen/generate/namespace.js index 834e31b589e027b2e15725715924de80c5b67ba8..31a9c1b2e7034b0d3d1f953ee13dcf1a9bd1f49b 100644 --- a/src/gen/generate/namespace.js +++ b/src/gen/generate/namespace.js @@ -79,7 +79,7 @@ function genParentPropties(currentObj, data, parentBody) { function genExtendsRelation(data) { for (let i in data.interface) { let ifObj = data.interface[i] - if (ifObj.body.parentNameList.length > 0) { + if (ifObj && ifObj.body.parentNameList && ifObj.body.parentNameList.length > 0) { ifObj.body.parentBody = {value:[], function:[]} genParentPropties(ifObj, data, ifObj.body.parentBody) } diff --git a/src/gen/generate/param_generate.js b/src/gen/generate/param_generate.js index 5ba6c1f1cdda589e44095dae4f6ec21408afec51..fbae55d12af4111885e831eb2450d4a073b31407 100644 --- a/src/gen/generate/param_generate.js +++ b/src/gen/generate/param_generate.js @@ -75,7 +75,7 @@ function jsToC(dest, napiVn, type, enumType = 0) { return arrTemplete(dest, napiVn, type); } else if (type == "boolean") { return `BOOLEAN_JS_2_C(%s,%s,%s);`.format(napiVn, "bool", dest) - } else if (type.substring(0, 4) == "Map<" || type.indexOf("{") == 0) { + } else if (type.substring(0, 4) == "Map<" || type.substring(0, 6) == "{[key:") { return mapTempleteFunc(dest, napiVn, type); } else { NapiLog.logError(`do not support to generate jsToC %s,%s,%s`.format(dest, napiVn, type)); @@ -255,6 +255,7 @@ function paramGenerateArray(p, funcValue, param) { let strLen = getMapKeyLen(arrayType) let keyType = arrayType.substring(0, strLen) + let suType = arrayType.substring(0,12) if (arrayType == "string") { arrayType = "std::string" } else if (arrayType == "boolean") { @@ -262,8 +263,6 @@ function paramGenerateArray(p, funcValue, param) { } else if (keyType == "[key:string]:"|| keyType == "Map* in%d = nullptr;".format(arrayType, p) : "\n std::vector<%s> in%d;".format(arrayType, p) @@ -630,7 +629,7 @@ function paramGenerate(p, funcValue, param, data) { else if (isEnum(type, data)) { paramGenerateEnum(data, funcValue, param, p) } - else if (type.substring(0, 4) == "Map<" || type.indexOf("{") == 0) { + else if (type.substring(0, 4) == "Map<" || type.substring(0, 6) == "{[key:") { paramGenerateMap(funcValue, param, p) } else if (isArrayType(type)) { paramGenerateArray(p, funcValue, param); diff --git a/src/gen/generate/return_generate.js b/src/gen/generate/return_generate.js index 99eb2f27802ec4a4b6d3fff329719a98e17c8bfe..6ca8533099d8e052fc91e5b9e4bd38c3932ceb8d 100644 --- a/src/gen/generate/return_generate.js +++ b/src/gen/generate/return_generate.js @@ -83,7 +83,7 @@ function cToJs(value, type, dest, deep = 1) { let arrayType = checkArrayParamType(type) return arrayTempleteFunc(arrayType, deep, dest, value) } - else if (type.substring(0, 4) == "Map<" || type.indexOf("{") == 0) { + else if (type.substring(0, 4) == "Map<" || type.indexOf("{[key:") == 0) { return mapTempleteFunc(type, deep, dest, value) } else if (type.substring(0, 12) == "NUMBER_TYPE_") { @@ -391,7 +391,7 @@ function generateType(type){ else if (type.substring(type.length - 2) == "[]") { return true } - else if (type.substring(0, 4) == "Map<" || type.indexOf("{") == 0) { + else if (type.substring(0, 4) == "Map<" || type.indexOf("{[key:") == 0) { return true } else { @@ -424,7 +424,7 @@ function returnGenerate2(returnInfo, param, data){ param.valueDefine += "%sstd::vector<%s>%s out".format( param.valueDefine.length > 0 ? ", " : "", arrayType, modifiers) } - else if (type.substring(0, 4) == "Map<" || type.indexOf("{") == 0) { + else if (type.substring(0, 4) == "Map<" || type.indexOf("{[key:") == 0) { returnGenerateMap(returnInfo, param) } } diff --git a/test/storytest/test_extends/test.js b/test/storytest/test_extends/test.js index f57779d1c9567ab04d0f78ae58429aad453c2d50..919b015dc1151ae6830e3e1e91b8d18cd2159559 100644 --- a/test/storytest/test_extends/test.js +++ b/test/storytest/test_extends/test.js @@ -75,7 +75,7 @@ describe('Multi extends', function () { }); }); -describe('Function test', function () { +describe('Function test1', function () { it('test parameter and return', function () { let juliya = new Juliya(); let ret = test.findJuliya(juliya); @@ -87,7 +87,9 @@ describe('Function test', function () { assert.strictEqual(ret.size, 0); assert.strictEqual(ret.juliyaSkill, ''); }); +}); +describe('Function test2', function () { it('test sync callback', function () { function getSyncCallback (juliya) { // parent properties @@ -116,29 +118,25 @@ describe('Function test', function () { test.findJuliyaAsync("juli", getAsyncCallback); }); + }); describe('Interface member test', function () { - it('test member', function () { - + it('test member', function () { let tomObj1 = { name: 'tom1', friends: { // Cat object catName: 'tomcat1', - // parent properties aniName: 'ani1', - size: 101 - + size: 101 } }; let tomObj2 = { name: 'tom2', friends: { // Cat object catName: 'tomcat1', - // parent properties aniName: 'ani2', - size: 102 - + size: 102 } }; let tomArray = [tomObj1, tomObj2]; @@ -150,8 +148,8 @@ describe('Interface member test', function () { assert.strictEqual(retTom.friends.aniName, ''); assert.strictEqual(retTom.friends.size, 0); }); + }); - diff --git a/test/storytest/test_interface_no_name/@ohos.test.d.ts b/test/storytest/test_interface_no_name/@ohos.test.d.ts index e66a4ce7f5af8037313d66be6ae098b43796bf28..f3cc4627ecb3a6662111238254184def1488baf3 100644 --- a/test/storytest/test_interface_no_name/@ohos.test.d.ts +++ b/test/storytest/test_interface_no_name/@ohos.test.d.ts @@ -15,7 +15,26 @@ import { AsyncCallback, Callback } from './../basic'; declare namespace napitest { - function fun1(mancc: {name: string, age: number}): string; + function fun1(mancc: {name: string, age: number}): string; //函数单参数非嵌套场景 + + interface TestInterfaceAA { + an: string; + al: string; + } + interface TestInterface { + anchor: string; + align: string; + left: { test1: string, test2: string };//interface域变量场景 + } + + function fun2(fp2: TestInterface): string; + function fun3(name : string, fp3: {nm: string, age: number}): string; //函数多参数非嵌套场景 + function fun4(input: string): { read: number; written: number };//函数返回值场景 + + function fun5(value: {xOffset: number, animation: { duration: number, curve: string}});//函数单参数嵌套场景 + function fun6(nm: string, value: {xOffset: number, animation: { duration: number, curve: string}}); //函数多参数嵌套场景 + function fun7(nm: string, value: {xOffset: number; animation: { duration: number; curve: 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 index f74a29ee2c4c806f7adf73d6ba3ec589e97067d1..bc8b6f84799aa0fb0aae9631b60ef7ca2a27e6f9 100644 --- a/test/storytest/test_interface_no_name/test.js +++ b/test/storytest/test_interface_no_name/test.js @@ -12,15 +12,56 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const { fun1} = require("./out/build/Release/napitest") +const { fun1,fun2, fun3, fun4, fun5, fun6, fun7} = 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} +describe('interface_no_name', function () { + let fp2 = { + anchor:"abc", + align:"testfun2", + left:{ + test1:"fun2", + test2: "t2" + } + } + let value = { + xOffset: 100, + animation: { + duration: 20, + curve: "tst" + } + } + + it('test interface_no_name fun1', function () { let ret = fun1({"name":"abc","age":20}); assert.strictEqual(ret, ''); }); -}); + it('test interface_no_name fun2', function () { + let ret = fun2(fp2); + //assert.strictEqual(ret, ''); + }); + + it('test interface_no_name fun3', function () { + let ret = fun3("fun3p1", {nm:"abc",age:20}); + //assert.strictEqual(ret, ''); + }); + + it('test interface_no_name fun4', function () { + let ret = fun4("name"); + //assert.strictEqual(ret.read, 0); + }); + + it('test interface_no_name fun5', function () { + fun5(value); + //let ret = fun5(value); + //assert.strictEqual(ret, void); + }); + it('test interface_no_name fun6', function () { + fun6("name", value); + }); + it('test interface_no_name fun7', function () { + fun7("name", value); + }); +}); diff --git a/test/storytest/test_optional/@ohos.test.d.ts b/test/storytest/test_optional/@ohos.test.d.ts index 9db3e86e5183e6bda0dabcc82e46b7797713ab29..4140f01749665721186f7d5c518ec4bf2f27817e 100644 --- a/test/storytest/test_optional/@ohos.test.d.ts +++ b/test/storytest/test_optional/@ohos.test.d.ts @@ -24,8 +24,10 @@ declare namespace napitest { interface TestClass1 { interFun1(v0?:string, v1?: string, v2?: number, v3?: boolean): number; } + function fun1(v0:string, v1?: string, v2?: number, v3?: boolean): number; + // test array function fun21(v0: string, v1?: Array): number; interface TestClass2 { @@ -39,11 +41,13 @@ declare namespace napitest { PERMISSION_GRANTED = "2", PERMISSION_PASS = "3", } + export enum HttpStatus { STATUS0 = 0, STATUS1 = 500, STATUS2 = 503, } + function fun31(v0?: HttpStatus, v1?: GrantStatus): number; function fun32(reason: string, callback?: Callback): void; @@ -51,10 +55,11 @@ declare namespace napitest { interface TestClass4 { interFun41(v0?: Human, v1?: Human, v2?: Human): number; } + function fun41(v0?: Human, v1?: Human, v2?: Human): number; function fun42(v0?: Human, v2?: Array): number; - function fun43(v0?: Human, callback?: Callback): void; - function fun44(v0?: {name: string, age: number}): number; + function fun43(v0?: Human, callback?: Callback): void; + function fun44(v0?: {name: string, age: number}): number; } export default napitest; diff --git a/test/storytest/test_optional/test.js b/test/storytest/test_optional/test.js index 19884cde5fd3ba42cae0d4d02bfb49a1564c851a..49cb8c6d28b347701f0c38606d8bb1c336d0b7af 100644 --- a/test/storytest/test_optional/test.js +++ b/test/storytest/test_optional/test.js @@ -83,7 +83,7 @@ describe('Optional2', function () { assert.strictEqual(ret, 0); ret = test.fun32('1'); ret = test.fun32('1', cb3); - }); + }); }); describe('Optional3', function () { @@ -124,5 +124,6 @@ describe('Optional3', function () { ret = tc.interFun41({ name: 'n1', age: 20 }, { name: 'n2', age: 30 }, { name: 'n3', age: 40 }); assert.strictEqual(ret, 0); }); + });