From 7ee7690c6045a71909a54e68cee57d8c0ad6872f Mon Sep 17 00:00:00 2001 From: Hoang Pham Date: Sun, 7 Jul 2019 00:25:02 -0700 Subject: [PATCH 1/3] Add JSX codefix if available --- src/compiler/diagnosticMessages.json | 4 +++ src/services/codefixes/fixEnableJsxFlag.ts | 35 +++++++++++++++++++ src/services/tsconfig.json | 1 + ...bleJsxFlag_blankCompilerOptionsJsConfig.ts | 23 ++++++++++++ ...bleJsxFlag_blankCompilerOptionsTsConfig.ts | 23 ++++++++++++ ...lag_disabledInCompilerOptionsInJsConfig.ts | 24 +++++++++++++ ...lag_disabledInCompilerOptionsInTsConfig.ts | 24 +++++++++++++ ...sxFlag_missingCompilerOptionsInJsconfig.ts | 19 ++++++++++ ...sxFlag_missingCompilerOptionsInTsconfig.ts | 19 ++++++++++ .../codefixEnableJsxFlag_noTsconfig.ts | 7 ++++ 10 files changed, 179 insertions(+) create mode 100644 src/services/codefixes/fixEnableJsxFlag.ts create mode 100644 tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts create mode 100644 tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts create mode 100644 tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts create mode 100644 tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts create mode 100644 tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts create mode 100644 tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts create mode 100644 tests/cases/fourslash/codefixEnableJsxFlag_noTsconfig.ts diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index c404851af3e90..79b263d5a5927 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -5074,5 +5074,9 @@ "JSX expressions may not use the comma operator. Did you mean to write an array?": { "category": "Error", "code": 18007 + }, + "Enable the '--jsx' flag in your configuration file": { + "category": "Message", + "code": 95081 } } diff --git a/src/services/codefixes/fixEnableJsxFlag.ts b/src/services/codefixes/fixEnableJsxFlag.ts new file mode 100644 index 0000000000000..85d6f8dd633e6 --- /dev/null +++ b/src/services/codefixes/fixEnableJsxFlag.ts @@ -0,0 +1,35 @@ +/* @internal */ +namespace ts.codefix { + const fixID = "fixEnableJsxFlag"; + const errorCodes = [Diagnostics.Cannot_use_JSX_unless_the_jsx_flag_is_provided.code]; + registerCodeFix({ + errorCodes, + getCodeActions: context => { + const { configFile } = context.program.getCompilerOptions(); + if (configFile === undefined) { + return undefined; + } + + const changes = textChanges.ChangeTracker.with(context, changeTracker => + doChange(changeTracker, configFile) + ); + return [ + createCodeFixActionNoFixId(fixID, changes, Diagnostics.Enable_the_jsx_flag_in_your_configuration_file) + ]; + }, + fixIds: [fixID], + getAllCodeActions: context => + codeFixAll(context, errorCodes, changes => { + const { configFile } = context.program.getCompilerOptions(); + if (configFile === undefined) { + return undefined; + } + + doChange(changes, configFile); + }) + }); + + function doChange(changeTracker: textChanges.ChangeTracker, configFile: TsConfigSourceFile) { + setJsonCompilerOptionValue(changeTracker, configFile, "jsx", createTrue()); + } +} diff --git a/src/services/tsconfig.json b/src/services/tsconfig.json index 681a9fc4b5eb7..aa2d934f71598 100644 --- a/src/services/tsconfig.json +++ b/src/services/tsconfig.json @@ -63,6 +63,7 @@ "codefixes/fixClassSuperMustPrecedeThisAccess.ts", "codefixes/fixConstructorForDerivedNeedSuperCall.ts", "codefixes/fixEnableExperimentalDecorators.ts", + "codefixes/fixEnableJsxFlag.ts", "codefixes/fixExtendsInterfaceBecomesImplements.ts", "codefixes/fixForgottenThisPropertyAccess.ts", "codefixes/fixUnusedIdentifier.ts", diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts new file mode 100644 index 0000000000000..56ec88ff8b98f --- /dev/null +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts @@ -0,0 +1,23 @@ +/// + +// @Filename: /dir/a.tsx +////export const Component = () => <> + +// @Filename: /dir/jsconfig.json +////{ +//// "compilerOptions": { +//// } +////} + +goTo.file("/dir/a.tsx"); +verify.codeFix({ + description: "Enable the '--jsx' flag in your configuration file", + newFileContent: { + "/dir/jsconfig.json": +`{ + "compilerOptions": { + "jsx": true, + } +}`, + }, +}); diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts new file mode 100644 index 0000000000000..a686b814aa92c --- /dev/null +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts @@ -0,0 +1,23 @@ +/// + +// @Filename: /dir/a.tsx +////export const Component = () => <>; + +// @Filename: /dir/tsconfig.json +////{ +//// "compilerOptions": { +//// } +////} + +goTo.file("/dir/a.tsx"); +verify.codeFix({ + description: "Enable the '--jsx' flag in your configuration file", + newFileContent: { + "/dir/tsconfig.json": +`{ + "compilerOptions": { + "jsx": true, + } +}`, + }, +}); diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts new file mode 100644 index 0000000000000..dac37d31d676f --- /dev/null +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts @@ -0,0 +1,24 @@ +/// + +// @Filename: /dir/a.tsx +////export const Component = () => <>; + +// @Filename: /dir/jsconfig.json +////{ +//// "compilerOptions": { +//// "jsx": false, +//// } +////} + +goTo.file("/dir/a.tsx"); +verify.codeFix({ + description: "Enable the '--jsx' flag in your configuration file", + newFileContent: { + "/dir/jsconfig.json": +`{ + "compilerOptions": { + "jsx": true, + } +}`, + }, +}); diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts new file mode 100644 index 0000000000000..7916d12cc8416 --- /dev/null +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts @@ -0,0 +1,24 @@ +/// + +// @Filename: /dir/a.tsx +////export const Component = () => <> + +// @Filename: /dir/tsconfig.json +////{ +//// "compilerOptions": { +//// "jsx": false, +//// } +////} + +goTo.file("/dir/a.tsx"); +verify.codeFix({ + description: "Enable the '--jsx' flag in your configuration file", + newFileContent: { + "/dir/tsconfig.json": +`{ + "compilerOptions": { + "jsx": true, + } +}`, + }, +}); diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts new file mode 100644 index 0000000000000..eca7f9b4096fc --- /dev/null +++ b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts @@ -0,0 +1,19 @@ +/// + +// @Filename: /dir/a.tsx +////export const Component = () => <> + +// @Filename: /dir/jsconfig.json +////{ +////} + +goTo.file("/dir/a.tsx"); +verify.codeFix({ + description: "Enable the '--jsx' flag in your configuration file", + newFileContent: { + "/dir/jsconfig.json": +`{ + "compilerOptions": { "jsx": true }, +}`, + }, +}); diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts new file mode 100644 index 0000000000000..577970f27f53e --- /dev/null +++ b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts @@ -0,0 +1,19 @@ +/// + +// @Filename: /dir/a.tsx +////export const Component = () => <> + +// @Filename: /dir/tsconfig.json +////{ +////} + +goTo.file("/dir/a.tsx"); +verify.codeFix({ + description: "Enable the '--jsx' flag in your configuration file", + newFileContent: { + "/dir/tsconfig.json": +`{ + "compilerOptions": { "jsx": true }, +}`, + }, +}); diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_noTsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_noTsconfig.ts new file mode 100644 index 0000000000000..f07f0035fb275 --- /dev/null +++ b/tests/cases/fourslash/codefixEnableJsxFlag_noTsconfig.ts @@ -0,0 +1,7 @@ +/// + +// @Filename: /dir/a.tsx +////export const Component = () => <> + +goTo.file("/dir/a.tsx"); +verify.not.codeFixAvailable(); From 77ffda8097f4ef250881a155891a0aac447349bb Mon Sep 17 00:00:00 2001 From: Hoang Pham Date: Mon, 15 Jul 2019 17:11:35 -0700 Subject: [PATCH 2/3] Update react jsx. --- src/services/codefixes/fixEnableJsxFlag.ts | 2 +- .../codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts | 2 +- .../codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts | 2 +- .../codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts | 2 +- .../codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts | 2 +- .../codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts | 2 +- .../codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/services/codefixes/fixEnableJsxFlag.ts b/src/services/codefixes/fixEnableJsxFlag.ts index 85d6f8dd633e6..728366392f1ea 100644 --- a/src/services/codefixes/fixEnableJsxFlag.ts +++ b/src/services/codefixes/fixEnableJsxFlag.ts @@ -30,6 +30,6 @@ namespace ts.codefix { }); function doChange(changeTracker: textChanges.ChangeTracker, configFile: TsConfigSourceFile) { - setJsonCompilerOptionValue(changeTracker, configFile, "jsx", createTrue()); + setJsonCompilerOptionValue(changeTracker, configFile, "jsx", createStringLiteral("react")); } } diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts index 56ec88ff8b98f..9d3c14f45bbbd 100644 --- a/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsJsConfig.ts @@ -16,7 +16,7 @@ verify.codeFix({ "/dir/jsconfig.json": `{ "compilerOptions": { - "jsx": true, + "jsx": "react", } }`, }, diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts index a686b814aa92c..7b314feeecd50 100644 --- a/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts @@ -16,7 +16,7 @@ verify.codeFix({ "/dir/tsconfig.json": `{ "compilerOptions": { - "jsx": true, + "jsx": "react", } }`, }, diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts index dac37d31d676f..dbc7d39ec6c24 100644 --- a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts @@ -17,7 +17,7 @@ verify.codeFix({ "/dir/jsconfig.json": `{ "compilerOptions": { - "jsx": true, + "jsx": "react", } }`, }, diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts index 7916d12cc8416..752abc156f7d3 100644 --- a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts +++ b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts @@ -17,7 +17,7 @@ verify.codeFix({ "/dir/tsconfig.json": `{ "compilerOptions": { - "jsx": true, + "jsx": "react", } }`, }, diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts index eca7f9b4096fc..89769c49d0b9b 100644 --- a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts +++ b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts @@ -13,7 +13,7 @@ verify.codeFix({ newFileContent: { "/dir/jsconfig.json": `{ - "compilerOptions": { "jsx": true }, + "compilerOptions": { "jsx": "react" }, }`, }, }); diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts index 577970f27f53e..dc81c7970af27 100644 --- a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts +++ b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts @@ -13,7 +13,7 @@ verify.codeFix({ newFileContent: { "/dir/tsconfig.json": `{ - "compilerOptions": { "jsx": true }, + "compilerOptions": { "jsx": "react" }, }`, }, }); From ba1f3beb7c946c654e2b96af4ac2b3e43641aebd Mon Sep 17 00:00:00 2001 From: Hoang Pham Date: Mon, 15 Jul 2019 18:06:03 -0700 Subject: [PATCH 3/3] Update diagnostic code. --- src/compiler/diagnosticMessages.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index ede317ee581df..1193c52d82f6d 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -5108,6 +5108,10 @@ "category": "Message", "code": 95087 }, + "Enable the '--jsx' flag in your configuration file": { + "category": "Message", + "code": 95088 + }, "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer.": { "category": "Error", @@ -5120,9 +5124,5 @@ "JSX expressions may not use the comma operator. Did you mean to write an array?": { "category": "Error", "code": 18007 - }, - "Enable the '--jsx' flag in your configuration file": { - "category": "Message", - "code": 95081 } }