diff --git a/ets2panda/linter/src/lib/autofixes/Autofixer.ts b/ets2panda/linter/src/lib/autofixes/Autofixer.ts index 39545de72264cb5e549916898bb41af127e45e02..b11cb0892e92057ddc465fb14877a12f52862aa4 100644 --- a/ets2panda/linter/src/lib/autofixes/Autofixer.ts +++ b/ets2panda/linter/src/lib/autofixes/Autofixer.ts @@ -4904,6 +4904,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; } @@ -4920,6 +4926,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 0d7b3467d126b8e6bea4fc6beeba0dce2da29187..5a79d6f48059be3b840bd34a2de7f06f555218b3 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 bc1cd482a41b7487c1b342d0bf71524cb06befd0..482497db5e41e26b90b01d98777ea460673940cd 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 01ba1f614fd4f69485ed44ba4730f297ee1ad343..7ea4be964c181ad1e7b21fb021211563a4f6d31c 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 044a417e72bcdb224ab726d01d93b0f363965a07..bdd57c5703a22d7da7870c58acf28c54bd9d4895 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 @@ -101,3 +101,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 90f99e9274ae43994be82c2f364c0d9abec37344..32ffe08210b6e2cbf6c795709776e2d368e9626c 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": 106, + "column": 52, + "endLine": 106, + "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