From 2c487fd323f3c7c1ad3abda0a71ce0008ea73c5f Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 8 May 2024 22:55:45 +0300 Subject: [PATCH 1/4] fix(58399): preserve original node to eliminate formatter crashes caused by missing parent nodes --- .../fixMissingTypeAnnotationOnExports.ts | 2 +- ...codeFixMissingTypeAnnotationOnExports47.ts | 45 +++++++++++++++++++ ...codeFixMissingTypeAnnotationOnExports48.ts | 45 +++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports47.ts create mode 100644 tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports48.ts diff --git a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts index 42e0d2141126c..f30de4838b26a 100644 --- a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts +++ b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts @@ -392,7 +392,7 @@ function withContext( sourceFile, targetNode, createSatisfiesAsExpression( - getSynthesizedDeepClone(targetNode), + targetNode, typeNode, ), ); diff --git a/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports47.ts b/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports47.ts new file mode 100644 index 0000000000000..18bb595bd0cb7 --- /dev/null +++ b/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports47.ts @@ -0,0 +1,45 @@ +/// + +// @isolatedDeclarations: true +// @declaration: true +// @moduleResolution: node +// @target: es2018 +// @jsx: react-jsx + +// @filename: node_modules/react/package.json +////{ +//// "name": "react", +//// "types": "index.d.ts", +////} + +// @filename: node_modules/react/index.d.ts +////export = React; +////declare namespace JSX { +//// interface Element extends GlobalJSXElement { } +//// interface IntrinsicElements extends GlobalJSXIntrinsicElements { } +////} +////declare namespace React { } +////declare global { +//// namespace JSX { +//// interface Element { } +//// interface IntrinsicElements { [x: string]: any; } +//// } +////} +////interface GlobalJSXElement extends JSX.Element {} +////interface GlobalJSXIntrinsicElements extends JSX.IntrinsicElements {} + +// @filename: node_modules/react/jsx-runtime.d.ts +////import './'; + +// @filename: node_modules/react/jsx-dev-runtime.d.ts +////import './'; + +// @filename: /a.tsx +////export const x =
; + +goTo.file("/a.tsx"); +verify.codeFix({ + description: `Add annotation of type 'JSX.Element'`, + index: 0, + newFileContent: 'export const x: JSX.Element =
;', +}); diff --git a/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports48.ts b/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports48.ts new file mode 100644 index 0000000000000..02aa660f6fc33 --- /dev/null +++ b/tests/cases/fourslash/codeFixMissingTypeAnnotationOnExports48.ts @@ -0,0 +1,45 @@ +/// + +// @isolatedDeclarations: true +// @declaration: true +// @moduleResolution: node +// @target: es2018 +// @jsx: react-jsx + +// @filename: node_modules/react/package.json +////{ +//// "name": "react", +//// "types": "index.d.ts", +////} + +// @filename: node_modules/react/index.d.ts +////export = React; +////declare namespace JSX { +//// interface Element extends GlobalJSXElement { } +//// interface IntrinsicElements extends GlobalJSXIntrinsicElements { } +////} +////declare namespace React { } +////declare global { +//// namespace JSX { +//// interface Element { } +//// interface IntrinsicElements { [x: string]: any; } +//// } +////} +////interface GlobalJSXElement extends JSX.Element {} +////interface GlobalJSXIntrinsicElements extends JSX.IntrinsicElements {} + +// @filename: node_modules/react/jsx-runtime.d.ts +////import './'; + +// @filename: node_modules/react/jsx-dev-runtime.d.ts +////import './'; + +// @filename: /a.tsx +////export const x =
; + +goTo.file("/a.tsx"); +verify.codeFix({ + description: `Add satisfies and an inline type assertion with 'JSX.Element'`, + index: 1, + newFileContent: 'export const x = (
) satisfies JSX.Element as JSX.Element;', +}); From f863835b9bcb0150abd8b85061202df3217be9eb Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 8 May 2024 23:25:45 +0300 Subject: [PATCH 2/4] use setParentRecursive --- src/services/codefixes/fixMissingTypeAnnotationOnExports.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts index f30de4838b26a..90478355ae314 100644 --- a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts +++ b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts @@ -78,6 +78,7 @@ import { PropertyAccessExpression, PropertyDeclaration, setEmitFlags, + setParentRecursive, SignatureDeclaration, some, SourceFile, @@ -392,7 +393,7 @@ function withContext( sourceFile, targetNode, createSatisfiesAsExpression( - targetNode, + setParentRecursive(getSynthesizedDeepClone(targetNode), /*incremental*/ false), typeNode, ), ); From 6c1fa9da724d9822447a94cb213507691778e2a6 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 8 May 2024 23:51:18 +0300 Subject: [PATCH 3/4] use setParentRecursive in getSynthesizedDeepClone --- src/services/codefixes/fixMissingTypeAnnotationOnExports.ts | 3 +-- src/services/utilities.ts | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts index 90478355ae314..42e0d2141126c 100644 --- a/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts +++ b/src/services/codefixes/fixMissingTypeAnnotationOnExports.ts @@ -78,7 +78,6 @@ import { PropertyAccessExpression, PropertyDeclaration, setEmitFlags, - setParentRecursive, SignatureDeclaration, some, SourceFile, @@ -393,7 +392,7 @@ function withContext( sourceFile, targetNode, createSatisfiesAsExpression( - setParentRecursive(getSynthesizedDeepClone(targetNode), /*incremental*/ false), + getSynthesizedDeepClone(targetNode), typeNode, ), ); diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 5a9048dc0c114..2d57952373316 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -332,6 +332,7 @@ import { SemicolonPreference, setConfigFileInOptions, setOriginalNode, + setParentRecursive, setTextRange, Signature, SignatureDeclaration, @@ -3172,7 +3173,7 @@ export function getPrecedingNonSpaceCharacterPosition(text: string, position: nu export function getSynthesizedDeepClone(node: T, includeTrivia = true): T { const clone = node && getSynthesizedDeepCloneWorker(node); if (clone && !includeTrivia) suppressLeadingAndTrailingTrivia(clone); - return clone; + return setParentRecursive(clone, /*incremental*/ false); } /** @internal */ From c1dd33252cc18c70aba21bd7946de8dead103088 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 9 May 2024 00:05:57 +0300 Subject: [PATCH 4/4] update baseline --- ...actFunction_VariableDeclaration_Writes_Let_LiteralType1.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/baselines/reference/extractFunction/extractFunction_VariableDeclaration_Writes_Let_LiteralType1.ts b/tests/baselines/reference/extractFunction/extractFunction_VariableDeclaration_Writes_Let_LiteralType1.ts index 06de0fd4f368a..c209a51388415 100644 --- a/tests/baselines/reference/extractFunction/extractFunction_VariableDeclaration_Writes_Let_LiteralType1.ts +++ b/tests/baselines/reference/extractFunction/extractFunction_VariableDeclaration_Writes_Let_LiteralType1.ts @@ -10,7 +10,7 @@ function f() { function f() { let a = 1; - let x: 8 | 10 | 2 = /*RENAME*/newFunction(); + let x: 0o10 | 10 | 0b10 = /*RENAME*/newFunction(); a; x; function newFunction() { @@ -23,7 +23,7 @@ function f() { function f() { let a = 1; - let x: (8 | 10 | 2) | undefined; + let x: (0o10 | 10 | 0b10) | undefined; ({ x, a } = /*RENAME*/newFunction(a)); a; x; }