Skip to content

Commit 73506f3

Browse files
authored
fix(46803): remove unused react imports with enabled react-jsxdev, react-jsx (microsoft#47247)
1 parent 4c80036 commit 73506f3

File tree

6 files changed

+72
-6
lines changed

6 files changed

+72
-6
lines changed

src/services/codefixes/importFixes.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -869,10 +869,6 @@ namespace ts.codefix {
869869
return { kind: ImportFixKind.PromoteTypeOnly, typeOnlyAliasDeclaration };
870870
}
871871

872-
function jsxModeNeedsExplicitImport(jsx: JsxEmit | undefined) {
873-
return jsx === JsxEmit.React || jsx === JsxEmit.ReactNative;
874-
}
875-
876872
function getSymbolName(sourceFile: SourceFile, checker: TypeChecker, symbolToken: Identifier, compilerOptions: CompilerOptions): string {
877873
const parent = symbolToken.parent;
878874
if ((isJsxOpeningLikeElement(parent) || isJsxClosingElement(parent)) && parent.tagName === symbolToken && jsxModeNeedsExplicitImport(compilerOptions.jsx)) {

src/services/organizeImports.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ namespace ts.OrganizeImports {
9595
}
9696

9797
const typeChecker = program.getTypeChecker();
98+
const compilerOptions = program.getCompilerOptions();
9899
const jsxNamespace = typeChecker.getJsxNamespace(sourceFile);
99100
const jsxFragmentFactory = typeChecker.getJsxFragmentFactory(sourceFile);
100101
const jsxElementsPresent = !!(sourceFile.transformFlags & TransformFlags.ContainsJsx);
@@ -162,7 +163,7 @@ namespace ts.OrganizeImports {
162163

163164
function isDeclarationUsed(identifier: Identifier) {
164165
// The JSX factory symbol is always used if JSX elements are present - even if they are not allowed.
165-
return jsxElementsPresent && (identifier.text === jsxNamespace || jsxFragmentFactory && identifier.text === jsxFragmentFactory) ||
166+
return jsxElementsPresent && (identifier.text === jsxNamespace || jsxFragmentFactory && identifier.text === jsxFragmentFactory) && jsxModeNeedsExplicitImport(compilerOptions.jsx) ||
166167
FindAllReferences.Core.isSymbolReferencedInFile(identifier, typeChecker, sourceFile);
167168
}
168169
}

src/services/utilities.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3335,5 +3335,9 @@ namespace ts {
33353335
};
33363336
}
33373337

3338+
export function jsxModeNeedsExplicitImport(jsx: JsxEmit | undefined) {
3339+
return jsx === JsxEmit.React || jsx === JsxEmit.ReactNative;
3340+
}
3341+
33383342
// #endregion
33393343
}

tests/baselines/reference/organizeImports/JsxFactoryUsedJs.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,5 @@ import { React, Other } from "react";
66
77
// ==ORGANIZED==
88

9-
import { React } from "react";
109

1110
<div/>;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @allowSyntheticDefaultImports: true
4+
// @moduleResolution: node
5+
// @noUnusedLocals: true
6+
// @target: es2018
7+
// @jsx: react-jsx
8+
9+
// @filename: test.tsx
10+
////import React from 'react';
11+
////export default () => <div></div>
12+
13+
// @filename: node_modules/react/package.json
14+
////{
15+
//// "name": "react",
16+
//// "types": "index.d.ts",
17+
////}
18+
19+
// @filename: node_modules/react/index.d.ts
20+
////export = React;
21+
////declare namespace JSX {
22+
//// interface IntrinsicElements { [x: string]: any; }
23+
////}
24+
////declare namespace React {}
25+
26+
// @filename: node_modules/react/jsx-runtime.d.ts
27+
////import './';
28+
29+
// @filename: node_modules/react/jsx-dev-runtime.d.ts
30+
////import './';
31+
32+
goTo.file("test.tsx");
33+
verify.organizeImports(`export default () => <div></div>`);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @allowSyntheticDefaultImports: true
4+
// @moduleResolution: node
5+
// @noUnusedLocals: true
6+
// @target: es2018
7+
// @jsx: react-jsxdev
8+
9+
// @filename: test.tsx
10+
////import React from 'react';
11+
////export default () => <div></div>
12+
13+
// @filename: node_modules/react/package.json
14+
////{
15+
//// "name": "react",
16+
//// "types": "index.d.ts",
17+
////}
18+
19+
// @filename: node_modules/react/index.d.ts
20+
////export = React;
21+
////declare namespace JSX {
22+
//// interface IntrinsicElements { [x: string]: any; }
23+
////}
24+
////declare namespace React {}
25+
26+
// @filename: node_modules/react/jsx-runtime.d.ts
27+
////import './';
28+
29+
// @filename: node_modules/react/jsx-dev-runtime.d.ts
30+
////import './';
31+
32+
goTo.file("test.tsx");
33+
verify.organizeImports(`export default () => <div></div>`);

0 commit comments

Comments
 (0)