mirror of
https://gitee.com/openharmony/napi_generator
synced 2024-11-27 02:30:36 +00:00
!377 [napi_tool] fix enum bug in class constructor
Merge pull request !377 from 苟晶晶/master
This commit is contained in:
commit
5a62223249
@ -86,7 +86,13 @@ function getHDefineOfVariable(name, type, variable, optional) {
|
||||
variable.hDefine += "\n %s %s;".format(type, name)
|
||||
}
|
||||
} else if (EnumList.getValue(type)) {
|
||||
// 如果是枚举string类型,需要将其转换为std::string类型
|
||||
let enumBasicType = EnumList.getValue(type)[0].type
|
||||
if (enumBasicType === 'string') {
|
||||
variable.hDefine += "\n %s %s;".format('std::string', name)
|
||||
} else {
|
||||
variable.hDefine += "\n %s %s;".format(type, name)
|
||||
}
|
||||
} else if (type.indexOf("Array<") == 0) {
|
||||
typeArrFunctionOne(type, variable, name, optional);
|
||||
} else if (type == "boolean") {
|
||||
@ -343,6 +349,10 @@ function getConstructorFunc(data, param) {
|
||||
getConParam += tmpBody[i] + ";\n";
|
||||
}
|
||||
}
|
||||
let index = getConParam.lastIndexOf(';\n')
|
||||
if (getConParam.substring(index-1, index) === ' ') {
|
||||
getConParam = getConParam.substring(0, index -1)
|
||||
}
|
||||
return getConParam;
|
||||
}
|
||||
|
||||
|
@ -226,14 +226,13 @@ function unionTempleteFunc(dest, napiVn, type, optional) {
|
||||
function jsToCEnum(type, dest, napiVn) {
|
||||
let tt = ""
|
||||
let ifl = EnumList.getValue(type)
|
||||
for (let i in ifl) {
|
||||
let type2 = ifl[i].type
|
||||
if (dest.indexOf("p->") < 0) {
|
||||
tt += jsToC("%s".format(dest), napiVn, type2, type)
|
||||
} else {
|
||||
tt += jsToC("%s".format(dest), getValueProperty(napiVn, dest), type2, type)
|
||||
}
|
||||
let type2 = ""
|
||||
if (ifl && ifl.length > 0) {
|
||||
type2 = ifl[0].type
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
tt += jsToC("%s".format(dest), napiVn, type2, type)
|
||||
return tt
|
||||
}
|
||||
|
||||
|
@ -105,11 +105,33 @@ function c2JsForEnum(deep, type, value, dest, propertyName) {
|
||||
let lt = deep
|
||||
let result = ""
|
||||
let ifl = EnumList.getValue(type)
|
||||
let type2 = ifl[0].type
|
||||
let enumCtoJsStr = cToJs("enumInt%d".format(lt), type2, "tnv%d".format(lt), deep + 1)
|
||||
result += "{\nnapi_value tnv%d = nullptr;\n".format(lt) + "int enumInt%d = (int)(%s);\n".format(lt, value) +
|
||||
enumCtoJsStr + `\npxt->SetValueProperty(%s, "%s", tnv%d);\n}\n`
|
||||
.format(dest, propertyName, lt)
|
||||
let type2 = ""
|
||||
if (ifl && ifl.length > 0) {
|
||||
type2 = ifl[0].type
|
||||
}
|
||||
let enumCtoJsStr = cToJs("enumC2Js%d".format(lt), type2, dest, deep)
|
||||
if (type2 === 'string') {
|
||||
// string型枚举的getvalue函数
|
||||
result += "{\nstd::string enumC2Js%d = %s;\n".format(lt, value) + enumCtoJsStr + "}\n"
|
||||
} else {
|
||||
// number型枚举的getvalue函数
|
||||
result += `
|
||||
std::underlying_type<%s>::type enumType;
|
||||
if (typeid(enumType) == typeid(uint32_t)) {
|
||||
uint32_t enumC2Js%d = static_cast<uint32_t>(%s);
|
||||
%s
|
||||
} else if (typeid(enumType) == typeid(int32_t)) {
|
||||
int32_t enumC2Js%d = static_cast<int32_t>(%s);
|
||||
%s
|
||||
} else if (typeid(enumType) == typeid(int64_t)) {
|
||||
int64_t enumC2Js%d = static_cast<int64_t>(%s);
|
||||
%s
|
||||
} else if (typeid(enumType) == typeid(double_t)) {
|
||||
double_t enumC2Js%d = static_cast<double_t>(%s);
|
||||
%s
|
||||
}`.format(type, lt, value, enumCtoJsStr, lt, value, enumCtoJsStr, lt, value, enumCtoJsStr,
|
||||
lt, value, enumCtoJsStr,)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
|
13
test/storytest/test_class/@ohos.test.d.ts
vendored
13
test/storytest/test_class/@ohos.test.d.ts
vendored
@ -33,12 +33,21 @@ declare namespace napitest {
|
||||
age: number;
|
||||
}
|
||||
|
||||
// 有参构造函数的转换
|
||||
// 有参构造函数的转换,成员变量包含数值型枚举
|
||||
export class Woman {
|
||||
constructor(name_: string, age_: number, isMarried_: boolean);
|
||||
constructor(name_: string, age_: number, isMarried_: boolean, status_: TestStatus);
|
||||
w_name: string;
|
||||
w_age: number;
|
||||
w_isMarried: boolean;
|
||||
w_status: TestStatus;
|
||||
}
|
||||
|
||||
// 有参构造函数的转换,成员变量包含字符型枚举
|
||||
export class Child {
|
||||
constructor(name_: string, age_: number, status_: TestEnumString);
|
||||
w_name: string;
|
||||
w_age: number;
|
||||
w_status: TestEnumString;
|
||||
}
|
||||
|
||||
export enum LaunchReason {
|
||||
|
@ -13,7 +13,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
const { TestClass1, TestClass2, TestClassUse, TestClassLater } = require("./out/build/Release/napitest")
|
||||
const { Demo, Test, funcTest, funcTest2, Woman } = require("./out/build/Release/napitest")
|
||||
const { Demo, Test, funcTest, funcTest2, Woman, Child } = require("./out/build/Release/napitest")
|
||||
const test = require("./out/build/Release/napitest")
|
||||
var assert = require("assert");
|
||||
const { consumers } = require("stream");
|
||||
@ -49,17 +49,66 @@ describe('Class', function () {
|
||||
});
|
||||
|
||||
// export class Woman {
|
||||
// constructor(name_: string, age_: number, isMarried_: boolean);
|
||||
// constructor(name_: string, age_: number, isMarried_: boolean, status_: TestStatus;);
|
||||
// w_name: string;
|
||||
// w_age: number;
|
||||
// w_isMarried: boolean;
|
||||
// w_status: TestStatus;
|
||||
// }
|
||||
it('test Woman constructor', function () {
|
||||
let tc = new Woman("haha", 22, true);
|
||||
console.info("w_name is " + tc.w_name);
|
||||
console.info("w_age is " + tc.w_age);
|
||||
console.info("w_isMarried is " + tc.w_isMarried);
|
||||
let tc = new Woman("haha", 22, true, test.TestStatus.START_ABILITY);
|
||||
console.info("w_name is " + tc.w_name);
|
||||
console.info("w_age is " + tc.w_age);
|
||||
console.info("w_isMarried is " + tc.w_isMarried);
|
||||
console.info("w_status is " + tc.w_status);
|
||||
});
|
||||
|
||||
// export class Child {
|
||||
// constructor(name_: string, age_: number, status_: TestEnumString);
|
||||
// w_name: string;
|
||||
// w_age: number;
|
||||
// w_status: TestEnumString;
|
||||
// }
|
||||
it('test Child constructor', function () {
|
||||
let tc = new Child("xixi", 10, test.TestEnumString.ACTION_SEARCH);
|
||||
console.info("w_name is " + tc.w_name);
|
||||
console.info("w_age is " + tc.w_age);
|
||||
console.info("w_status is " + tc.w_status);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Class Exception Test', function () {
|
||||
// 异常测试:class构造函数包含数值型枚举的异常测试
|
||||
it('test Woman constructor exception', function () {
|
||||
let ret = false;
|
||||
try {
|
||||
let tc = new Woman("hhh", 23, true, 5);
|
||||
console.info("w_name is " + tc.w_name);
|
||||
console.info("w_age is " + tc.w_age);
|
||||
console.info("w_isMarried is " + tc.w_isMarried);
|
||||
console.info("w_status is " + tc.w_status);
|
||||
} catch(err) {
|
||||
ret = true;
|
||||
console.error("error: " + err);
|
||||
}
|
||||
assert.strictEqual(ret, true);
|
||||
});
|
||||
|
||||
// 异常测试:class构造函数包含字符型枚举的异常测试
|
||||
it('test Child constructor exception', function () {
|
||||
let ret = false;
|
||||
try {
|
||||
let tc = new Child("xixi", 10, "ggg");
|
||||
console.info("w_name is " + tc.w_name);
|
||||
console.info("w_age is " + tc.w_age);
|
||||
console.info("w_status is " + tc.w_status);
|
||||
} catch(err) {
|
||||
ret = true;
|
||||
console.error("error: " + err);
|
||||
}
|
||||
assert.strictEqual(ret, true);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('Class defined later', function () {
|
||||
|
@ -638,7 +638,7 @@ function partOfTest() {
|
||||
it('test gen/generate/param_generate jsToCEnum', function () {
|
||||
let ret = jsToCEnum('string', 'vio->in0', 'pxt->GetArgv(0)')
|
||||
let retJson = JSON.stringify(ret)
|
||||
assert.strictEqual(retJson, '""')
|
||||
assert.strictEqual(retJson, 'null')
|
||||
});
|
||||
|
||||
partOfTestTwo()
|
||||
|
Loading…
Reference in New Issue
Block a user