mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-16 15:45:27 -05:00
Avoid effect of element access expression (#39174)
* Avoid effect of element access expression * Avoid unnecessary copy * Add more tests
This commit is contained in:
@@ -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
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user