From c20a8a3acd301eee53c804c6038605021aadd984 Mon Sep 17 00:00:00 2001 From: sidlamsal <98344853+sidlamsal@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:27:12 -0400 Subject: [PATCH 1/3] codefix fix --- .../codefixes/fixMissingTypeAnnotationOnExports.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts index a82ccb01f00ff..cba34b9a95c56 100644 --- a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts +++ b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts @@ -36,6 +36,7 @@ import { factory, FileTextChanges, findAncestor, + forEachChild, FunctionDeclaration, GeneratedIdentifierFlags, getEmitScriptTarget, @@ -1097,6 +1098,11 @@ function withContext( return emptyInferenceResult; } + function stripCommentsFromNode(node: Node): void { + setEmitFlags(node, EmitFlags.NoComments); + forEachChild(node, stripCommentsFromNode); + } + function typeToTypeNode(type: Type, enclosingDeclaration: Node, flags = NodeBuilderFlags.None): TypeNode | undefined { let isTruncated = false; const minimizedTypeNode = typeToMinimizedReferenceType(typeChecker, type, enclosingDeclaration, declarationEmitNodeBuilderFlags | flags, declarationEmitInternalNodeBuilderFlags, { @@ -1112,6 +1118,11 @@ function withContext( return undefined; } const result = typeNodeToAutoImportableTypeNode(minimizedTypeNode, importAdder, scriptTarget); + + if (result) { + stripCommentsFromNode(result); + } + return isTruncated ? factory.createKeywordTypeNode(SyntaxKind.AnyKeyword) : result; } From d12d46d684f398b06c2b7a48857a5db18b878934 Mon Sep 17 00:00:00 2001 From: sidlamsal <98344853+sidlamsal@users.noreply.github.com> Date: Thu, 27 Mar 2025 22:19:11 -0400 Subject: [PATCH 2/3] formatting --- src/services/codefixes/fixMissingTypeAnnotationOnExports.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts index cba34b9a95c56..c38894bfb5c80 100644 --- a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts +++ b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts @@ -1102,7 +1102,7 @@ function withContext( setEmitFlags(node, EmitFlags.NoComments); forEachChild(node, stripCommentsFromNode); } - + function typeToTypeNode(type: Type, enclosingDeclaration: Node, flags = NodeBuilderFlags.None): TypeNode | undefined { let isTruncated = false; const minimizedTypeNode = typeToMinimizedReferenceType(typeChecker, type, enclosingDeclaration, declarationEmitNodeBuilderFlags | flags, declarationEmitInternalNodeBuilderFlags, { From 11fbbe94d8f98b560c707cf1fdaef0a2d08fb796 Mon Sep 17 00:00:00 2001 From: calebloring <112512660+calebloring@users.noreply.github.com> Date: Fri, 28 Mar 2025 14:04:38 -0400 Subject: [PATCH 3/3] Added fourslash test --- ...onOnExports61-remove-duplicate-comments.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports61-remove-duplicate-comments.ts diff --git a/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports61-remove-duplicate-comments.ts b/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports61-remove-duplicate-comments.ts new file mode 100644 index 0000000000000..d038a1b139958 --- /dev/null +++ b/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports61-remove-duplicate-comments.ts @@ -0,0 +1,38 @@ +/// + +// @isolatedDeclarations: true +// @declaration: true + +//// export function f() { +//// const o = /** before */ { /* inline post-{ */ // end line post-{ +//// // document first type +//// /* inline before */ x /* inline pre-colon */ : /* inline pre-type */ 5 /* inline post-type */ , // after comma1 +//// // document second type +//// /** 2 before */ y : 'str' /** 2 after */, //after comma2 +//// // pre-closing +//// } /** after */; +//// return o; +//// } + +verify.codeFix({ + description: `Add return type '{ /* inline post-{ */ // end line post-{ +x: number; // after comma1 +y: string; }'`, + index: 0, + newFileContent: +`export function f(): { + x: number; + y: string; +} { + const o = /** before */ { /* inline post-{ */ // end line post-{ + // document first type + /* inline before */ x /* inline pre-colon */ : /* inline pre-type */ 5 /* inline post-type */ , // after comma1 + // document second type + /** 2 before */ y : 'str' /** 2 after */, //after comma2 + // pre-closing + } /** after */; + return o; +}`, +}); + +