From 20a8a30b76bf9ca95678951f69a1cc8f418bad71 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 23 Nov 2016 12:20:55 -0800 Subject: [PATCH] Instead of creating clone of the jsxFactory's leaf node, create synthesized node Fixes #12467 This avoid setting original node which would be something from isolated parsing and hence not valid when resolving expression --- src/compiler/factory.ts | 14 +++------- .../jsxFactoryQualifiedNameWithEs5.js | 27 +++++++++++++++++++ .../jsxFactoryQualifiedNameWithEs5.symbols | 23 ++++++++++++++++ .../jsxFactoryQualifiedNameWithEs5.types | 27 +++++++++++++++++++ .../jsxFactoryQualifiedNameWithEs5.ts | 17 ++++++++++++ 5 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.js create mode 100644 tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.symbols create mode 100644 tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.types create mode 100644 tests/cases/compiler/jsxFactoryQualifiedNameWithEs5.ts diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 63333dbe0b2df..ebcea221f9e8c 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -1677,16 +1677,10 @@ namespace ts { function createJsxFactoryExpressionFromEntityName(jsxFactory: EntityName, parent: JsxOpeningLikeElement): Expression { if (isQualifiedName(jsxFactory)) { - return createPropertyAccess( - createJsxFactoryExpressionFromEntityName( - jsxFactory.left, - parent - ), - setEmitFlags( - getMutableClone(jsxFactory.right), - EmitFlags.NoSourceMap - ) - ); + const left = createJsxFactoryExpressionFromEntityName(jsxFactory.left, parent); + const right = createSynthesizedNode(SyntaxKind.Identifier); + right.text = jsxFactory.right.text; + return createPropertyAccess(left, right); } else { return createReactNamespace(jsxFactory.text, parent); diff --git a/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.js b/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.js new file mode 100644 index 0000000000000..ecf7d13d89dc3 --- /dev/null +++ b/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.js @@ -0,0 +1,27 @@ +//// [index.tsx] + +import "./jsx"; + +var skate: any; +const React = { createElement: skate.h }; + +class Component { + renderCallback() { + return
test
; + } +}; + +//// [index.js] +"use strict"; +require("./jsx"); +var skate; +var React = { createElement: skate.h }; +var Component = (function () { + function Component() { + } + Component.prototype.renderCallback = function () { + return skate.h("div", null, "test"); + }; + return Component; +}()); +; diff --git a/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.symbols b/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.symbols new file mode 100644 index 0000000000000..35879c81ca675 --- /dev/null +++ b/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.symbols @@ -0,0 +1,23 @@ +=== tests/cases/compiler/index.tsx === + +import "./jsx"; + +var skate: any; +>skate : Symbol(skate, Decl(index.tsx, 3, 3)) + +const React = { createElement: skate.h }; +>React : Symbol(React, Decl(index.tsx, 4, 5)) +>createElement : Symbol(createElement, Decl(index.tsx, 4, 15)) +>skate : Symbol(skate, Decl(index.tsx, 3, 3)) + +class Component { +>Component : Symbol(Component, Decl(index.tsx, 4, 41)) + + renderCallback() { +>renderCallback : Symbol(Component.renderCallback, Decl(index.tsx, 6, 17)) + + return
test
; +>div : Symbol(unknown) +>div : Symbol(unknown) + } +}; diff --git a/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.types b/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.types new file mode 100644 index 0000000000000..21fd4bae84b3a --- /dev/null +++ b/tests/baselines/reference/jsxFactoryQualifiedNameWithEs5.types @@ -0,0 +1,27 @@ +=== tests/cases/compiler/index.tsx === + +import "./jsx"; + +var skate: any; +>skate : any + +const React = { createElement: skate.h }; +>React : { createElement: any; } +>{ createElement: skate.h } : { createElement: any; } +>createElement : any +>skate.h : any +>skate : any +>h : any + +class Component { +>Component : Component + + renderCallback() { +>renderCallback : () => any + + return
test
; +>
test
: any +>div : any +>div : any + } +}; diff --git a/tests/cases/compiler/jsxFactoryQualifiedNameWithEs5.ts b/tests/cases/compiler/jsxFactoryQualifiedNameWithEs5.ts new file mode 100644 index 0000000000000..86fd9935a1f40 --- /dev/null +++ b/tests/cases/compiler/jsxFactoryQualifiedNameWithEs5.ts @@ -0,0 +1,17 @@ +//@module: commonjs +//@target: es5 +//@jsx: react +//@jsxFactory: skate.h +//@noEmit: false + +// @filename: index.tsx +import "./jsx"; + +var skate: any; +const React = { createElement: skate.h }; + +class Component { + renderCallback() { + return
test
; + } +}; \ No newline at end of file