@@ -5273,7 +5273,71 @@ export class Compiler extends DiagnosticEmitter {
52735273 while ( expression . kind == NodeKind . Parenthesized ) {
52745274 expression = ( < ParenthesizedExpression > expression ) . expression ;
52755275 }
5276- return expression . kind != NodeKind . Identifier ;
5276+ switch ( expression . kind ) {
5277+ case NodeKind . Call :
5278+ case NodeKind . New :
5279+ case NodeKind . UnaryPostfix :
5280+ return true ;
5281+ case NodeKind . UnaryPrefix : {
5282+ let unaryPrefix = < UnaryPrefixExpression > expression ;
5283+ switch ( unaryPrefix . operator ) {
5284+ case Token . Plus_Plus :
5285+ case Token . Minus_Minus :
5286+ case Token . Delete :
5287+ case Token . Await :
5288+ case Token . Yield :
5289+ return true ;
5290+ default :
5291+ return this . expressionHasSideEffects ( unaryPrefix . operand ) ;
5292+ }
5293+ }
5294+ case NodeKind . Assertion :
5295+ return this . expressionHasSideEffects ( ( < AssertionExpression > expression ) . expression ) ;
5296+ case NodeKind . PropertyAccess :
5297+ return this . expressionHasSideEffects ( ( < PropertyAccessExpression > expression ) . expression ) ;
5298+ case NodeKind . ElementAccess : {
5299+ let access = < ElementAccessExpression > expression ;
5300+ return this . expressionHasSideEffects ( access . expression )
5301+ || this . expressionHasSideEffects ( access . elementExpression ) ;
5302+ }
5303+ case NodeKind . Comma : {
5304+ let expressions = ( < CommaExpression > expression ) . expressions ;
5305+ for ( let i = 0 , k = expressions . length ; i < k ; ++ i ) {
5306+ if ( this . expressionHasSideEffects ( unchecked ( expressions [ i ] ) ) ) return true ;
5307+ }
5308+ return false ;
5309+ }
5310+ case NodeKind . Ternary : {
5311+ let ternary = < TernaryExpression > expression ;
5312+ return this . expressionHasSideEffects ( ternary . condition )
5313+ || this . expressionHasSideEffects ( ternary . ifThen )
5314+ || this . expressionHasSideEffects ( ternary . ifElse ) ;
5315+ }
5316+ case NodeKind . Binary : {
5317+ let binary = < BinaryExpression > expression ;
5318+ switch ( binary . operator ) {
5319+ case Token . Equals :
5320+ case Token . Plus_Equals :
5321+ case Token . Minus_Equals :
5322+ case Token . Asterisk_Equals :
5323+ case Token . Asterisk_Asterisk_Equals :
5324+ case Token . Slash_Equals :
5325+ case Token . Percent_Equals :
5326+ case Token . LessThan_LessThan_Equals :
5327+ case Token . GreaterThan_GreaterThan_Equals :
5328+ case Token . GreaterThan_GreaterThan_GreaterThan_Equals :
5329+ case Token . Ampersand_Equals :
5330+ case Token . Bar_Equals :
5331+ case Token . Caret_Equals :
5332+ return true ;
5333+ default :
5334+ return this . expressionHasSideEffects ( binary . left )
5335+ || this . expressionHasSideEffects ( binary . right ) ;
5336+ }
5337+ }
5338+ default :
5339+ return false ;
5340+ }
52775341 }
52785342
52795343 makeLt ( leftExpr : ExpressionRef , rightExpr : ExpressionRef , type : Type ) : ExpressionRef {
0 commit comments