When emitting use jsx factory entity expression if provided

This commit is contained in:
Sheetal Nandi
2016-11-09 13:15:13 -08:00
parent 06affa6672
commit 3d6950d023
6 changed files with 38 additions and 10 deletions

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

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,
};
}

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,

View File

@@ -34,6 +34,8 @@ namespace ts {
/* @internal */
isSourceFileFromExternalLibrary(file: SourceFile): boolean;
/* @internal */
getJsxFactoryEntity(): EntityName;
getCommonSourceDirectory(): string;
getCanonicalFileName(fileName: string): string;
getNewLine(): string;

View File

@@ -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 })
];
}
}

View File

@@ -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 })
];
}
}