Skip to content
Prev Previous commit
Next Next commit
When emitting use jsx factory entity expression if provided
  • Loading branch information
sheetalkamat committed Nov 10, 2016
commit 3d6950d023b8c43b878292811189c5563128c8ec
34 changes: 29 additions & 5 deletions src/compiler/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -1651,10 +1678,7 @@ namespace ts {
}

return createCall(
createPropertyAccess(
createReactNamespace(reactNamespace, parentElement),
"createElement"
),
createJsxFactoryExpression(jsxFactoryEntity, reactNamespace, parentElement),
/*typeArguments*/ undefined,
argumentsList,
location
Expand Down
1 change: 1 addition & 0 deletions src/compiler/program.ts
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,7 @@ namespace ts {
writeFile: writeFileCallback || (
(fileName, data, writeByteOrderMark, onError, sourceFiles) => host.writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles)),
isEmitBlocked,
getJsxFactoryEntity: program.getJsxFactoryEntity,
};
}

Expand Down
3 changes: 2 additions & 1 deletion src/compiler/transformers/jsx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,8 @@ namespace ts {
|| createAssignHelper(currentSourceFile.externalHelpersModuleName, segments);
}

const element = createReactCreateElement(
const element = createExpressionForJsxElement(
context.getEmitHost().getJsxFactoryEntity(),
compilerOptions.reactNamespace,
tagName,
objectProperties,
Expand Down
2 changes: 2 additions & 0 deletions src/compiler/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ namespace ts {
/* @internal */
isSourceFileFromExternalLibrary(file: SourceFile): boolean;

/* @internal */
getJsxFactoryEntity(): EntityName;
getCommonSourceDirectory(): string;
getCanonicalFileName(fileName: string): string;
getNewLine(): string;
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/jsxFactoryIdentifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 })
];
}
}
4 changes: 2 additions & 2 deletions tests/baselines/reference/jsxFactoryQualifiedName.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 })
];
}
}