From 46b79728853e8c47e5a0a0a1de688e2d553e5426 Mon Sep 17 00:00:00 2001
From: Hoang Pham <11971101+hoangpham95@users.noreply.github.com>
Date: Fri, 16 Aug 2019 12:46:55 -0700
Subject: [PATCH] Add JSX codefix if available (#32281)
* Add JSX codefix if available
* Update react jsx.
* Update diagnostic code.
---
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 492f853c347..0bd4693875e 100644
--- a/src/compiler/diagnosticMessages.json
+++ b/src/compiler/diagnosticMessages.json
@@ -5112,6 +5112,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",
diff --git a/src/services/codefixes/fixEnableJsxFlag.ts b/src/services/codefixes/fixEnableJsxFlag.ts
new file mode 100644
index 00000000000..728366392f1
--- /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", createStringLiteral("react"));
+ }
+}
diff --git a/src/services/tsconfig.json b/src/services/tsconfig.json
index c2a6946b5ed..6b52393422c 100644
--- a/src/services/tsconfig.json
+++ b/src/services/tsconfig.json
@@ -65,6 +65,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 00000000000..9d3c14f45bb
--- /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": "react",
+ }
+}`,
+ },
+});
diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_blankCompilerOptionsTsConfig.ts
new file mode 100644
index 00000000000..7b314feeecd
--- /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": "react",
+ }
+}`,
+ },
+});
diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInJsConfig.ts
new file mode 100644
index 00000000000..dbc7d39ec6c
--- /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": "react",
+ }
+}`,
+ },
+});
diff --git a/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts b/tests/cases/fourslash/codeFixEnableJsxFlag_disabledInCompilerOptionsInTsConfig.ts
new file mode 100644
index 00000000000..752abc156f7
--- /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": "react",
+ }
+}`,
+ },
+});
diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInJsconfig.ts
new file mode 100644
index 00000000000..89769c49d0b
--- /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": "react" },
+}`,
+ },
+});
diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_missingCompilerOptionsInTsconfig.ts
new file mode 100644
index 00000000000..dc81c7970af
--- /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": "react" },
+}`,
+ },
+});
diff --git a/tests/cases/fourslash/codefixEnableJsxFlag_noTsconfig.ts b/tests/cases/fourslash/codefixEnableJsxFlag_noTsconfig.ts
new file mode 100644
index 00000000000..f07f0035fb2
--- /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();