From 3b35522fd09944c77e457180fa5ba392cd1e5151 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 24 Feb 2021 22:36:04 -0800 Subject: [PATCH] Type lookup in getIntrinsicAttributestypeFromJsxOpeningLikeElement should match getIntrinsicTagSymbol (#42819) --- src/compiler/checker.ts | 4 +- .../jsxLocalNamespaceIndexSignatureNoCrash.js | 35 ++++++++++++++++++ ...ocalNamespaceIndexSignatureNoCrash.symbols | 37 +++++++++++++++++++ ...xLocalNamespaceIndexSignatureNoCrash.types | 37 +++++++++++++++++++ ...jsxLocalNamespaceIndexSignatureNoCrash.tsx | 21 +++++++++++ 5 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.js create mode 100644 tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.symbols create mode 100644 tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.types create mode 100644 tests/cases/compiler/jsxLocalNamespaceIndexSignatureNoCrash.tsx diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 750df30a8c0..b7d1a13c943 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26059,11 +26059,11 @@ namespace ts { if (!links.resolvedJsxElementAttributesType) { const symbol = getIntrinsicTagSymbol(node); if (links.jsxFlags & JsxFlags.IntrinsicNamedElement) { - return links.resolvedJsxElementAttributesType = getTypeOfSymbol(symbol); + return links.resolvedJsxElementAttributesType = getTypeOfSymbol(symbol) || errorType; } else if (links.jsxFlags & JsxFlags.IntrinsicIndexedElement) { return links.resolvedJsxElementAttributesType = - getIndexTypeOfType(getDeclaredTypeOfSymbol(symbol), IndexKind.String)!; + getIndexTypeOfType(getJsxType(JsxNames.IntrinsicElements, node), IndexKind.String) || errorType; } else { return links.resolvedJsxElementAttributesType = errorType; diff --git a/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.js b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.js new file mode 100644 index 00000000000..2d444de1466 --- /dev/null +++ b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.js @@ -0,0 +1,35 @@ +//// [index.tsx] +export class X { + static jsx() { + return document.createElement('p'); + } +} + +export namespace X { + export namespace JSX { + export type IntrinsicElements = { + [other: string]: any; + }; + } +} + +function A() { + return (

Hello

); +} + +//// [index.js] +"use strict"; +exports.__esModule = true; +exports.X = void 0; +var X = /** @class */ (function () { + function X() { + } + X.jsx = function () { + return document.createElement('p'); + }; + return X; +}()); +exports.X = X; +function A() { + return (X.jsx("p", null, "Hello")); +} diff --git a/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.symbols b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.symbols new file mode 100644 index 00000000000..325e92dd818 --- /dev/null +++ b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.symbols @@ -0,0 +1,37 @@ +=== tests/cases/compiler/index.tsx === +export class X { +>X : Symbol(X, Decl(index.tsx, 0, 0), Decl(index.tsx, 4, 1)) + + static jsx() { +>jsx : Symbol(X.jsx, Decl(index.tsx, 0, 16)) + + return document.createElement('p'); +>document.createElement : Symbol(Document.createElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --)) +>document : Symbol(document, Decl(lib.dom.d.ts, --, --)) +>createElement : Symbol(Document.createElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --)) + } +} + +export namespace X { +>X : Symbol(X, Decl(index.tsx, 0, 0), Decl(index.tsx, 4, 1)) + + export namespace JSX { +>JSX : Symbol(JSX, Decl(index.tsx, 6, 20)) + + export type IntrinsicElements = { +>IntrinsicElements : Symbol(IntrinsicElements, Decl(index.tsx, 7, 26)) + + [other: string]: any; +>other : Symbol(other, Decl(index.tsx, 9, 13)) + + }; + } +} + +function A() { +>A : Symbol(A, Decl(index.tsx, 12, 1)) + + return (

Hello

); +>p : Symbol(__type, Decl(index.tsx, 8, 39)) +>p : Symbol(__type, Decl(index.tsx, 8, 39)) +} diff --git a/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.types b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.types new file mode 100644 index 00000000000..f0841d84040 --- /dev/null +++ b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.types @@ -0,0 +1,37 @@ +=== tests/cases/compiler/index.tsx === +export class X { +>X : X + + static jsx() { +>jsx : () => HTMLParagraphElement + + return document.createElement('p'); +>document.createElement('p') : HTMLParagraphElement +>document.createElement : { (tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K]; (tagName: K, options?: ElementCreationOptions): HTMLElementDeprecatedTagNameMap[K]; (tagName: string, options?: ElementCreationOptions): HTMLElement; } +>document : Document +>createElement : { (tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K]; (tagName: K, options?: ElementCreationOptions): HTMLElementDeprecatedTagNameMap[K]; (tagName: string, options?: ElementCreationOptions): HTMLElement; } +>'p' : "p" + } +} + +export namespace X { + export namespace JSX { + export type IntrinsicElements = { +>IntrinsicElements : IntrinsicElements + + [other: string]: any; +>other : string + + }; + } +} + +function A() { +>A : () => any + + return (

Hello

); +>(

Hello

) : error +>

Hello

: error +>p : any +>p : any +} diff --git a/tests/cases/compiler/jsxLocalNamespaceIndexSignatureNoCrash.tsx b/tests/cases/compiler/jsxLocalNamespaceIndexSignatureNoCrash.tsx new file mode 100644 index 00000000000..b7d14efe3d6 --- /dev/null +++ b/tests/cases/compiler/jsxLocalNamespaceIndexSignatureNoCrash.tsx @@ -0,0 +1,21 @@ +// @jsx: react +// @jsxFactory: X.jsx +// @filename: index.tsx + +export class X { + static jsx() { + return document.createElement('p'); + } +} + +export namespace X { + export namespace JSX { + export type IntrinsicElements = { + [other: string]: any; + }; + } +} + +function A() { + return (

Hello

); +} \ No newline at end of file