修复事件订阅on和off成对出现bug,添加废弃api不校验jsdoc

Signed-off-by: fanjiaojiao0729 <fanjiaojiao@huawei.com>
This commit is contained in:
fanjiaojiao0729 2024-06-28 14:20:39 +08:00
parent 814981aef1
commit 0dc2a77fe8
9 changed files with 241 additions and 31 deletions

View File

@ -536,6 +536,7 @@ const ruleArr = ["API_DOC_ATOMICSERVICE_01",
"API_DOC_PARAM_04",
"API_DOC_PARAM_05",
"API_DOC_PARAM_06",
"API_DOC_PERMISSION_01",
"API_DOC_PERMISSION_02",
"API_DOC_PERMISSION_04",
"API_DOC_READONLY_01",
@ -558,6 +559,7 @@ const ruleArr = ["API_DOC_ATOMICSERVICE_01",
"API_DOC_STATIC_02",
"API_DOC_STRUCT_02",
"API_DOC_STRUCT_05",
"API_DOC_SYSCAP_01",
"API_DOC_SYSCAP_02",
"API_DOC_SYSCAP_03",
"API_DOC_SYSCAP_04",

View File

@ -94,6 +94,8 @@ node --nolazy -r ts-node/register ./src/main.ts -N checkOnline --path 待检查
1. checkEntryLocal(filePathArr, fileRuleArr, output, prId, excel)
根据传入的文件路径和检查规则检查文件中存在的规范错误默认生成excel表格默认不执行兼容性变更校验
2. 打开interface_sdk-js\build-tools\mdFiles.txt文件将待检查文件的路径填入此文件。
注意:文件名与文件名之间直接换行,行尾无需加任何符号。
工具调用命令

View File

@ -0,0 +1,191 @@
{
"data": {
"unknow decorator": [
"API_DOC_UNKNOW_DECORATOR_01"
],
"misspell words": [
"API_DEFINE_SPELLING_01"
],
"naming errors": [
"API_DEFINE_NAME_01",
"API_DEFINE_NAME_02",
"API_DEFINE_HUMP_01",
"API_DEFINE_HUMP_02",
"API_DEFINE_HUMP_03",
"API_DEFINE_HUMP_04",
"API_DEFINE_HUMP_05"
],
"wrong order": [
"API_DOC_ATOMICSERVICE_01",
"API_DOC_CONSTANT_01",
"API_DOC_CROSSPLATFORM_01",
"API_DOC_DEFAULT_02",
"API_DOC_DEPRECATED_02",
"API_DOC_ENUM_02",
"API_DOC_EXAMPLE_01",
"API_DOC_EXTENDS_02",
"API_DOC_FAMODELONLY_01",
"API_DOC_FIRES_01",
"API_DOC_FORM_01",
"API_DOC_IMPLEMENTS_01",
"API_DOC_INTERFACE_01",
"API_DOC_NAMESPACE_02",
"API_DOC_PARAM_06",
"API_DOC_PERMISSION_02",
"API_DOC_READONLY_01",
"API_DOC_RETURNS_03",
"API_DOC_SINCE_02",
"API_DOC_STAGEMODELONLY_02",
"API_DOC_STATIC_01",
"API_DOC_STRUCT_02",
"API_DOC_SYSCAP_02",
"API_DOC_SYSTEMAPI_01",
"API_DOC_TEST_01",
"API_DOC_THROWS_03",
"API_DOC_TYPE_02",
"API_DOC_TYPEDEF_02",
"API_DOC_USEINSTEAD_02"
],
"wrong value": [
"API_DOC_SINCE_01",
"API_DOC_EXTENDS_01",
"API_DOC_IMPLEMENTS_05",
"API_DOC_ENUM_01",
"API_DOC_RETURNS_01",
"API_DOC_RETURNS_02",
"API_DOC_NAMESPACE_01",
"API_DOC_TYPEDEF_01",
"API_DOC_STRUCT_01",
"API_DOC_TYPE_01",
"API_DOC_SYSCAP_01",
"API_DOC_DEFAULT_01",
"API_DOC_DEPRECATED_01",
"API_DOC_PERMISSION_01",
"API_DOC_THROWS_01",
"API_DOC_THROWS_02",
"API_DOC_PERMISSION_05",
"API_DOC_PARAM_01",
"API_DOC_PARAM_02",
"API_DOC_USEINSTEAD_01"
],
"wrong scene": [
"API_DOC_ATOMICSERVICE_03",
"API_DOC_CROSSPLATFORM_03",
"API_DOC_DEPRECATED_03",
"API_DOC_FAMODELONLY_03",
"API_DOC_FORM_03",
"API_DOC_STAGEMODELONLY_01",
"API_DOC_SYSTEMAPI_02",
"API_DOC_TEST_02",
"API_DOC_JSDOC_02",
"API_DOC_SYSCAP_03",
"API_DOC_SINCE_03",
"API_DOC_CONSTANT_02",
"API_DOC_CONSTANT_03",
"API_DOC_DEFAULT_03",
"API_DOC_ENUM_03",
"API_DOC_ENUM_04",
"API_DOC_EXTENDS_03",
"API_DOC_EXTENDS_04",
"API_DOC_IMPLEMENTS_02",
"API_DOC_IMPLEMENTS_03",
"API_DOC_NAMESPACE_03",
"API_DOC_NAMESPACE_04",
"API_DOC_PARAM_04",
"API_DOC_PARAM_05",
"API_DOC_PERMISSION_03",
"API_DOC_PERMISSION_05",
"API_DOC_READONLY_02",
"API_DOC_RETURNS_04",
"API_DOC_RETURNS_06",
"API_DOC_STRUCT_03",
"API_DOC_STRUCT_04",
"API_DOC_THROWS_04",
"API_DOC_TYPE_03",
"API_DOC_TYPE_04",
"API_DOC_TYPEDEF_03",
"API_DOC_TYPEDEF_04",
"API_DOC_USEINSTEAD_03",
"API_DOC_GLOBAL_01",
"API_DOC_GLOBAL_02",
"API_DOC_JSDOC_02",
"API_DOC_PARAM_03",
"API_DOC_ATOMICSERVICE_02",
"API_DOC_CONSTANT_04",
"API_DOC_CROSSPLATFORM_02",
"API_DOC_DEFAULT_04",
"API_DOC_DEPRECATED_04",
"API_DOC_ENUM_05",
"API_DOC_EXAMPLE_02",
"API_DOC_EXTENDS_05",
"API_DOC_FAMODELONLY_02",
"API_DOC_FIRES_02",
"API_DOC_FORM_02",
"API_DOC_IMPLEMENTS_04",
"API_DOC_INTERFACE_02",
"API_DOC_NAMESPACE_05",
"API_DOC_PERMISSION_04",
"API_DOC_READONLY_03",
"API_DOC_RETURNS_05",
"API_DOC_SINCE_04",
"API_DOC_STAGEMODELONLY_03",
"API_DOC_STATIC_02",
"API_DOC_STRUCT_05",
"API_DOC_SYSCAP_04",
"API_DOC_SYSTEMAPI_03",
"API_DOC_TEST_03",
"API_DOC_TYPE_05",
"API_DOC_TYPEDEF_05",
"API_DOC_USEINSTEAD_04"
],
"wrong parameter": [
"API_DEFINE_EVENT_01",
"API_DEFINE_EVENT_02",
"API_DEFINE_EVENT_03",
"API_DEFINE_EVENT_06",
"API_DEFINE_EVENT_08"
],
"limited api pair errors": [
"API_DEFINE_EVENT_05"
],
"forbidden word": [
"API_DEFINE_UNALLOWABLE_01",
"API_DEFINE_UNALLOWABLE_02",
"API_DEFINE_UNALLOWABLE_03"
],
"api change errors": [
"API_CHANGE_INCOMPATIBLE_01",
"API_CHANGE_INCOMPATIBLE_02",
"API_CHANGE_INCOMPATIBLE_03",
"API_CHANGE_INCOMPATIBLE_04",
"API_CHANGE_INCOMPATIBLE_05",
"API_CHANGE_INCOMPATIBLE_06",
"API_CHANGE_INCOMPATIBLE_07",
"API_CHANGE_INCOMPATIBLE_08",
"API_CHANGE_INCOMPATIBLE_09",
"API_CHANGE_INCOMPATIBLE_10",
"API_CHANGE_INCOMPATIBLE_11",
"API_CHANGE_INCOMPATIBLE_12",
"API_CHANGE_INCOMPATIBLE_13",
"API_CHANGE_INCOMPATIBLE_14",
"API_CHANGE_INCOMPATIBLE_15",
"API_CHANGE_INCOMPATIBLE_16"
],
"No jsdoc": [
"API_DOC_JSDOC_01"
]
},
"typeConfig": {
"unknow decorator": "未知的标签名错误",
"misspell words": "单词拼写错误",
"naming errors": "命名错误",
"wrong order": "标签顺序错误",
"wrong value": "标签值错误",
"wrong scene": "标签使用不合法",
"wrong parameter": "事件名称错误",
"limited api pair errors": "事件成对出现错误",
"forbidden word": "禁用词汇",
"api change errors": "API接口非兼容性变更",
"No jsdoc": "缺失注释段"
}
}

View File

@ -34,6 +34,7 @@ export class LocalEntry {
LogUtil.e('API_CHECK_ERROR', error);
} finally {
GenerateFile.writeFile(apiCheckResult, output, {});
if (excel === 'true') {
GenerateFile.writeExcelFile(apiCheckResult);
}

View File

@ -34,7 +34,6 @@ import { TagNameCheck } from './tag_name_check';
import { LegalityCheck } from './tag_legality_check';
import { TagRepeatCheck } from './tag_repeat_check';
import { AddErrorLogs } from './compile_info';
import { toNumber } from 'lodash';
import { TagValueCheck } from './tag_value_check';
import { WordsCheck } from './words_check';
import { ForbiddenWordsCheck } from './forbidden_words_check';
@ -46,9 +45,10 @@ import { ApiChangeCheck } from './check_api_diff';
import { TagInheritCheck } from './tag_inherit_check';
import { ChineseCheck } from "./check_chinese";
import { AnonymousFunctionCheck } from './check_anonymous_function';
export let currentFilePath: string = '';
import { CheckErrorCode } from "./check_error_code";
export let currentFilePath: string = '';
export class Check {
/**
* checker tool main entrance
@ -107,7 +107,6 @@ export class Check {
static checkNodeInfos(baseInfos: ClassInfo[]): void {
let allNodeInfos: ApiInfo[] = [];
Check.getHasJsdocApiInfos(baseInfos, allNodeInfos);
// for all nodes of the current file
allNodeInfos.forEach((singleApi: ApiInfo) => {
const apiJsdoc: Comment.JsDocInfo | undefined = singleApi.getLastJsDocInfo();
@ -173,7 +172,7 @@ export class Check {
const forbiddenWordsCheckResult: ErrorTagFormat = ForbiddenWordsCheck.forbiddenWordsCheck(singleApi as ClassInfo);
const anonymousFunction: ErrorTagFormat = AnonymousFunctionCheck.checkAnonymousFunction(singleApi);
// console.log(anonymousFunction)
if (!orderCheckResult.state) {
const errorBaseInfo: ErrorBaseInfo = new ErrorBaseInfo();
errorBaseInfo
@ -310,9 +309,9 @@ export class Check {
.setErrorType(ErrorType.WRONG_SCENE)
.setLogType(LogType.LOG_JSDOC)
.setErrorInfo(anonymousFunction.errorInfo);
const apiInfoAnonymousFunction: ApiCheckInfo = CommonFunctions.getErrorInfo(singleApi, apiJsdoc, currentFilePath,
const apiInfoAnonymous: ApiCheckInfo = CommonFunctions.getErrorInfo(singleApi, apiJsdoc, currentFilePath,
errorBaseInfo);
AddErrorLogs.addAPICheckErrorLogs(apiInfoAnonymousFunction, compositiveResult, compositiveLocalResult);
AddErrorLogs.addAPICheckErrorLogs(apiInfoAnonymous, compositiveResult, compositiveLocalResult);
}
}
});

View File

@ -36,13 +36,10 @@ export class EventMethodChecker {
const allNodeInfos: ApiInfo[] = Parser.getAllBasicApi(this.apiData) as ApiInfo[];
let allBasicApi: ApiInfo[] = [];
Check.getHasJsdocApiInfos(allNodeInfos, allBasicApi);
const eventMethodInfo: BasicApiInfo[] = [];
const eventMethodInfo: MethodInfo[] = [];
allBasicApi.forEach((basicApi: ApiInfo) => {
const publishVersionValue: string = basicApi.jsDocInfos.length > 0 ? basicApi.jsDocInfos[0].since : '-1';
const publishSince: string = CommonFunctions.getSinceVersion(publishVersionValue);
if (basicApi.apiType === ApiType.METHOD && basicApi.getIsJoinType() &&
publishSince === JSON.stringify(ApiCheckVersion)) {
eventMethodInfo.push(basicApi);
if (basicApi.apiType === ApiType.METHOD && basicApi.getIsJoinType()) {
eventMethodInfo.push(basicApi as MethodInfo);
}
});
const eventMethodDataMap: Map<string, EventMethodData> = this.getEventMethodDataMap(eventMethodInfo);
@ -51,9 +48,15 @@ export class EventMethodChecker {
public checkEventMethod(eventMethodData: Map<string, EventMethodData>): void {
eventMethodData.forEach((eventMethod: EventMethodData) => {
const onEvent: MethodInfo[] = eventMethod.onEvents.length > 0 ? eventMethod.onEvents : [];
const onEventPublishVersionValue: string = onEvent.length > 0 ? onEvent[0].jsDocInfos[0].since : '-1';
const offEvent: MethodInfo[] = eventMethod.offEvents.length > 0 ? eventMethod.offEvents : [];
const offEventPublishVersionValue: string = offEvent.length > 0 ? offEvent[0].jsDocInfos[0].since : '-1';
const isLostOnEvent: boolean = eventMethod.onEvents.length === 0 && eventMethod.offEvents.length !== 0 && offEventPublishVersionValue === JSON.stringify(ApiCheckVersion);
const isLostOffEvent: boolean = eventMethod.onEvents.length !== 0 && eventMethod.offEvents.length === 0 && onEventPublishVersionValue === JSON.stringify(ApiCheckVersion);
// check on&off event pair
if ((eventMethod.onEvents.length === 0 && eventMethod.offEvents.length !== 0) ||
(eventMethod.onEvents.length !== 0 && eventMethod.offEvents.length === 0)) {
if (isLostOnEvent || isLostOffEvent) {
const firstEvent: BasicApiInfo = eventMethod.onEvents.concat(eventMethod.offEvents)[0];
const errorMessage: string = CommonFunctions.createErrorInfo(ErrorMessage.ERROR_EVENT_ON_AND_OFF_PAIR, []);
const errorBaseInfo: ErrorBaseInfo = new ErrorBaseInfo();
@ -81,7 +84,7 @@ export class EventMethodChecker {
offEvnetCallbackNumber = eventCallbackStatus.callbackNumber;
offCallbackRequiredNumber = eventCallbackStatus.requiredCallbackNumber;
}
if (eventMethod.offEvents.length > 0) {
if (eventMethod.offEvents.length > 0 && offEventPublishVersionValue === JSON.stringify(ApiCheckVersion)) {
if ((offEvnetCallbackNumber !== 0 && offEvnetCallbackNumber === eventMethod.offEvents.length &&
offEvnetCallbackNumber === offCallbackRequiredNumber) ||
(offEvnetCallbackNumber === 0 && eventMethod.offEvents.length !== 0)) {
@ -101,15 +104,17 @@ export class EventMethodChecker {
}
// check event first param
const allEvnets: BasicApiInfo[] = eventMethod.onEvents.concat(eventMethod.offEvents)
const allEvents: BasicApiInfo[] = eventMethod.onEvents.concat(eventMethod.offEvents)
.concat(eventMethod.emitEvents).concat(eventMethod.onceEvents);
for (let i = 0; i < allEvnets.length; i++) {
const event: BasicApiInfo = allEvnets[i];
for (let i = 0; i < allEvents.length; i++) {
const event: BasicApiInfo = allEvents[i];
if (!this.checkVersionNeedCheck(event)) {
continue;
}
const eventParams: ParamInfo[] = (event as MethodInfo).getParams();
if (eventParams.length < 1) {
const eventPublishVersion: string = (event as MethodInfo).jsDocInfos[0].since;
if (eventParams.length < 1 && eventPublishVersion === JSON.stringify(ApiCheckVersion)) {
const errorMessage: string = CommonFunctions.createErrorInfo(ErrorMessage.ERROR_EVENT_WITHOUT_PARAMETER, []);
const errorBaseInfo: ErrorBaseInfo = new ErrorBaseInfo();
errorBaseInfo
@ -123,7 +128,10 @@ export class EventMethodChecker {
AddErrorLogs.addAPICheckErrorLogs(apiInfoEvent, compositiveResult, compositiveLocalResult);
continue;
}
const firstParam: ParamInfo = eventParams[0];
const firstParam: ParamInfo | undefined = eventParams.length ? eventParams[0] : undefined;
if (firstParam === undefined || eventPublishVersion !== JSON.stringify(ApiCheckVersion)) {
continue;
}
if (firstParam.getParamType() === ts.SyntaxKind.LiteralType) {
const paramTypeName: string = firstParam.getType()[0].replace(/\'/g, '');
if (paramTypeName === '') {
@ -172,7 +180,7 @@ export class EventMethodChecker {
}
private checkVersionNeedCheck(eventInfo: BasicApiInfo): boolean {
const eventApiVersion:string=CommonFunctions.getSinceVersion(eventInfo.getCurrentVersion())
const eventApiVersion: string = CommonFunctions.getSinceVersion(eventInfo.getCurrentVersion());
return parseInt(eventApiVersion) >= EventConstant.eventMethodCheckVersion;
}
@ -195,9 +203,9 @@ export class EventMethodChecker {
};
}
private getEventMethodDataMap(eventInfos: BasicApiInfo[]): Map<string, EventMethodData> {
private getEventMethodDataMap(eventInfos: MethodInfo[]): Map<string, EventMethodData> {
let eventMethodDataMap: Map<string, EventMethodData> = new Map();
eventInfos.forEach((eventInfo: BasicApiInfo) => {
eventInfos.forEach((eventInfo: MethodInfo) => {
const directorRelations: string[] = [...eventInfo.hierarchicalRelations];
directorRelations.pop();
const apiCompletePath: string = [...directorRelations, this.getEventName(eventInfo.apiName)].join('/');
@ -215,7 +223,7 @@ export class EventMethodChecker {
return eventMethodDataMap;
}
private collectEventMethod(eventMethodData: EventMethodData, eventInfo: BasicApiInfo): EventMethodData {
private collectEventMethod(eventMethodData: EventMethodData, eventInfo: MethodInfo): EventMethodData {
const eventType: string = this.getEventType(eventInfo.apiName);
switch (eventType) {
case 'on':

View File

@ -32,6 +32,13 @@ export class OrderCheck {
if (tagsOrder === undefined) {
return orderCheckResult;
}
const tagsNameOrder: string[] = [];
tagsOrder.forEach((tagsOrder: Comment.CommentTag) => { tagsNameOrder.push(tagsOrder.tag) });
if (tagsNameOrder.includes('deprecated')) {
return orderCheckResult;
}
for (let tagIndex = 0; tagIndex < tagsOrder.length; tagIndex++) {
if (tagIndex + 1 < tagsOrder.length) {
// 获取前后两个tag下标

View File

@ -431,10 +431,10 @@ export class TagValueCheck {
let paramApiName: string = '';
let paramApiType: string[] = [];
if (singleApi. getApiType() === ApiType.TYPE_ALIAS) {
if (singleApi.getApiType() === ApiType.TYPE_ALIAS) {
const typeParams: ParamInfo[] = (singleApi as TypeAliasInfo).getParamInfos();
paramApiName = typeParams.length > paramIndex ? typeParams[paramIndex].getApiName() : '';
paramApiType=typeParams.length > paramIndex ? typeParams[paramIndex].getType() : [];
paramApiType.push(typeParams.length > paramIndex ? typeParams[paramIndex].getApiType() : '');
} else {
const paramApiInfos: ParamInfo[] = (singleApi as MethodInfo).getParams();
paramApiName = paramApiInfos[paramIndex]?.getApiName();

View File

@ -13,13 +13,13 @@
* limitations under the License.
*/
import { BasicApiInfo } from '../parser/ApiInfoDefination';
import { BasicApiInfo, MethodInfo } from '../parser/ApiInfoDefination';
export interface EventMethodData {
onEvents: BasicApiInfo[];
offEvents: BasicApiInfo[];
emitEvents: BasicApiInfo[];
onceEvents: BasicApiInfo[];
onEvents: MethodInfo[];
offEvents: MethodInfo[];
emitEvents: MethodInfo[];
onceEvents: MethodInfo[];
}
export interface CollectParamStatus {