diff --git a/docs/requirement/To-do_list.md b/docs/requirement/To-do_list.md index b7b3dbbc..c2089f92 100644 --- a/docs/requirement/To-do_list.md +++ b/docs/requirement/To-do_list.md @@ -1,25 +1,36 @@ # To-do list -## issue +## History -| 需求 | 新需求提供了什么功能? | 该需求带来的价值、应用场景? | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ---------------------------------------- | -| [新需求]:工具生成代码中增加打印调试信息 | 工具生成代码中增加关键节点信息打印,便于开发者确认流程 | 开发者通过关键信息打印,可以迅速定位问题 | -| [新需求]: 回调返回值不支持number类型&&箭头函数参数为回调函数时,编译报错 | 1.当前回调返回值只支持string/boolean/void, 不支持其为number类型;
2.箭头函数的参数是箭头函数形式的回调函数时,编译报错。
.d.ts文件内容如下:
declare namespace napitest {
export class A {
a: string;
}
export interface InterfaceA {
callFunction: (result: number) => void;
}
export interface InterfaceB {
funcByClass: (a: A, b: number, callback: (result: number) => void, c: InterfaceA) => number;
}
// export const addByClass: (a: A, b: number, callback: (result: number) => void, c: InterfaceA) => number;
}
export default napitest; | 扩展工具的特性范围,提高工具可用性 | -| [新需求]: (等待更佳解决方案)分离生成的工具代码普通方法和回调方法,防止嵌套使用头文件 | 需求背景: 当前工具生成的中间代码,普通方法和回调方法的接口均在一个头文件里,这样会导致嵌套使用头文件造成可读性不强,需要整改生成代码将普通方法和回调方法的接口分离到不同头文件,增加易用性和可读性
需求阻塞点:
由于工具生成的中间代码均在 XXXmiddle.cpp 中,将XXX.h分离成XXXToC.h与XXXToJs.h之后,XXXmiddle.cpp中include, 若.d.ts中的文件声明一个interface类中全部定义为注册回调的方法,按照预期应该将该interface声明在XXXToJs.h中,而由于注册回调的中间代码都在XXXmiddle.cpp中, XXXmiddle.cpp中该interface的构造函数用到了XXXToJs.h中定义的类,这时若要解决这个问题,就需将XXXmiddle.cpp文件进行拆分,这样代码改动太大,需寻求更佳的解决方案
当前进展:
当前修改无法跑过test_on测试用例集 | | -| [新需求]: [napi_tool] on/off第二个参数支持object | [napi_tool] on/off第二个参数支持object,其中object中定义需要注册的回调
function on(type: 'missionEvent', listener: MissionListener): number;
export interface MissionListener {
onMissionCreated(mission: number): void;
onMissionDestroyed(mission: number): void;
} | 扩展注册的使用场景,增加工具易用性 | -| [新需求1130后]: on注册回调的箭头函数支持携带js返回值给C++ | on注册回调的箭头函数支持携带js返回值给C++;
1130后支持 | 业务需要根据回调返回值进行后续处理的场景 | -| [新需求1130后调研]: 支持js业务代码回调接口中的回调js函数 | function_direct处理逻辑覆盖此场景,需要增加只传递回调,不触发的场景
.d.ts定义:
function callbackWrapper(original: Function): (err: Object, value: Object) => void;
调用方式:
function callbackWrapper(original) {
if (typeof original !== 'function') {
let error = new BusinessError(`Parameter error.The type of ${original} must be function`);
throw error;
}
const descriptors = getOwnPropertyDescriptors(original);
if (typeof descriptors.length.value === 'number') {
descriptors.length.value++;
}
if (typeof descriptors.name.value === 'string') {
descriptors.name.value += 'callbackified';
}
function cb(...args) {
callbackified(original, ...args);
}
Object.defineProperties(cb, descriptors);
return cb;
} | 扩展工具的特性范围,提高工具可用性 | -| [新需求1130后]: type, interface支持成员变量any, object, Enum为可选参数 | type, interface当前成员变量支持any, object, Enum可选参数的转换
当前interface/type支持可选参数类型已经包括:number, string, boolean, Array, string/number/boolean[], Map, {[key:string]:string/number/boolean}, number \| string \|boolean
待支持类型:any, object, Enum
.d.ts文件如下所示:
export enum LaunchReason {
UNKNOWN = 0,
START_ABILITY = 1,
CALL = 2,
CONTINUATION = 3,
}
type test =
{
param1?: object;
param2?: any;
param3?: Array;
param4?: Map;
$param5?: any;
param6?: Array;
param7?: Map;
param8?: LaunchReason;
}
interface interfaceTest
{
param1?: object;
param2?: any;
param3?: Array;
param4?: Map;
$param5?: any;
param6?: Array;
param7?: Map;
param8?: LaunchReason;
}
function func(v1: test, v2: interfaceTest): void; | 扩展工具的特性范围,提高工具可用性 | -| modify gn faq and add storytest for api, service, ts tools | 修改gn工具faq文档并为ts, api, service工具增加storytest,可自动化测试 | | -| [调研]ts接口定义入参/变量为any,JS调用时部分参数类型报错 | ts接口定义入参/变量为any,JS调用时参数类型为map、array、interface、interface(enum)嵌套时报错
ts定义如下:
function fun1(v: any, v1: string): number;
JS调用如下:
// map> --当前不支持
ret = test.fun1({"test": ["okay", "okay"], "test1": ["res", "res"]}, 'aaa');
assert.strictEqual(ret, 0);
// Array> --当前不支持
ret = test.fun1([{"test": 15, "test1": 18}, {"test": 15, "test1": 18}], 'aaa');
assert.strictEqual(ret, 0);
// interface --当前不支持
ret = test.fun1({'name': 'aaaa', 'age': 18}, 'aaa');
assert.strictEqual(ret, 0);
// interface --当前不支持
ret = test.fun1({'type': LaunchReason.CALL, 'age': 'aaa'}, 'aaa');
assert.strictEqual(ret, 0); | | +| 版本号 | 修订人 | 修订日期 | 修订描述 | +| ------ | ------ | ------------- | -------- | +| V0.1 | 苟晶晶 | 2024年3月25日 | 新建 | +| | | | | + +## Requirement + +| issue | 描述 | 分析 | 结论 | ToDo | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---------- | ---- | +| 【需求】[napi_tool]:工具生成代码中增加打印调试信息 | 工具生成代码中增加关键节点信息打印,便于开发者确认流程 | 开发者通过关键信息打印,可以迅速定位问题 | 优先级低 | | +| 【需求】[napi_tool]: 箭头函数参数为回调函数时,编译报错 | 箭头函数的参数是箭头函数形式的回调函数时,编译报错。
.d.ts文件内容如下:
declare namespace napitest {
export class A {
a: string;
}
export interface InterfaceA {
callFunction: (result: number) => void;
}
export interface InterfaceB {
funcByClass: (a: A, b: number, callback: (result: number) => void, c: InterfaceA) => number;
}
// export const addByClass: (a: A, b: number, callback: (result: number) => void, c: InterfaceA) => number;
}
export default napitest; | 扩展工具的特性范围,提高工具可用性 | 优先级低 | | +| 【需求】[napi_tool]:(等待更佳解决方案)分离生成的工具代码普通方法和回调方法,防止嵌套使用头文件 | 需求背景: 当前工具生成的中间代码,普通方法和回调方法的接口均在一个头文件里,这样会导致嵌套使用头文件造成可读性不强,需要整改生成代码将普通方法和回调方法的接口分离到不同头文件,增加易用性和可读性
需求阻塞点:
由于工具生成的中间代码均在 XXXmiddle.cpp 中,将XXX.h分离成XXXToC.h与XXXToJs.h之后,XXXmiddle.cpp中include, 若.d.ts中的文件声明一个interface类中全部定义为注册回调的方法,按照预期应该将该interface声明在XXXToJs.h中,而由于注册回调的中间代码都在XXXmiddle.cpp中, XXXmiddle.cpp中该interface的构造函数用到了XXXToJs.h中定义的类,这时若要解决这个问题,就需将XXXmiddle.cpp文件进行拆分,这样代码改动太大,需寻求更佳的解决方案
当前进展:
当前修改无法跑过test_on测试用例集 | 需求调研,提高工具可用性 | 优先级降低 | | +| 【需求】[napi_tool]: on/off第二个参数支持object | [napi_tool] on/off第二个参数支持object,其中object中定义需要注册的回调
function on(type: 'missionEvent', listener: MissionListener): number;
export interface MissionListener {
onMissionCreated(mission: number): void;
onMissionDestroyed(mission: number): void;
} | 扩展注册的使用场景,增加工具易用性 | 优先级中 | | +| 【需求】[napi_tool]: on注册回调的箭头函数支持携带js返回值给C++ | on注册回调的箭头函数支持携带js返回值给C++;
1130后支持 | 需求调研,业务需要根据回调返回值进行后续处理的场景 | 优先级低 | | +| 【需求】[napi_tool]: 支持js业务代码回调接口中的回调js函数 | function_direct处理逻辑覆盖此场景,需要增加只传递回调,不触发的场景
.d.ts定义:
function callbackWrapper(original: Function): (err: Object, value: Object) => void;
调用方式:
function callbackWrapper(original) {
if (typeof original !== 'function') {
let error = new BusinessError(`Parameter error.The type of ${original} must be function`);
throw error;
}
const descriptors = getOwnPropertyDescriptors(original);
if (typeof descriptors.length.value === 'number') {
descriptors.length.value++;
}
if (typeof descriptors.name.value === 'string') {
descriptors.name.value += 'callbackified';
}
function cb(...args) {
callbackified(original, ...args);
}
Object.defineProperties(cb, descriptors);
return cb;
} | 需求调研,扩展工具的特性范围,提高工具可用性。 | 优先级低 | | +| 【需求】[napi_tool]: type, interface支持成员变量any, object, Enum为可选参数 | type, interface当前成员变量支持any, object, Enum可选参数的转换
当前interface/type支持可选参数类型已经包括:number, string, boolean, Array, string/number/boolean[], Map, {[key:string]:string/number/boolean}, number \| string \|boolean
待支持类型:any, object, Enum
.d.ts文件如下所示:
export enum LaunchReason {
UNKNOWN = 0,
START_ABILITY = 1,
CALL = 2,
CONTINUATION = 3,
}
type test =
{
param1?: object;
param2?: any;
param3?: Array;
param4?: Map;
$param5?: any;
param6?: Array;
param7?: Map;
param8?: LaunchReason;
}
interface interfaceTest
{
param1?: object;
param2?: any;
param3?: Array;
param4?: Map;
$param5?: any;
param6?: Array;
param7?: Map;
param8?: LaunchReason;
}
function func(v1: test, v2: interfaceTest): void; | 使用场景较少,建议暂不支持 | 优先级低 | | +| 【需求】[gn, api, service, ts]:modify gn faq and add storytest for api, service, ts tools | 修改gn工具faq文档并为ts, api, service工具增加storytest,可自动化测试 | 确认需继续维护的工具可增加storytest和unittest | 优先级中 | | +| 【需求】[napi_tool]:ts接口定义入参/变量为any,JS调用时部分参数类型报错 | ts接口定义入参/变量为any,JS调用时参数类型为map、array、interface、interface(enum)嵌套时报错
ts定义如下:
function fun1(v: any, v1: string): number;
JS调用如下:
// map> --当前不支持
ret = test.fun1({"test": ["okay", "okay"], "test1": ["res", "res"]}, 'aaa');
assert.strictEqual(ret, 0);
// Array> --当前不支持
ret = test.fun1([{"test": 15, "test1": 18}, {"test": 15, "test1": 18}], 'aaa');
assert.strictEqual(ret, 0);
// interface --当前不支持
ret = test.fun1({'name': 'aaaa', 'age': 18}, 'aaa');
assert.strictEqual(ret, 0);
// interface --当前不支持
ret = test.fun1({'type': LaunchReason.CALL, 'age': 'aaa'}, 'aaa');
assert.strictEqual(ret, 0); | 需求调研 | 优先级低 | | +| 【bug】[napi_tool]on回调&箭头函数回调,回调方式默认为同步,需约定异步回调方式入口 | on回调 & 箭头函数回调,回调方式默认为同步,无异步回调方式入口 | 扩展注册的使用场景,增加工具易用性,建议转需求 | 优先级中 | | +| 【bug】[napi_tool]函数返回值支持array、array<{[key:string]:any}> | 函数返回值不支持array、array<{[key:string]:any}> | 使用场景较少,建议暂不支持 | 优先级低 | | +| 【bug】[napi_tool]支持ts接口文件中namespace域的new函数 | 目前不支持ts接口文件中namespace域interface中带参数的new函数,如:new (value?: { width?: string \| number; height?: string \| number }): PolygonAttribute; | 使用场景较少,建议暂不支持 | 优先级低 | | +| 【bug】[napi_tool]工具代码中若在class1中构造函数使用的class2在class1之后,生成后的代码编译报错 | 若class1中的有参构造的参数有class2时,且class2声明在class1之后,编译时报错:field ‘aPro’ has incomplete type ‘example::A’
.d.ts文件如下所示:
declare namespace example {
class Demo {
constructor(intPro: number, strPro: string, boolPro: boolean, aPro: A);
intPro: number;
strPro: string;
boolPro: boolean;
aPro: A;
}
class A
{
constructor(proA: number, proB: string, proC: boolean);
func1(pro: number);
func2(pro: string);
func3(pro: boolean);
proA: number;
proB: string;
proC: boolean;
}
} | 该bug实际是为了支持class构造函数包含class的情况,建议转需求调研 | 优先级中 | | -| BUG | 发生了什么问题? | 期望行为是什么? | 如何复现该缺陷 | 版本或分支信息 | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -------------- | -| [Bug]:on回调&箭头函数回调,回调方式默认为同步,需约定异步回调方式入口 | on回调 & 箭头函数回调,回调方式默认为同步,无异步回调方式入口 | on回调 & 箭头函数回调,回调方式默认为同步,约定异步回调方式入口 | 代码检视 | master | -| [Bug]: [使用场景少,暂不支持]函数返回值支持array、array<{[key:string]:any}> | 函数返回值不支持array、array<{[key:string]:any}> | 函数返回值支持array、array<{[key:string]:any}> | 增加上述用例 | master | -| [Bug]: [使用场景较少,暂不支持]支持ts接口文件中namespace域的new函数 | 目前不支持ts接口文件中namespace域interface中带参数的new函数,如:new (value?: { width?: string \| number; height?: string \| number }): PolygonAttribute; | 期望支持 | 增加上述测试用例 | master | -| [Bug]: 工具代码中若在class1中使用的class2在class1之后,生成后的代码编译报错 | 若class1中的有参构造的参数有class2时,且class2声明在class1之后,编译时报错:field ‘aPro’ has incomplete type ‘example::A’ | 若class1中的有参构造的参数有class2时,且class2声明在class1之后,成功编译并生成 | .d.ts文件如下所示:
declare namespace example {
class Demo {
constructor(intPro: number, strPro: string, boolPro: boolean, aPro: A);
intPro: number;
strPro: string;
boolPro: boolean;
aPro: A;
}
class A
{
constructor(proA: number, proB: string, proC: boolean);
func1(pro: number);
func2(pro: string);
func3(pro: boolean);
proA: number;
proB: string;
proC: boolean;
}
} | master | +## Change Log + +| 计划 | 进展 | 结论 | 时间 | +| ---- | ---- | ---- | ---- | +| | | | | +| | | | |