diff --git a/src/cli/dts2cpp/src/gen/analyze/namespace.js b/src/cli/dts2cpp/src/gen/analyze/namespace.js index 3dc09d5e6bba582d612f356ad90e884a81a0b530..5e728d8e75143b3fd44a6c7bde9d5b312cd13eaa 100644 --- a/src/cli/dts2cpp/src/gen/analyze/namespace.js +++ b/src/cli/dts2cpp/src/gen/analyze/namespace.js @@ -239,7 +239,7 @@ function parseType(matchs, data, result) { } } - matchs = re.match('(export )*type ([a-zA-Z]+) *= *([\\(\\):=a-zA-Z<> |\n\']+); ', data); + matchs = re.match('(export )*type ([a-zA-Z]+) *= *([\\(\\):=a-zA-Z<> |\n\']+);', data); if (matchs) { let typeName = re.getReg(data, matchs.regs[2]); let typeBody = re.getReg(data, matchs.regs[3]); diff --git a/src/cli/dts2cpp/src/gen/analyze/params.js b/src/cli/dts2cpp/src/gen/analyze/params.js index 9a658b431cff318fbe4cdb1e7da090f9b0de2879..694ab7e906b79fcfecfdd07a96c60bcfd6597dac 100644 --- a/src/cli/dts2cpp/src/gen/analyze/params.js +++ b/src/cli/dts2cpp/src/gen/analyze/params.js @@ -94,8 +94,10 @@ function analyzeParams(funcName, values) { let optionalFlag = re.getReg(v, matchs.regs[2]) === '?' ? true : false; let checkParamOk = true; - analyzaParamsFunc(optionalFlag, optionalParamCount, v, funcName, checkParamOk, + let retVal = analyzaParamsFunc(optionalFlag, optionalParamCount, v, funcName, checkParamOk, result, matchs, type, funcType); + result = retVal[0]; + funcType = retVal[1]; } else { NapiLog.logError('Failed to analyse parameter [%s] of function [%s].'.format(v, funcName)); @@ -124,6 +126,7 @@ function analyzaParamsFunc(optionalFlag, optionalParamCount, v, funcName, checkP funcType = FuncType.SYNC; } } + return [result, funcType]; } module.exports = { diff --git a/src/cli/dts2cpp/src/gen/analyze/type.js b/src/cli/dts2cpp/src/gen/analyze/type.js index 4669a8810416837ad82c631080851350c11abc43..5787d5881093ea731c0accdc967dc1ebfa6ab9c1 100644 --- a/src/cli/dts2cpp/src/gen/analyze/type.js +++ b/src/cli/dts2cpp/src/gen/analyze/type.js @@ -75,7 +75,7 @@ function analyzeTypeVariable(t, tt, result) { } function analyzeType2(data) { - let body = re.replaceAll(data, ' ', '').split('"|"'); + let body = re.replaceAll(data, ' ', '').split('\'|\''); let result = { element: [], function: [], diff --git a/src/cli/dts2cpp/src/gen/generate/function_onoff.js b/src/cli/dts2cpp/src/gen/generate/function_onoff.js index 6d24a18afbae29ed6b6e5c16b5d4c231265c14b6..9585fb0cb8073ec340325deb8741508498ce7893 100644 --- a/src/cli/dts2cpp/src/gen/generate/function_onoff.js +++ b/src/cli/dts2cpp/src/gen/generate/function_onoff.js @@ -326,7 +326,7 @@ function genCallbackMethodH(param, codeContext) { } function genCallbackMethod(param, className, middleClassName, codeContext) { - let isStrType = param.eventNameIsStr ? '' : `std::string eventName = '[fixed_eventName]';`; + let isStrType = param.eventNameIsStr ? '' : `std::string eventName = "[fixed_eventName]";`; isStrType = replaceAll(isStrType, '[fixed_eventName]', param.eventName); let implCppCallBack = replaceAll(implCppEventCallbakTemplate, '[eventName]', param.eventName); implCppCallBack = replaceAll(implCppCallBack, '[callback_param_type]', param.params); diff --git a/src/cli/dts2cpp/src/gen/generate/param_generate.js b/src/cli/dts2cpp/src/gen/generate/param_generate.js index f827c6e14d1d20856e6eed839aec3ed6f09e6454..5440e71b30728bc44d9e33adaf7e33201e3e481f 100644 --- a/src/cli/dts2cpp/src/gen/generate/param_generate.js +++ b/src/cli/dts2cpp/src/gen/generate/param_generate.js @@ -57,7 +57,9 @@ function getMapCType(type) { else if (mapType[1] === 'any') { mapTypeString = 'std::any' } else if (mapType[1] !== null) { mapTypeString = mapType[1] } } else if (mapType[2] !== undefined) { - if (mapType[2] === 'string') { mapTypeString = 'std::map' } + if (mapType[2] === 'string') { + mapTypeString = 'std::map'; + } else if (mapType[2].substring(0, 12) === 'NUMBER_TYPE_') { mapTypeString = 'std::map'.format(mapType[2]); } @@ -108,6 +110,7 @@ function jsToC(dest, napiVn, type, enumType = 0, optional) { } else { NapiLog.logError(`do not support to generate jsToC %s,%s,%s` .format(dest, napiVn, type), getLogErrInfo()); + return null; } } @@ -435,7 +438,8 @@ function paramGenerateArray(p, funcValue, param) { arrayType = 'bool'; } if (arrayType === 'any') { - return paramGenerateAnyArray(p, name, type, param); + paramGenerateAnyArray(p, name, type, param); + return; } param.valueIn += funcValue.optional ? '\n std::vector<%s>* in%d = nullptr;'.format(arrayType, p) : '\n std::vector<%s> in%d;'.format(arrayType, p); @@ -452,26 +456,32 @@ function paramGenerateArray(p, funcValue, param) { } else if (arrayType === 'boolean') { arrayType = 'bool'; } else if (arrayType === 'any') { - return paramGenerateAnyArray(p, name, type, param); + paramGenerateAnyArray(p, name, type, param); + return; } else if (checkIsMap(keyType)) { let mapValueType = getMapValueType(strLen, keyType, arrayType); arrayType = 'std::map'.format(mapValueType); } - param.valueIn += funcValue.optional ? '\n std::vector<%s>* in%d = nullptr;'.format(arrayType, p) - : '\n std::vector<%s> in%d;'.format(arrayType, p); - let arrValueCheckout = jsToC(inParamName, 'pxt->GetArgv(%d)'.format(getConstNum(p)), type); - arrValueCheckout = getFuncOptionalValue(funcValue, arrValueCheckout, p, arrayType, param); - param.valueCheckout += arrValueCheckout; - param.valueFill += '%svio->in%d'.format(param.valueFill.length > 0 ? ', ' : '', p); - param.valueDefine += '%sstd::vector<%s>%s%s'.format(param.valueDefine.length > 0 ? ', ' - : '', arrayType, modifiers, name); + paramGenArray(param, funcValue, arrayType, p, inParamName, type, modifiers, name); } else { NapiLog.logError('The current version do not support to this param to generate :', name, 'type :', type, getLogErrInfo()); + return; } } +function paramGenArray(param, funcValue, arrayType, p, inParamName, type, modifiers, name) { + param.valueIn += funcValue.optional ? '\n std::vector<%s>* in%d = nullptr;'.format(arrayType, p) + : '\n std::vector<%s> in%d;'.format(arrayType, p); + let arrValueCheckout = jsToC(inParamName, 'pxt->GetArgv(%d)'.format(getConstNum(p)), type); + arrValueCheckout = getFuncOptionalValue(funcValue, arrValueCheckout, p, arrayType, param); + param.valueCheckout += arrValueCheckout; + param.valueFill += '%svio->in%d'.format(param.valueFill.length > 0 ? ', ' : '', p); + param.valueDefine += '%sstd::vector<%s>%s%s'.format(param.valueDefine.length > 0 ? ', ' + : '', arrayType, modifiers, name); +} + function checkIsMap(keyType) { return keyType === '[key:string]:' || keyType === 'Map= 0) { // 多个参数,进行分割 callbackParams = callbackParams.split(','); - for(let i = 0; i < callbackParams.length; i++) { + for (let i = 0; i < callbackParams.length; i++) { NapiLog.logInfo('muilti paramets'); } } else { // 一个参数 @@ -1131,7 +1141,8 @@ function paramGenerate(p, funcValue, param, data) { let inParamName = funcValue.optional ? '(*vio->in' + p + ')' : 'vio->in' + p; let modifiers = funcValue.optional ? '*' : '&'; if (type.indexOf('|') >= 0) { - return paramGenerateUnion(type, param, p, name); + paramGenerateUnion(type, param, p, name); + return; } else if (type === 'string') { paramGenerateCommon(p, 'std::string', funcValue, param, modifiers, inParamName); } else if (type.substring(0, 12) === 'NUMBER_TYPE_' && type.indexOf('[]') < 0) { @@ -1170,7 +1181,7 @@ function eventParamGenerate(p, funcValue, param, data) { return; } if (type.indexOf("'") >= 0) { - type = type.replaceAll(''', ''); + type = type.replaceAll('\'', ''); } let regName = re.match('([a-zA-Z_0-9]+)', type); if (isFuncType(type)) { diff --git a/src/cli/dts2cpp/src/gen/generate/return_generate.js b/src/cli/dts2cpp/src/gen/generate/return_generate.js index 431c39d246de2002f0e2306e776ae57e85419aab..b50f0650d874b4b8209d2c5a1caf39e850afaad2 100644 --- a/src/cli/dts2cpp/src/gen/generate/return_generate.js +++ b/src/cli/dts2cpp/src/gen/generate/return_generate.js @@ -27,20 +27,18 @@ const specialPrefixArr = ['p->', 'vio->out.']; * @returns the real value without prefix, example: xxx, yyy */ function delPrefix(valueName) { - for (var i in specialPrefixArr) { - if (valueName.indexOf(specialPrefixArr[i]) === 0) { - // Find special prefix and delete it. - return valueName.substring(specialPrefixArr[i].length, valueName.length); - } - } - // Without special prefix, nothing is changed. - return valueName; + return specialPrefixArr.reduce((result, prefix) => { + if (valueName.startsWith(prefix)) { + return valueName.substring(prefix.length); + } + return result; + }, valueName); } function cToJsForType(value, type, dest, deep) { let lt = deep; let result = ''; - let ifl = TypeList.getValue(type) + let ifl = TypeList.getValue(type); if (typeof (ifl) === 'object') { for (let i in ifl) { let name2 = ifl[i].name; @@ -49,7 +47,7 @@ function cToJsForType(value, type, dest, deep) { let isSubEnum = EnumList.getValue(type2) ? true : false; let subDest = isSubEnum ? dest : 'tnv%d'.format(lt); let typeType = null; - let ifOptional = ''; // 如果是可选参数则需要增加可选参数是否有值的判断 + let ifOptional = ''; // 如果是可选参数则需要增加可选参数是否有值的判断 if (optional2) { ifOptional = 'if (%s.%s.has_value())\n'.format(value, name2); typeType = cToJs('%s.%s'.format(value, '%s.value()'.format(name2)), type2, subDest, deep + 1); @@ -57,7 +55,7 @@ function cToJsForType(value, type, dest, deep) { typeType = cToJs('%s.%s'.format(value, name2), type2, subDest, deep + 1); } if (isSubEnum) { - result += typeType + result += typeType; } else { result += '%s{\nnapi_value tnv%d = nullptr;\n'.format(ifOptional, lt) + typeType + `\npxt->SetValueProperty(%s, "%s", tnv%d);\n}\n` @@ -91,7 +89,7 @@ function cToJsForInterface(value, type, dest, deep) { if (isSubEnum) { // interface include enum properties - result += interfaceType + result += interfaceType; } else { result += '%s{\nnapi_value tnv%d = nullptr;\n'.format(ifOptional, lt) + interfaceType + `\npxt->SetValueProperty(%s, "%s", tnv%d);\n}\n` @@ -493,7 +491,7 @@ function mapTempleteArray(mapType, tnvdef, lt) { pxt->SetArrayElement(tnv%d, j, tnv%d); }`.format(lt + 2, lt + 2, lt, lt, lt, lt + 2, lt + 1, lt + 2)); } - return ret + return ret; } function returnGenerateMap(returnInfo, param) { @@ -564,7 +562,7 @@ function getReturnFill(returnInfo, param) { valueFillStr += '%svio->out'.format(valueFillStr.length > 0 ? ', ' : ''); } } - } else { // 普通方法的返回参数处理 + } else { // 普通方法的返回参数处理 valueFillStr = 'vio->out'; } return valueFillStr; @@ -590,7 +588,7 @@ function generateOptionalAndUnion(returnInfo, param, data, outParam, c2JsresultN // 判断callback是否有效,若无效,则为普通函数 let paramCallbackFlag = param.callback !== undefined ? true : false; - let paramCallbackIsArrow + let paramCallbackIsArrow; if (paramCallbackFlag) { // 若callback有效, 判断是否是箭头函数 paramCallbackIsArrow = param.callback.isArrowFuncFlag; } @@ -630,7 +628,7 @@ function returnGenerateForArrowCbMultiPara(paramInfo, param, data, i) { else if (type === 'boolean') { param.valueOut += paramInfo.optional ? 'bool* %s = nullptr;' : 'bool %s;\n' .format(paramInfo.name, paramInfo.name); - param.valueDefine += '%sbool%s %s'.format(param.valueDefine.length > 0 ? ', ' : '', modifiers, paramInfo.name) + param.valueDefine += '%sbool%s %s'.format(param.valueDefine.length > 0 ? ', ' : '', modifiers, paramInfo.name); } else if (type.substring(0, 12) === 'NUMBER_TYPE_') { param.valueOut += type + (paramInfo.optional ? '* %s = nullptr;' : ' %s;\n') @@ -671,15 +669,15 @@ function returnGenerateForOnOffMultiPara(paramInfo, param, data) { NapiLog.logInfo('The current void type don\'t need generate'); } else if (type === 'boolean') { - param.valueOut += paramInfo.optional ? 'bool* %s = nullptr;' : 'bool %s;\n'; + param.valueOut += paramInfo.optional ? 'bool* %s = nullptr;' : 'bool %s;\n' .format(paramInfo.name, paramInfo.name); param.params += '%sbool%s %s'.format(param.params.length > 0 ? ', ' : '', modifiers, paramInfo.name); } else if (type.substring(0, 12) === 'NUMBER_TYPE_') { - param.valueOut += type + (paramInfo.optional ? '* %s = nullptr;' : ' %s;\n'); + param.valueOut += type + (paramInfo.optional ? '* %s = nullptr;' : ' %s;\n') .format(paramInfo.name, paramInfo.name); param.params += '%s%s%s %s'.format(param.params.length > 0 ? ', ' : '', type, modifiers, - paramInfo.name) + paramInfo.name); } else if (generateType(type)) { returnGenerate2(paramInfo, param, data); @@ -812,7 +810,7 @@ function returnGenerate2(returnInfo, param, data) { arrayType = jsType2CType(arrayType); if (arrayType === 'any') { param.valueOut = `std::any out;\n - std::string out_type;` + std::string out_type;`; param.valueDefine += '%sstd::any &out'.format(param.valueDefine.length > 0 ? ', ' : ''); } else { param.valueOut = returnInfo.optional ? 'std::vector<%s>* out = nullptr;\n'.format(arrayType) @@ -879,4 +877,4 @@ module.exports = { returnGenerateEnum, objectTempleteFuncReturn, cToJsForType, -} +}; diff --git a/src/cli/dts2cpp/src/gen/generate/type.js b/src/cli/dts2cpp/src/gen/generate/type.js index 87e5594cf6e050db5850a548fefe5529c0dcd981..e5ba5a2e558a73c0722af39a9d9ecd4d58fdc050 100644 --- a/src/cli/dts2cpp/src/gen/generate/type.js +++ b/src/cli/dts2cpp/src/gen/generate/type.js @@ -287,7 +287,7 @@ function generateType(name, data, inNamespace, inNameSpaceEnum, nameSpaceName, t implCpp: implCpp, middleBody: '', middleInit: middleInit, - declarationH: `, + declarationH: ` struct %s;\r`.format(name), middleH: '', midInitEnumDefine: '',