From 3d6950d023b8c43b878292811189c5563128c8ec Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 9 Nov 2016 13:15:13 -0800 Subject: [PATCH] When emitting use jsx factory entity expression if provided --- src/compiler/factory.ts | 34 ++++++++++++++++--- src/compiler/program.ts | 1 + src/compiler/transformers/jsx.ts | 3 +- src/compiler/utilities.ts | 2 ++ .../reference/jsxFactoryIdentifier.js | 4 +-- .../reference/jsxFactoryQualifiedName.js | 4 +-- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index c557e3514a5..de6191f085a 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -1628,7 +1628,34 @@ namespace ts { return react; } - export function createReactCreateElement(reactNamespace: string, tagName: Expression, props: Expression, children: Expression[], parentElement: JsxOpeningLikeElement, location: TextRange): LeftHandSideExpression { + function createJsxFactoryExpressionFromEntityName(jsxFactory: EntityName, parent: JsxOpeningLikeElement): Expression { + if (isQualifiedName(jsxFactory)) { + return createPropertyAccess( + createJsxFactoryExpressionFromEntityName( + jsxFactory.left, + parent + ), + setEmitFlags( + getMutableClone(jsxFactory.right), + EmitFlags.NoSourceMap + ) + ); + } + else { + return createReactNamespace(jsxFactory.text, parent); + } + } + + function createJsxFactoryExpression(jsxFactoryEntity: EntityName, reactNamespace: string, parent: JsxOpeningLikeElement): Expression { + return jsxFactoryEntity ? + createJsxFactoryExpressionFromEntityName(jsxFactoryEntity, parent) : + createPropertyAccess( + createReactNamespace(reactNamespace, parent), + "createElement" + ); + } + + export function createExpressionForJsxElement(jsxFactoryEntity: EntityName, reactNamespace: string, tagName: Expression, props: Expression, children: Expression[], parentElement: JsxOpeningLikeElement, location: TextRange): LeftHandSideExpression { const argumentsList = [tagName]; if (props) { argumentsList.push(props); @@ -1651,10 +1678,7 @@ namespace ts { } return createCall( - createPropertyAccess( - createReactNamespace(reactNamespace, parentElement), - "createElement" - ), + createJsxFactoryExpression(jsxFactoryEntity, reactNamespace, parentElement), /*typeArguments*/ undefined, argumentsList, location diff --git a/src/compiler/program.ts b/src/compiler/program.ts index a733d93a3dd..90448d197d0 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -731,6 +731,7 @@ namespace ts { writeFile: writeFileCallback || ( (fileName, data, writeByteOrderMark, onError, sourceFiles) => host.writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles)), isEmitBlocked, + getJsxFactoryEntity: program.getJsxFactoryEntity, }; } diff --git a/src/compiler/transformers/jsx.ts b/src/compiler/transformers/jsx.ts index 95a4016bb0a..874f4f6862f 100644 --- a/src/compiler/transformers/jsx.ts +++ b/src/compiler/transformers/jsx.ts @@ -113,7 +113,8 @@ namespace ts { || createAssignHelper(currentSourceFile.externalHelpersModuleName, segments); } - const element = createReactCreateElement( + const element = createExpressionForJsxElement( + context.getEmitHost().getJsxFactoryEntity(), compilerOptions.reactNamespace, tagName, objectProperties, diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 299f91be662..826beccc7b1 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -34,6 +34,8 @@ namespace ts { /* @internal */ isSourceFileFromExternalLibrary(file: SourceFile): boolean; + /* @internal */ + getJsxFactoryEntity(): EntityName; getCommonSourceDirectory(): string; getCanonicalFileName(fileName: string): string; getNewLine(): string; diff --git a/tests/baselines/reference/jsxFactoryIdentifier.js b/tests/baselines/reference/jsxFactoryIdentifier.js index 13abba53751..8205e752abd 100644 --- a/tests/baselines/reference/jsxFactoryIdentifier.js +++ b/tests/baselines/reference/jsxFactoryIdentifier.js @@ -75,8 +75,8 @@ let c; class A { view() { return [ - React.createElement("meta", { content: "helloworld" }), - React.createElement("meta", { content: c.a.b }) + createElement("meta", { content: "helloworld" }), + createElement("meta", { content: c.a.b }) ]; } } diff --git a/tests/baselines/reference/jsxFactoryQualifiedName.js b/tests/baselines/reference/jsxFactoryQualifiedName.js index b5da232a3d4..e5c7b04f760 100644 --- a/tests/baselines/reference/jsxFactoryQualifiedName.js +++ b/tests/baselines/reference/jsxFactoryQualifiedName.js @@ -74,8 +74,8 @@ let c; class A { view() { return [ - React.createElement("meta", { content: "helloworld" }), - React.createElement("meta", { content: c.a.b }) + Element_1.Element.createElement("meta", { content: "helloworld" }), + Element_1.Element.createElement("meta", { content: c.a.b }) ]; } }