public override void VisitExpressionStatement(ExpressionStatement node)
        {
            if (!node.IsAssignmentStatement())
            {
                return;
            }

            BinaryExpression assignExpression = node.Expression as BinaryExpression;
            if(assignExpression.Left.CodeNodeType != CodeNodeType.VariableReferenceExpression ||
                assignExpression.Right.CodeNodeType != CodeNodeType.FieldReferenceExpression)
            {
                return;
            }

            FieldReferenceExpression targetFieldRefExpression = assignExpression.Right as FieldReferenceExpression;
            if(targetFieldRefExpression.Target == null ||
                targetFieldRefExpression.Target.CodeNodeType != CodeNodeType.FieldReferenceExpression ||
                targetFieldRefExpression.Field.Name != "Target")
            {
                return;
            }

            FieldDefinition callSiteField = (targetFieldRefExpression.Target as FieldReferenceExpression).Field.Resolve();
            CallSiteInfo callSiteInfo;
            if(callSiteField == null || !fieldToCallSiteInfoMap.TryGetValue(callSiteField, out callSiteInfo))
            {
                return;
            }

            variableToCallSiteInfoMap.Add((assignExpression.Left as VariableReferenceExpression).Variable, callSiteInfo);
            statementsToRemove.Add(node);
        }
 public override void VisitExpressionStatement(ExpressionStatement node)
 {
     if (node.IsAssignmentStatement() && node.Parent.CodeNodeType == CodeNodeType.BlockStatement)
     {
         BinaryExpression assignment = node.Expression as BinaryExpression;
         if (assignment.Left.CodeNodeType == CodeNodeType.VariableReferenceExpression)
         {
             Visit(assignment.Right);
             AddDefinition((assignment.Left as VariableReferenceExpression).Variable.Resolve(), node);
             return;
         }
     }
     base.VisitExpressionStatement(node);
 }
 private bool CheckTheInitializer(ExpressionStatement statement, out VariableReference forVariable)
 {
     forVariable = null;
     return statement != null && statement.IsAssignmentStatement() && TryGetAssignedVariable(statement, out forVariable);
 }
        private bool CheckVariableInitialization(ExpressionStatement node)
        {
            if (!node.IsAssignmentStatement())
            {
                return false;
            }

            BinaryExpression theAssignExpression = node.Expression as BinaryExpression;

            if (theAssignExpression.Left.CodeNodeType != CodeNodeType.VariableReferenceExpression)
            {
                return false;
            }

            Expression value = theAssignExpression.Right;
            if (value.CodeNodeType == CodeNodeType.CastExpression)
            {
                value = (value as CastExpression).Expression;
            }

            if ((value.CodeNodeType != CodeNodeType.LiteralExpression || (value as LiteralExpression).Value != null) &&
                (value.CodeNodeType != CodeNodeType.FieldReferenceExpression))
            {
                return false;
            }

            if (value.CodeNodeType == CodeNodeType.FieldReferenceExpression)
            {
                FieldReferenceExpression fieldReferenceExpression = value as FieldReferenceExpression;
                
                TypeDefinition fieldType = fieldReferenceExpression.ExpressionType.Resolve();
                if (fieldType == null || fieldType.BaseType == null || fieldType.BaseType.FullName != "System.MulticastDelegate")
                {
                    return false;
                }

                // Slow checks
                FieldDefinition fieldDef = fieldReferenceExpression.Field.Resolve();
                if ((fieldDef.DeclaringType != this.context.MethodContext.Method.DeclaringType &&
                    !fieldDef.DeclaringType.IsNestedIn(this.context.MethodContext.Method.DeclaringType)) ||
                    !fieldDef.DeclaringType.IsCompilerGenerated())
                {
                    return false;
                }
            }

            initializationsToRemove[(theAssignExpression.Left as VariableReferenceExpression).Variable] = node;
            return true;
        }
 public override void VisitExpressionStatement(ExpressionStatement node)
 {
     if (node.IsAssignmentStatement() && CheckBinaryExpression(node.Expression as BinaryExpression))
     {
         statementsToRemove.Add(node);
     }
     else
     {
         base.VisitExpressionStatement(node);
     }
 }
 public override ICodeNode VisitExpressionStatement(ExpressionStatement node)
 {
     if (node.IsAssignmentStatement())
     {
         BinaryExpression assignExpression = node.Expression as BinaryExpression;
         if (assignExpression.Left.CodeNodeType == CodeNodeType.VariableReferenceExpression &&
             assignExpression.Right.CodeNodeType == CodeNodeType.FieldReferenceExpression)
         {
             FieldDefinition fieldDef = (assignExpression.Right as FieldReferenceExpression).Field.Resolve();
             if (fieldDef != null && fieldToCallSiteInfoMap.ContainsKey(fieldDef))
             {
                 return null;
             }
         }
     }
     return base.VisitExpressionStatement(node);
 }
        private bool CheckVariableInitialization(ExpressionStatement node)
        {
            if (!node.IsAssignmentStatement())
            {
                return false;
            }

            BinaryExpression theAssignExpression = node.Expression as BinaryExpression;

            if (theAssignExpression.Left.CodeNodeType != CodeNodeType.VariableReferenceExpression)
            {
                return false;
            }

            Expression value = theAssignExpression.Right;
            if (value.CodeNodeType == CodeNodeType.CastExpression)
            {
                value = (value as CastExpression).Expression;
            }

            if (value.CodeNodeType != CodeNodeType.LiteralExpression || (value as LiteralExpression).Value != null)
            {
                return false;
            }

            initializationsToRemove[(theAssignExpression.Left as VariableReferenceExpression).Variable] = node;
            return true;
        }