diff --git a/ets2panda/linter/src/lib/autofixes/Autofixer.ts b/ets2panda/linter/src/lib/autofixes/Autofixer.ts index bfeb543cd969894bb80f546fe2c1b46b411d7645..18b348ffc051aadb2c2e228ab4c3fd1c862a7594 100644 --- a/ets2panda/linter/src/lib/autofixes/Autofixer.ts +++ b/ets2panda/linter/src/lib/autofixes/Autofixer.ts @@ -975,7 +975,38 @@ export class Autofixer { return this.renameSymbolAsIdentifier(symbol, enumMember); } + private static renameAsObjectElementAccessExpression(node: ts.ElementAccessExpression): Autofix[] | undefined { + const parenExpr = ts.isParenthesizedExpression(node.expression) ? node.expression : undefined; + const asExpr = parenExpr && ts.isAsExpression(parenExpr.expression) ? parenExpr.expression : undefined; + if (!asExpr) { + return undefined; + } + + const argument = node.argumentExpression; + const propertyName = ts.isStringLiteral(argument) || ts.isIdentifier(argument) ? argument.text : undefined; + if (!propertyName) { + return undefined; + } + + const realObj = asExpr.expression; + + return [ + { + replacementText: realObj.getText() + '.' + propertyName, + start: node.getStart(), + end: node.getEnd() + } + ]; + } + fixPropertyAccessByIndex(node: ts.ElementAccessExpression): Autofix[] | undefined { + if (ts.isParenthesizedExpression(node.expression) && ts.isAsExpression(node.expression.expression)) { + const assertedType = this.typeChecker.getTypeAtLocation(node.expression.expression.type); + if (this.typeChecker.typeToString(assertedType) === 'object') { + return Autofixer.renameAsObjectElementAccessExpression(node); + } + } + const symbol = this.typeChecker.getSymbolAtLocation(node.argumentExpression); if (symbol === undefined) { return undefined;