From ed74b2ec14345aa1023b135131d6f4cb134b0f3a Mon Sep 17 00:00:00 2001 From: ZhongNing Date: Wed, 28 May 2025 21:46:22 +0800 Subject: [PATCH] fix arkts-interop-js2s-access-js-prop Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICBCHM Test scenarios: fix bug Signed-off-by: ZhongNing --- ets2panda/linter/src/lib/TypeScriptLinter.ts | 44 ++++++---- .../interop_convert_import.ets.arkts2.json | 10 +++ .../interop_import_typeof_js.ets.arkts2.json | 20 ----- .../interop_import_typeof_js.ets.autofix.json | 78 +++++++---------- .../interop_import_typeof_js.ets.migrate.ets | 2 +- .../interop_import_typeof_js.ets.migrate.json | 2 +- .../interop_not_have_property_arkts2.ets | 3 +- ...p_not_have_property_arkts2.ets.arkts2.json | 30 +++++++ ..._not_have_property_arkts2.ets.autofix.json | 87 ++++++++++++++++++- ...p_not_have_property_arkts2.ets.migrate.ets | 3 +- .../interop/no_js_instanceof.ets.arkts2.json | 20 +++++ 11 files changed, 205 insertions(+), 94 deletions(-) diff --git a/ets2panda/linter/src/lib/TypeScriptLinter.ts b/ets2panda/linter/src/lib/TypeScriptLinter.ts index c6c80448bc..a5f7615293 100644 --- a/ets2panda/linter/src/lib/TypeScriptLinter.ts +++ b/ets2panda/linter/src/lib/TypeScriptLinter.ts @@ -1377,7 +1377,7 @@ export class TypeScriptLinter extends BaseTypeScriptLinter { this.handleTsInterop(propertyAccessNode, () => { this.checkInteropForPropertyAccess(propertyAccessNode); }); - this.propertyAccessExpressionForInterop(exprSym, propertyAccessNode); + this.propertyAccessExpressionForInterop(propertyAccessNode); if (this.isPrototypePropertyAccess(propertyAccessNode, exprSym, baseExprSym, baseExprType)) { this.incrementCounters(propertyAccessNode.name, FaultID.Prototype); } @@ -1413,25 +1413,33 @@ export class TypeScriptLinter extends BaseTypeScriptLinter { } } - propertyAccessExpressionForInterop( - exprSym: ts.Symbol | undefined, - propertyAccessNode: ts.PropertyAccessExpression - ): void { - if (this.useStatic && this.options.arkts2) { - const declaration = exprSym?.declarations?.[0]; - if (declaration?.getSourceFile().fileName.endsWith(EXTNAME_JS)) { - if ( - ts.isBinaryExpression(propertyAccessNode.parent) && - propertyAccessNode.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken - ) { - const autofix = this.autofixer?.fixInteropBinaryExpression(propertyAccessNode.parent); - this.incrementCounters(propertyAccessNode.parent, FaultID.InteropObjectProperty, autofix); - } else { - const autofix = this.autofixer?.fixInteropPropertyAccessExpression(propertyAccessNode); - this.incrementCounters(propertyAccessNode, FaultID.InteropObjectProperty, autofix); - } + propertyAccessExpressionForInterop(propertyAccessNode: ts.PropertyAccessExpression): void { + if (!this.useStatic || !this.options.arkts2) { + return; + } + + const getFirstObjectNode = (propertyAccessNode: ts.PropertyAccessExpression): ts.Expression => { + let current: ts.Expression = propertyAccessNode.expression; + while (ts.isPropertyAccessExpression(current)) { + current = current.expression; } + + return current; } + + const firstObjNode = getFirstObjectNode(propertyAccessNode); + const isFromJs = this.tsUtils.isJsImport(firstObjNode); + + if(isFromJs) { + if (ts.isBinaryExpression(propertyAccessNode.parent) && + propertyAccessNode.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken) { + const autofix = this.autofixer?.fixInteropBinaryExpression(propertyAccessNode.parent); + this.incrementCounters(propertyAccessNode.parent, FaultID.InteropObjectProperty, autofix); + } else { + const autofix = this.autofixer?.fixInteropPropertyAccessExpression(propertyAccessNode); + this.incrementCounters(propertyAccessNode, FaultID.InteropObjectProperty, autofix); + } + } } private checkDepricatedIsConcurrent(node: ts.PropertyAccessExpression): void { diff --git a/ets2panda/linter/test/interop/interop_convert_import.ets.arkts2.json b/ets2panda/linter/test/interop/interop_convert_import.ets.arkts2.json index 8b318f2ad3..6bf593cf88 100755 --- a/ets2panda/linter/test/interop/interop_convert_import.ets.arkts2.json +++ b/ets2panda/linter/test/interop/interop_convert_import.ets.arkts2.json @@ -44,6 +44,16 @@ "rule": "Casting interop JS objects to primitive types is not allowed (arkts-interop-js2s-convert-js-type)", "severity": "ERROR" }, + { + "line": 19, + "column": 18, + "endLine": 19, + "endColumn": 25, + "problem": "InteropObjectProperty", + "suggest": "", + "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", + "severity": "ERROR" + }, { "line": 19, "column": 18, diff --git a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.arkts2.json b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.arkts2.json index 0689065be9..0df1a14b1c 100755 --- a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.arkts2.json +++ b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.arkts2.json @@ -324,16 +324,6 @@ "rule": "ArkTS directly instantiated JS objects is not supported (arkts-interop-js2s-create-js-instance)", "severity": "ERROR" }, - { - "line": 36, - "column": 11, - "endLine": 36, - "endColumn": 22, - "problem": "InteropObjectProperty", - "suggest": "", - "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", - "severity": "ERROR" - }, { "line": 37, "column": 12, @@ -514,16 +504,6 @@ "rule": "The \"typeof\" expression can't be used with interop JS objects (arkts-interop-js2s-typeof-js-type)", "severity": "ERROR" }, - { - "line": 71, - "column": 8, - "endLine": 71, - "endColumn": 25, - "problem": "InteropObjectProperty", - "suggest": "", - "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", - "severity": "ERROR" - }, { "line": 71, "column": 8, diff --git a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.autofix.json b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.autofix.json index 360a6a5794..ab9a2d1db2 100755 --- a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.autofix.json +++ b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.autofix.json @@ -43,7 +43,11 @@ { "start": 796, "end": 796, - "replacementText": "let GeneratedImportVar_1 = ESValue.load('./interop_import_js_js');\nlet myAaa = GeneratedImportVar_1.getPropertyByName('aaa');\nlet ClassA = GeneratedImportVar_1.getPropertyByName('ClassA');\nlet Dog = GeneratedImportVar_1.getPropertyByName('Dog');\nlet Person = GeneratedImportVar_1.getPropertyByName('Person');\nlet Wiki = GeneratedImportVar_1.getPropertyByName('Wiki');\n" + "replacementText": "let GeneratedImportVar_1 = ESValue.load('./interop_import_js_js');\nlet myAaa = GeneratedImportVar_1.getPropertyByName('aaa');\nlet ClassA = GeneratedImportVar_1.getPropertyByName('ClassA');\nlet Dog = GeneratedImportVar_1.getPropertyByName('Dog');\nlet Person = GeneratedImportVar_1.getPropertyByName('Person');\nlet Wiki = GeneratedImportVar_1.getPropertyByName('Wiki');\n", + "line": 17, + "column": 1, + "endLine": 17, + "endColumn": 69 } ], "suggest": "", @@ -79,7 +83,11 @@ { "start": 796, "end": 796, - "replacementText": "let GeneratedImportVar_2 = ESValue.load('./interop_import_js_js');\nlet Doge = GeneratedImportVar_2.getPropertyByName('Dog');\n" + "replacementText": "let GeneratedImportVar_2 = ESValue.load('./interop_import_js_js');\nlet Doge = GeneratedImportVar_2.getPropertyByName('Dog');\n", + "line": 18, + "column": 1, + "endLine": 18, + "endColumn": 54 } ], "suggest": "", @@ -115,7 +123,11 @@ { "start": 796, "end": 796, - "replacementText": "let GeneratedImportVar_3 = ESValue.load('./interop_import_js_js');\nlet wiki = GeneratedImportVar_3.getPropertyByName('Wiki');\n" + "replacementText": "let GeneratedImportVar_3 = ESValue.load('./interop_import_js_js');\nlet wiki = GeneratedImportVar_3.getPropertyByName('Wiki');\n", + "line": 19, + "column": 1, + "endLine": 19, + "endColumn": 55 } ], "suggest": "", @@ -214,7 +226,11 @@ { "start": 873, "end": 891, - "replacementText": "Dog.invoke(ESValue.wrap('doge')).typeOf()" + "replacementText": "Dog.invoke(ESValue.wrap('doge')).typeOf()", + "line": 25, + "column": 1, + "endLine": 25, + "endColumn": 19 } ], "suggest": "", @@ -261,7 +277,11 @@ { "start": 901, "end": 920, - "replacementText": "Doge.invoke(ESValue.wrap('doge')).typeOf()" + "replacementText": "Doge.invoke(ESValue.wrap('doge')).typeOf()", + "line": 26, + "column": 1, + "endLine": 26, + "endColumn": 20 } ], "suggest": "", @@ -529,27 +549,6 @@ "rule": "ArkTS directly instantiated JS objects is not supported (arkts-interop-js2s-create-js-instance)", "severity": "ERROR" }, - { - "line": 36, - "column": 11, - "endLine": 36, - "endColumn": 22, - "problem": "InteropObjectProperty", - "autofix": [ - { - "start": 1149, - "end": 1160, - "replacementText": "person.getPropertyByName(\"name\")", - "line": 36, - "column": 11, - "endLine": 36, - "endColumn": 22 - } - ], - "suggest": "", - "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", - "severity": "ERROR" - }, { "line": 37, "column": 12, @@ -851,27 +850,6 @@ "rule": "The \"typeof\" expression can't be used with interop JS objects (arkts-interop-js2s-typeof-js-type)", "severity": "ERROR" }, - { - "line": 71, - "column": 8, - "endLine": 71, - "endColumn": 25, - "problem": "InteropObjectProperty", - "autofix": [ - { - "start": 1903, - "end": 1920, - "replacementText": "new Person().getPropertyByName(\"name\")", - "line": 71, - "column": 8, - "endLine": 71, - "endColumn": 25 - } - ], - "suggest": "", - "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", - "severity": "ERROR" - }, { "line": 71, "column": 8, @@ -986,7 +964,11 @@ { "start": 1968, "end": 1998, - "replacementText": "Person.instantiate().getPropertyByName('setAge').invoke(ESValue.wrap(22)).typeOf()" + "replacementText": "Person.instantiate().getPropertyByName('setAge').invoke(ESValue.wrap(22)).typeOf()", + "line": 73, + "column": 1, + "endLine": 73, + "endColumn": 31 } ], "suggest": "", diff --git a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.ets b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.ets index 59463414d2..fcd9716048 100644 --- a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.ets +++ b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.ets @@ -43,7 +43,7 @@ const aClass:ClassA = ClassA.instantiate() ClassA.instantiate().typeOf() //error typeof aClass; let person:Person = Person.instantiate(); -let name =person.getPropertyByName("name") +let name =person.name let name2 =person.getName() function getPersonInfo(){ typeof person; diff --git a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.json b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.json index ba16f9d307..b7e521ca2e 100644 --- a/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.json +++ b/ets2panda/linter/test/interop/interop_import_typeof_js.ets.migrate.json @@ -138,7 +138,7 @@ "line": 46, "column": 5, "endLine": 46, - "endColumn": 43, + "endColumn": 22, "problem": "AnyType", "suggest": "", "rule": "Use explicit types instead of \"any\", \"unknown\" (arkts-no-any-unknown)", diff --git a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets index 70554e5a8f..3f72e3cf20 100755 --- a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets +++ b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets @@ -19,4 +19,5 @@ import {foo, person} from "./interop_not_have_property_js" foo.name foo.name = "456" person.age = 23 -person.male = [2, 3] \ No newline at end of file +person.male = [2, 3] +foo.age = 12 \ No newline at end of file diff --git a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.arkts2.json b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.arkts2.json index f46b7b42fb..ce2c2d2d38 100755 --- a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.arkts2.json +++ b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.arkts2.json @@ -143,6 +143,36 @@ "suggest": "", "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", "severity": "ERROR" + }, + { + "line": 23, + "column": 1, + "endLine": 23, + "endColumn": 13, + "problem": "InteropObjectProperty", + "suggest": "", + "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", + "severity": "ERROR" + }, + { + "line": 23, + "column": 1, + "endLine": 23, + "endColumn": 8, + "problem": "InteropJsObjectUsage", + "suggest": "", + "rule": "Direct usage of interop JS objects is not supported (arkts-interop-js-object-usage)", + "severity": "ERROR" + }, + { + "line": 23, + "column": 11, + "endLine": 23, + "endColumn": 13, + "problem": "NumericSemantics", + "suggest": "", + "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", + "severity": "ERROR" } ] } \ No newline at end of file diff --git a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.autofix.json b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.autofix.json index 282314af78..0c4beba4af 100755 --- a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.autofix.json +++ b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.autofix.json @@ -43,7 +43,11 @@ { "start": 676, "end": 676, - "replacementText": "let GeneratedImportVar_1 = ESValue.load('./interop_not_have_property_js');\nlet foo = GeneratedImportVar_1.getPropertyByName('foo');\nlet person = GeneratedImportVar_1.getPropertyByName('person');\n" + "replacementText": "let GeneratedImportVar_1 = ESValue.load('./interop_not_have_property_js');\nlet foo = GeneratedImportVar_1.getPropertyByName('foo');\nlet person = GeneratedImportVar_1.getPropertyByName('person');\n", + "line": 17, + "column": 1, + "endLine": 17, + "endColumn": 59 } ], "suggest": "", @@ -102,7 +106,11 @@ { "start": 687, "end": 703, - "replacementText": "foo.setPropertyByName(\"name\", ESValue.wrap(\"456\"))" + "replacementText": "foo.setPropertyByName(\"name\", ESValue.wrap(\"456\"))", + "line": 20, + "column": 1, + "endLine": 20, + "endColumn": 17 } ], "suggest": "", @@ -140,7 +148,11 @@ { "start": 704, "end": 719, - "replacementText": "person.setPropertyByName(\"age\", ESValue.wrap(23))" + "replacementText": "person.setPropertyByName(\"age\", ESValue.wrap(23))", + "line": 21, + "column": 1, + "endLine": 21, + "endColumn": 16 } ], "suggest": "", @@ -199,7 +211,11 @@ { "start": 720, "end": 740, - "replacementText": "person.setPropertyByName(\"male\", ESValue.wrap([2, 3]))" + "replacementText": "person.setPropertyByName(\"male\", ESValue.wrap([2, 3]))", + "line": 22, + "column": 1, + "endLine": 22, + "endColumn": 21 } ], "suggest": "", @@ -268,6 +284,69 @@ "suggest": "", "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", "severity": "ERROR" + }, + { + "line": 23, + "column": 1, + "endLine": 23, + "endColumn": 13, + "problem": "InteropObjectProperty", + "autofix": [ + { + "start": 741, + "end": 753, + "replacementText": "foo.setPropertyByName(\"age\", ESValue.wrap(12))", + "line": 23, + "column": 1, + "endLine": 23, + "endColumn": 13 + } + ], + "suggest": "", + "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", + "severity": "ERROR" + }, + { + "line": 23, + "column": 1, + "endLine": 23, + "endColumn": 8, + "problem": "InteropJsObjectUsage", + "autofix": [ + { + "replacementText": "foo.getPropertyByName('age')", + "start": 741, + "end": 748, + "line": 23, + "column": 1, + "endLine": 23, + "endColumn": 8 + } + ], + "suggest": "", + "rule": "Direct usage of interop JS objects is not supported (arkts-interop-js-object-usage)", + "severity": "ERROR" + }, + { + "line": 23, + "column": 11, + "endLine": 23, + "endColumn": 13, + "problem": "NumericSemantics", + "autofix": [ + { + "start": 751, + "end": 753, + "replacementText": "12.0", + "line": 23, + "column": 11, + "endLine": 23, + "endColumn": 13 + } + ], + "suggest": "", + "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", + "severity": "ERROR" } ] } \ No newline at end of file diff --git a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.migrate.ets b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.migrate.ets index 9fbd2c1ac2..586868511b 100644 --- a/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.migrate.ets +++ b/ets2panda/linter/test/interop/interop_not_have_property_arkts2.ets.migrate.ets @@ -22,4 +22,5 @@ let person = GeneratedImportVar_1.getPropertyByName('person'); foo.getPropertyByName("name") foo.setPropertyByName("name", ESValue.wrap("456")) person.setPropertyByName("age", ESValue.wrap(23.0)) -person.setPropertyByName("male", ESValue.wrap([2.0, 3.0])) \ No newline at end of file +person.setPropertyByName("male", ESValue.wrap([2.0, 3.0])) +foo.setPropertyByName("age", ESValue.wrap(12.0)) \ No newline at end of file diff --git a/ets2panda/linter/test/interop/no_js_instanceof.ets.arkts2.json b/ets2panda/linter/test/interop/no_js_instanceof.ets.arkts2.json index 7f34d1cc41..a3723f2cb7 100755 --- a/ets2panda/linter/test/interop/no_js_instanceof.ets.arkts2.json +++ b/ets2panda/linter/test/interop/no_js_instanceof.ets.arkts2.json @@ -184,6 +184,16 @@ "rule": "\"new\" expression with dynamic constructor type is not supported (arkts-no-dynamic-ctor-call)", "severity": "ERROR" }, + { + "line": 73, + "column": 36, + "endLine": 73, + "endColumn": 51, + "problem": "InteropObjectProperty", + "suggest": "", + "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", + "severity": "ERROR" + }, { "line": 73, "column": 36, @@ -204,6 +214,16 @@ "rule": "Usage of \"instanceof\" operator is not allowed with interop objects (arkts-interop-js2s-instanceof-js-type)", "severity": "ERROR" }, + { + "line": 75, + "column": 22, + "endLine": 75, + "endColumn": 37, + "problem": "InteropObjectProperty", + "suggest": "", + "rule": "Properties of interop objects can't be accessed directly (arkts-interop-js2s-access-js-prop)", + "severity": "ERROR" + }, { "line": 75, "column": 22, -- Gitee