When emitting use jsx factory entity expression if provided

This commit is contained in:
Sheetal Nandi
2016-11-09 16:40:11 -08:00
parent 06affa6672
commit 3d6950d023
6 changed files with 38 additions and 10 deletions
+29 -5
View File
@@ -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
+1
View File
@@ -731,6 +731,7 @@ namespace ts {
writeFile: writeFileCallback || (
(fileName, data, writeByteOrderMark, onError, sourceFiles) => host.writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles)),
isEmitBlocked,
getJsxFactoryEntity: program.getJsxFactoryEntity,
};
}
+2 -1
View File
@@ -113,7 +113,8 @@ namespace ts {
|| createAssignHelper(currentSourceFile.externalHelpersModuleName, segments);
}
const element = createReactCreateElement(
const element = createExpressionForJsxElement(
context.getEmitHost().getJsxFactoryEntity(),
compilerOptions.reactNamespace,
tagName,
objectProperties,
+2
View File
@@ -34,6 +34,8 @@ namespace ts {
/* @internal */
isSourceFileFromExternalLibrary(file: SourceFile): boolean;
/* @internal */
getJsxFactoryEntity(): EntityName;
getCommonSourceDirectory(): string;
getCanonicalFileName(fileName: string): string;
getNewLine(): string;
@@ -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 })
];
}
}
@@ -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 })
];
}
}