@@ -25,7 +25,7 @@ namespace ts {
25
25
if ( isLogicalOrCoalescingAssignmentExpression ( binaryExpression ) ) {
26
26
return transformLogicalAssignment ( binaryExpression ) ;
27
27
}
28
- // falls through
28
+ // falls through
29
29
default :
30
30
return visitEachChild ( node , visitor , context ) ;
31
31
}
@@ -37,32 +37,41 @@ namespace ts {
37
37
let left = skipParentheses ( visitNode ( binaryExpression . left , visitor , isLeftHandSideExpression ) ) ;
38
38
let assignmentTarget = left ;
39
39
const right = skipParentheses ( visitNode ( binaryExpression . right , visitor , isExpression ) ) ;
40
+
40
41
if ( isAccessExpression ( left ) ) {
41
- const tempVariable = factory . createTempVariable ( hoistVariableDeclaration ) ;
42
+ const propertyAccessTargetSimpleCopiable = isSimpleCopiableExpression ( left . expression ) ;
43
+ const propertyAccessTarget = propertyAccessTargetSimpleCopiable ? left . expression :
44
+ factory . createTempVariable ( hoistVariableDeclaration ) ;
45
+ const propertyAccessTargetAssignment = propertyAccessTargetSimpleCopiable ? left . expression : factory . createAssignment (
46
+ propertyAccessTarget ,
47
+ left . expression
48
+ ) ;
49
+
42
50
if ( isPropertyAccessExpression ( left ) ) {
43
51
assignmentTarget = factory . createPropertyAccessExpression (
44
- tempVariable ,
52
+ propertyAccessTarget ,
45
53
left . name
46
54
) ;
47
55
left = factory . createPropertyAccessExpression (
48
- factory . createAssignment (
49
- tempVariable ,
50
- left . expression
51
- ) ,
56
+ propertyAccessTargetAssignment ,
52
57
left . name
53
58
) ;
54
59
}
55
60
else {
61
+ const elementAccessArgumentSimpleCopiable = isSimpleCopiableExpression ( left . argumentExpression ) ;
62
+ const elementAccessArgument = elementAccessArgumentSimpleCopiable ? left . argumentExpression :
63
+ factory . createTempVariable ( hoistVariableDeclaration ) ;
64
+
56
65
assignmentTarget = factory . createElementAccessExpression (
57
- tempVariable ,
58
- left . argumentExpression
66
+ propertyAccessTarget ,
67
+ elementAccessArgument
59
68
) ;
60
69
left = factory . createElementAccessExpression (
61
- factory . createAssignment (
62
- tempVariable ,
63
- left . expression
64
- ) ,
65
- left . argumentExpression
70
+ propertyAccessTargetAssignment ,
71
+ elementAccessArgumentSimpleCopiable ? left . argumentExpression : factory . createAssignment (
72
+ elementAccessArgument ,
73
+ left . argumentExpression
74
+ )
66
75
) ;
67
76
}
68
77
}
0 commit comments