diff --git a/ets2panda/linter/homecheck/src/checker/migration/InteropS2DObjectLiteralsCheck.ts b/ets2panda/linter/homecheck/src/checker/migration/InteropS2DObjectLiteralsCheck.ts index 79c14788bdc77d356e06091829b11d10c47f7a83..9e316294f2c9765356eba8f59fe79757c6673036 100644 --- a/ets2panda/linter/homecheck/src/checker/migration/InteropS2DObjectLiteralsCheck.ts +++ b/ets2panda/linter/homecheck/src/checker/migration/InteropS2DObjectLiteralsCheck.ts @@ -33,6 +33,7 @@ import { IssueReport } from '../../model/Defects'; import { ArkClass, ClassCategory } from 'arkanalyzer/lib/core/model/ArkClass'; import { Language } from 'arkanalyzer/lib/core/model/ArkFile'; import { getLanguageStr, getLineAndColumn } from './Utils'; +import { ArkThisRef } from 'arkanalyzer'; const logger = Logger.getLogger(LOG_MODULE_TYPE.HOMECHECK, 'InteropS2DObjectLiteralCheck'); const gMetaData: BaseMetaData = { @@ -105,6 +106,11 @@ export class InteropS2DObjectLiteralCheck implements BaseChecker { } private checkAssignWithObjectLiteral(stmt: ArkAssignStmt, target: ArkMethod): void { + // this = thisRef 赋值语句需要跳过,否则该class一定会被扫描一遍,此次扫描多余,且可能会产生行号为-1的错误issue + // 若此class有问题,会在真正使用到此class的源码处进行告警,无需查找this ref语句 + if (stmt.getRightOp() instanceof ArkThisRef) { + return; + } const leftOpType = stmt.getLeftOp().getType(); if (!(leftOpType instanceof ClassType)) { return; diff --git a/ets2panda/linter/homecheck/src/checker/migration/ObservedDecoratorCheck.ts b/ets2panda/linter/homecheck/src/checker/migration/ObservedDecoratorCheck.ts index 8f9c5cdb03a5d1dce03fee6273281375b72ca439..59c04a84d8ba0ee9b07e916f30e9a6d23dfaa4c4 100644 --- a/ets2panda/linter/homecheck/src/checker/migration/ObservedDecoratorCheck.ts +++ b/ets2panda/linter/homecheck/src/checker/migration/ObservedDecoratorCheck.ts @@ -78,6 +78,7 @@ export class ObservedDecoratorCheck implements BaseChecker { public check = (arkClass: ArkClass): void => { const scene = arkClass.getDeclaringArkFile().getScene(); + const projectName = arkClass.getDeclaringArkFile().getProjectName(); for (const field of arkClass.getFields()) { if (!field.getDecorators().some(d => DECORATOR_SET.has(d.getKind()))) { continue; @@ -88,6 +89,10 @@ export class ObservedDecoratorCheck implements BaseChecker { let issueClasses: Set = new Set(); // ArkAnalyzer此处有问题,若field的类型注解为unclear type,会用右边的替换左边的。 const fieldType = field.getType(); + // 此处仅对field为class类型进行检查,包含class和interface,非class类型不在本规则检查范围之内 + if (!(fieldType instanceof ClassType)) { + continue; + } const initializers = field.getInitializer(); let canFindAllTargets = true; @@ -121,10 +126,10 @@ export class ObservedDecoratorCheck implements BaseChecker { locals.add(rightOp); } else if (rightOp instanceof ArkNewExpr) { // 此处需要区分field = new cls()和field = {}两种场景,查找完毕需继续遍历stmts以解析条件表达式造成的多赋值场景 - canFindAllTargets = canFindAllTargets && this.handleNewExpr(scene, fieldType, rightOp, usedClasses); + canFindAllTargets = canFindAllTargets && this.handleNewExpr(scene, fieldType, rightOp, usedClasses, projectName); } else if (rightOp instanceof AbstractInvokeExpr) { canFindAllTargets = - canFindAllTargets && this.handleInvokeExpr(scene, fieldType, rightOp, usedClasses); + canFindAllTargets && this.handleInvokeExpr(scene, fieldType, rightOp, usedClasses, projectName); } else { // 对应场景为使用条件表达式cond ? 123 : 456赋值时 continue; @@ -160,11 +165,15 @@ export class ObservedDecoratorCheck implements BaseChecker { // 此处需要区分field = new cls()和field = {}两种场景 // 对于field = new cls()场景,需要查找此右边class的所有父class // 对于field = {}场景,需要查找左边field类型为class时的所有父class - private handleNewExpr(scene: Scene, fieldType: Type, rightOp: ArkNewExpr, targets: Set): boolean { + private handleNewExpr(scene: Scene, fieldType: Type, rightOp: ArkNewExpr, targets: Set, projectName: string): boolean { const target = scene.getClass(rightOp.getClassType().getClassSignature()); if (target === null) { return false; } + // class为非本项目的内容时,表示调用到三方库、SDK等内容,不再继续进行查找 + if (target.getDeclaringArkFile().getProjectName() !== projectName) { + return true; + } if (!target.isAnonymousClass()) { // 理论上来说ArkNewExpr中的class一定ClassCategory.CLASS,此处仍然显式的检查一次 @@ -186,6 +195,10 @@ export class ObservedDecoratorCheck implements BaseChecker { if (fieldClass === null) { return false; } + // fieldClass为非本项目的内容时,表示调用到三方库、SDK等内容,不再继续进行查找 + if (fieldClass.getDeclaringArkFile().getProjectName() !== projectName) { + return true; + } if (fieldClass.getCategory() !== ClassCategory.CLASS) { return true; } @@ -201,13 +214,18 @@ export class ObservedDecoratorCheck implements BaseChecker { scene: Scene, fieldType: Type, invokeExpr: AbstractInvokeExpr, - targets: Set + targets: Set, + projectName: string ): boolean { let canFindAllTargets = true; const callMethod = scene.getMethod(invokeExpr.getMethodSignature()); if (callMethod === null) { return false; } + // callMethod为非本项目的内容时,表示调用到三方库、SDK等内容,不再继续进行查找 + if (callMethod.getDeclaringArkFile().getProjectName() !== projectName) { + return true; + } const stmts = callMethod.getBody()?.getCfg().getStmts(); if (stmts === undefined) { return false;