Avoid effect of element access expression (#39174)

* Avoid effect of element access expression

* Avoid unnecessary copy

* Add more tests
This commit is contained in:
Wenlu Wang
2020-06-26 08:38:05 +08:00
committed by GitHub
parent d610bbdaef
commit 6b4d0bff40
16 changed files with 377 additions and 45 deletions

View File

@@ -25,7 +25,7 @@ namespace ts {
if (isLogicalOrCoalescingAssignmentExpression(binaryExpression)) {
return transformLogicalAssignment(binaryExpression);
}
// falls through
// falls through
default:
return visitEachChild(node, visitor, context);
}
@@ -37,32 +37,41 @@ namespace ts {
let left = skipParentheses(visitNode(binaryExpression.left, visitor, isLeftHandSideExpression));
let assignmentTarget = left;
const right = skipParentheses(visitNode(binaryExpression.right, visitor, isExpression));
if (isAccessExpression(left)) {
const tempVariable = factory.createTempVariable(hoistVariableDeclaration);
const propertyAccessTargetSimpleCopiable = isSimpleCopiableExpression(left.expression);
const propertyAccessTarget = propertyAccessTargetSimpleCopiable ? left.expression :
factory.createTempVariable(hoistVariableDeclaration);
const propertyAccessTargetAssignment = propertyAccessTargetSimpleCopiable ? left.expression : factory.createAssignment(
propertyAccessTarget,
left.expression
);
if (isPropertyAccessExpression(left)) {
assignmentTarget = factory.createPropertyAccessExpression(
tempVariable,
propertyAccessTarget,
left.name
);
left = factory.createPropertyAccessExpression(
factory.createAssignment(
tempVariable,
left.expression
),
propertyAccessTargetAssignment,
left.name
);
}
else {
const elementAccessArgumentSimpleCopiable = isSimpleCopiableExpression(left.argumentExpression);
const elementAccessArgument = elementAccessArgumentSimpleCopiable ? left.argumentExpression :
factory.createTempVariable(hoistVariableDeclaration);
assignmentTarget = factory.createElementAccessExpression(
tempVariable,
left.argumentExpression
propertyAccessTarget,
elementAccessArgument
);
left = factory.createElementAccessExpression(
factory.createAssignment(
tempVariable,
left.expression
),
left.argumentExpression
propertyAccessTargetAssignment,
elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory.createAssignment(
elementAccessArgument,
left.argumentExpression
)
);
}
}