From b1a73ab560ef0f0a681f7aa171b349d05a16e00b Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 28 Feb 2019 13:52:57 -0800 Subject: [PATCH] Resolve aliases to jsx namespace symbol (#30160) --- src/compiler/checker.ts | 2 +- .../reference/jsxNamespaceReexports.js | 32 +++++++++++++++++++ .../reference/jsxNamespaceReexports.symbols | 31 ++++++++++++++++++ .../reference/jsxNamespaceReexports.types | 27 ++++++++++++++++ .../cases/compiler/jsxNamespaceReexports.tsx | 18 +++++++++++ 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/jsxNamespaceReexports.js create mode 100644 tests/baselines/reference/jsxNamespaceReexports.symbols create mode 100644 tests/baselines/reference/jsxNamespaceReexports.types create mode 100644 tests/cases/compiler/jsxNamespaceReexports.tsx diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index eadf654e3a2..9b59cb3574d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18897,7 +18897,7 @@ namespace ts { const namespaceName = getJsxNamespace(location); const resolvedNamespace = resolveName(location, namespaceName, SymbolFlags.Namespace, /*diagnosticMessage*/ undefined, namespaceName, /*isUse*/ false); if (resolvedNamespace) { - const candidate = getSymbol(getExportsOfSymbol(resolveSymbol(resolvedNamespace)), JsxNames.JSX, SymbolFlags.Namespace); + const candidate = resolveSymbol(getSymbol(getExportsOfSymbol(resolveSymbol(resolvedNamespace)), JsxNames.JSX, SymbolFlags.Namespace)); if (candidate) { if (links) { links.jsxNamespace = candidate; diff --git a/tests/baselines/reference/jsxNamespaceReexports.js b/tests/baselines/reference/jsxNamespaceReexports.js new file mode 100644 index 00000000000..55c5ca4637e --- /dev/null +++ b/tests/baselines/reference/jsxNamespaceReexports.js @@ -0,0 +1,32 @@ +//// [tests/cases/compiler/jsxNamespaceReexports.tsx] //// + +//// [library.ts] +function createElement(element: string, props: any, ...children: any[]): any {} + +namespace JSX { + export interface IntrinsicElements { + [key: string]: Record; + } +} + +export { createElement, JSX }; +//// [index.tsx] +import * as MyLib from "./library"; + +const content = ; + +//// [library.js] +"use strict"; +exports.__esModule = true; +function createElement(element, props) { + var children = []; + for (var _i = 2; _i < arguments.length; _i++) { + children[_i - 2] = arguments[_i]; + } +} +exports.createElement = createElement; +//// [index.js] +"use strict"; +exports.__esModule = true; +var MyLib = require("./library"); +var content = MyLib.createElement("my-element", null); diff --git a/tests/baselines/reference/jsxNamespaceReexports.symbols b/tests/baselines/reference/jsxNamespaceReexports.symbols new file mode 100644 index 00000000000..c0a2c786d39 --- /dev/null +++ b/tests/baselines/reference/jsxNamespaceReexports.symbols @@ -0,0 +1,31 @@ +=== tests/cases/compiler/library.ts === +function createElement(element: string, props: any, ...children: any[]): any {} +>createElement : Symbol(createElement, Decl(library.ts, 0, 0)) +>element : Symbol(element, Decl(library.ts, 0, 23)) +>props : Symbol(props, Decl(library.ts, 0, 39)) +>children : Symbol(children, Decl(library.ts, 0, 51)) + +namespace JSX { +>JSX : Symbol(JSX, Decl(library.ts, 0, 79)) + + export interface IntrinsicElements { +>IntrinsicElements : Symbol(IntrinsicElements, Decl(library.ts, 2, 15)) + + [key: string]: Record; +>key : Symbol(key, Decl(library.ts, 4, 5)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) + } +} + +export { createElement, JSX }; +>createElement : Symbol(createElement, Decl(library.ts, 8, 8)) +>JSX : Symbol(JSX, Decl(library.ts, 8, 23)) + +=== tests/cases/compiler/index.tsx === +import * as MyLib from "./library"; +>MyLib : Symbol(MyLib, Decl(index.tsx, 0, 6)) + +const content = ; +>content : Symbol(content, Decl(index.tsx, 2, 5)) +>my-element : Symbol(MyLib.JSX.IntrinsicElements, Decl(library.ts, 2, 15)) + diff --git a/tests/baselines/reference/jsxNamespaceReexports.types b/tests/baselines/reference/jsxNamespaceReexports.types new file mode 100644 index 00000000000..857915efe39 --- /dev/null +++ b/tests/baselines/reference/jsxNamespaceReexports.types @@ -0,0 +1,27 @@ +=== tests/cases/compiler/library.ts === +function createElement(element: string, props: any, ...children: any[]): any {} +>createElement : (element: string, props: any, ...children: any[]) => any +>element : string +>props : any +>children : any[] + +namespace JSX { + export interface IntrinsicElements { + [key: string]: Record; +>key : string + } +} + +export { createElement, JSX }; +>createElement : (element: string, props: any, ...children: any[]) => any +>JSX : any + +=== tests/cases/compiler/index.tsx === +import * as MyLib from "./library"; +>MyLib : typeof MyLib + +const content = ; +>content : error +> : error +>my-element : any + diff --git a/tests/cases/compiler/jsxNamespaceReexports.tsx b/tests/cases/compiler/jsxNamespaceReexports.tsx new file mode 100644 index 00000000000..481fd7da2ca --- /dev/null +++ b/tests/cases/compiler/jsxNamespaceReexports.tsx @@ -0,0 +1,18 @@ + +// @jsx: react +// @jsxFactory: MyLib.createElement +// @strict: true +// @filename: library.ts +function createElement(element: string, props: any, ...children: any[]): any {} + +namespace JSX { + export interface IntrinsicElements { + [key: string]: Record; + } +} + +export { createElement, JSX }; +// @filename: index.tsx +import * as MyLib from "./library"; + +const content = ; \ No newline at end of file