From 93249db692ed705327f27c0d81bd997fbf2cc9b6 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 4 Jan 2019 14:07:57 -0800 Subject: [PATCH] Use the sourceFile to determine the jsxNamespace at the location for organizingImports Fixes #28827 --- src/services/codefixes/importFixes.ts | 2 +- src/services/organizeImports.ts | 2 +- .../unittests/services/organizeImports.ts | 28 +++++++++++++++++++ .../reference/organizeImports/JsxPragmaTsx.ts | 15 ++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/organizeImports/JsxPragmaTsx.ts diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 14bfc8b276..8006d1a0cf 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -375,7 +375,7 @@ namespace ts.codefix { const symbolName = isJsxOpeningLikeElement(symbolToken.parent) && symbolToken.parent.tagName === symbolToken && (isIntrinsicJsxName(symbolToken.text) || checker.resolveName(symbolToken.text, symbolToken, SymbolFlags.All, /*excludeGlobals*/ false)) - ? checker.getJsxNamespace() + ? checker.getJsxNamespace(sourceFile) : symbolToken.text; // "default" is a keyword and not a legal identifier for the import, so we don't expect it here Debug.assert(symbolName !== InternalSymbolName.Default); diff --git a/src/services/organizeImports.ts b/src/services/organizeImports.ts index c2a7ea180b..157ba98e26 100644 --- a/src/services/organizeImports.ts +++ b/src/services/organizeImports.ts @@ -83,7 +83,7 @@ namespace ts.OrganizeImports { function removeUnusedImports(oldImports: ReadonlyArray, sourceFile: SourceFile, program: Program) { const typeChecker = program.getTypeChecker(); - const jsxNamespace = typeChecker.getJsxNamespace(); + const jsxNamespace = typeChecker.getJsxNamespace(sourceFile); const jsxElementsPresent = !!(sourceFile.transformFlags & TransformFlags.ContainsJsx); const usedImports: ImportDeclaration[] = []; diff --git a/src/testRunner/unittests/services/organizeImports.ts b/src/testRunner/unittests/services/organizeImports.ts index d3fe55f968..8116b1e268 100644 --- a/src/testRunner/unittests/services/organizeImports.ts +++ b/src/testRunner/unittests/services/organizeImports.ts @@ -596,6 +596,34 @@ import { React, Other } from "react"; }, reactLibFile); + testOrganizeImports("JsxPragmaTsx", + { + path: "/test.tsx", + content: `/** @jsx jsx */ + +import { Global, jsx } from '@emotion/core'; +import * as React from 'react'; + +export const App: React.FunctionComponent = _ =>

Hello!

+`, + }, + { + path: "/@emotion/core/index.d.ts", + content: `import { createElement } from 'react' +export const jsx: typeof createElement; +export function Global(props: any): ReactElement;` + }, + { + path: reactLibFile.path, + content: `${reactLibFile.content} +export namespace React { + interface FunctionComponent { + } +} +` + } + ); + describe("Exports", () => { testOrganizeExports("MoveToTop", diff --git a/tests/baselines/reference/organizeImports/JsxPragmaTsx.ts b/tests/baselines/reference/organizeImports/JsxPragmaTsx.ts new file mode 100644 index 0000000000..3832111591 --- /dev/null +++ b/tests/baselines/reference/organizeImports/JsxPragmaTsx.ts @@ -0,0 +1,15 @@ +// ==ORIGINAL== +/** @jsx jsx */ + +import { Global, jsx } from '@emotion/core'; +import * as React from 'react'; + +export const App: React.FunctionComponent = _ =>

Hello!

+ +// ==ORGANIZED== +/** @jsx jsx */ + +import { Global, jsx } from '@emotion/core'; +import * as React from 'react'; + +export const App: React.FunctionComponent = _ =>

Hello!