From 9a08653677a6ec4a39a5f91f7ac8e913bc2db8d8 Mon Sep 17 00:00:00 2001 From: zhongning5 Date: Sat, 21 Jun 2025 11:44:03 +0800 Subject: [PATCH] fix arkts-no-inferred-generic-params Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICGQ9V Test scenarios:Fix bugs for arkts-no-inferred-generic-params Signed-off-by: zhongning5 --- .../linter/src/lib/autofixes/Autofixer.ts | 36 +++++++++ .../test/main/func_inferred_type_args_2.ets | 4 + .../func_inferred_type_args_2.ets.arkts2.json | 40 ++++++++++ ...func_inferred_type_args_2.ets.autofix.json | 73 +++++++++++++++++++ .../func_inferred_type_args_2.ets.migrate.ets | 4 + ...func_inferred_type_args_2.ets.migrate.json | 10 +++ 6 files changed, 167 insertions(+) diff --git a/ets2panda/linter/src/lib/autofixes/Autofixer.ts b/ets2panda/linter/src/lib/autofixes/Autofixer.ts index dc78eabc87..d8ac48f0c7 100644 --- a/ets2panda/linter/src/lib/autofixes/Autofixer.ts +++ b/ets2panda/linter/src/lib/autofixes/Autofixer.ts @@ -4871,6 +4871,12 @@ export class Autofixer { if (!typeNode) { return this.fixGenericCallNoTypeArgsWithContextualType(node); } + if (ts.isUnionTypeNode(typeNode)) { + return this.fixSingleMatchingTypeInUnion(node, typeNode); + } + if (ts.isArrayTypeNode(typeNode)) { + return this.fixArrayType(node, typeNode); + } if (!ts.isTypeReferenceNode(typeNode) || typeNode.typeName.getText() !== node.expression.getText()) { return undefined; } @@ -4887,6 +4893,36 @@ export class Autofixer { return [{ start: insertPos, end: insertPos, replacementText: typeArgsText }]; } + private fixArrayType(node: ts.NewExpression, arrayTypeNode: ts.ArrayTypeNode): Autofix[] | undefined { + const elementTypeNode = arrayTypeNode.elementType; + const srcFile = node.getSourceFile(); + const typeArgsText = `<${this.printer.printNode(ts.EmitHint.Unspecified, elementTypeNode, srcFile)}>`; + const insertPos = node.expression.getEnd(); + return [{ start: insertPos, end: insertPos, replacementText: typeArgsText }]; + } + + private fixSingleMatchingTypeInUnion(node: ts.NewExpression, unionType: ts.UnionTypeNode): Autofix[] | undefined { + const matchingTypes = unionType.types.filter((type) => { + return ts.isTypeReferenceNode(type) && type.typeName.getText() === node.expression.getText(); + }) as ts.TypeReferenceNode[]; + + if (matchingTypes.length === 1) { + const matchingType = matchingTypes[0]; + if (matchingType.typeArguments) { + const srcFile = node.getSourceFile(); + const typeArgsText = `<${matchingType.typeArguments. + map((arg) => { + return this.printer.printNode(ts.EmitHint.Unspecified, arg, srcFile); + }). + join(', ')}>`; + + const insertPos = node.expression.getEnd(); + return [{ start: insertPos, end: insertPos, replacementText: typeArgsText }]; + } + } + return undefined; + } + private generateGenericTypeArgumentsAutofix( node: ts.NewExpression, typeArgs: ts.TypeReferenceNode[] diff --git a/ets2panda/linter/test/main/func_inferred_type_args_2.ets b/ets2panda/linter/test/main/func_inferred_type_args_2.ets index 0d7b3467d1..5a79d6f480 100644 --- a/ets2panda/linter/test/main/func_inferred_type_args_2.ets +++ b/ets2panda/linter/test/main/func_inferred_type_args_2.ets @@ -94,3 +94,7 @@ class A { } } new A(new C()) +let a: Array | undefined = new Array(); +let aa: Array | Set | undefined = new Array(); +let b: Array | Array | undefined = new Array(); +let test: string[] = new Array(); \ No newline at end of file diff --git a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.arkts2.json b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.arkts2.json index bc1cd482a4..482497db5e 100644 --- a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.arkts2.json +++ b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.arkts2.json @@ -514,6 +514,46 @@ "rule": "\"new\" expression with dynamic constructor type is not supported (arkts-no-dynamic-ctor-call)", "severity": "ERROR" }, + { + "line": 97, + "column": 36, + "endLine": 97, + "endColumn": 47, + "problem": "GenericCallNoTypeArgs", + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, + { + "line": 98, + "column": 51, + "endLine": 98, + "endColumn": 62, + "problem": "GenericCallNoTypeArgs", + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, + { + "line": 99, + "column": 52, + "endLine": 99, + "endColumn": 63, + "problem": "GenericCallNoTypeArgs", + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, + { + "line": 100, + "column": 22, + "endLine": 100, + "endColumn": 33, + "problem": "GenericCallNoTypeArgs", + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, { "line": 84, "column": 2, diff --git a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.autofix.json b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.autofix.json index e59af03e37..a69628a821 100644 --- a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.autofix.json +++ b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.autofix.json @@ -734,6 +734,79 @@ "rule": "\"new\" expression with dynamic constructor type is not supported (arkts-no-dynamic-ctor-call)", "severity": "ERROR" }, + { + "line": 97, + "column": 36, + "endLine": 97, + "endColumn": 47, + "problem": "GenericCallNoTypeArgs", + "autofix": [ + { + "start": 2592, + "end": 2592, + "replacementText": "", + "line": 97, + "column": 36, + "endLine": 97, + "endColumn": 47 + } + ], + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, + { + "line": 98, + "column": 51, + "endLine": 98, + "endColumn": 62, + "problem": "GenericCallNoTypeArgs", + "autofix": [ + { + "start": 2655, + "end": 2655, + "replacementText": "", + "line": 98, + "column": 51, + "endLine": 98, + "endColumn": 62 + } + ], + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, + { + "line": 99, + "column": 52, + "endLine": 99, + "endColumn": 63, + "problem": "GenericCallNoTypeArgs", + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, + { + "line": 100, + "column": 22, + "endLine": 100, + "endColumn": 33, + "problem": "GenericCallNoTypeArgs", + "autofix": [ + { + "start": 2753, + "end": 2753, + "replacementText": "", + "line": 100, + "column": 22, + "endLine": 100, + "endColumn": 33 + } + ], + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, { "line": 84, "column": 2, diff --git a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.ets b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.ets index f76d33da37..c76c7ee950 100644 --- a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.ets +++ b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.ets @@ -97,3 +97,7 @@ class A { } } new A(new C()) +let a: Array | undefined = new Array(); +let aa: Array | Set | undefined = new Array(); +let b: Array | Array | undefined = new Array(); +let test: string[] = new Array(); \ No newline at end of file diff --git a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.json b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.json index 7926f03ac9..9e41b02d37 100644 --- a/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.json +++ b/ets2panda/linter/test/main/func_inferred_type_args_2.ets.migrate.json @@ -313,6 +313,16 @@ "suggest": "", "rule": "\"new\" expression with dynamic constructor type is not supported (arkts-no-dynamic-ctor-call)", "severity": "ERROR" + }, + { + "line": 102, + "column": 52, + "endLine": 102, + "endColumn": 63, + "problem": "GenericCallNoTypeArgs", + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" } ] } \ No newline at end of file -- Gitee