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; }