private object GetParameterOrFieldForExpressionArgumentCheck(MethodDefinition method, Collection<Instruction> instructions, Instruction instruction)
{
TypeReference displayClassType = null;
FieldDefinition parameterFieldDefinition = null;
// This logic is used for finding the parameter:
// 1) Find the display class
// 2) Find the field used
// 3) Check with which parameter the field is assigned
var index = instructions.IndexOf(instruction);
for (var i = index; i >= 0; i--)
{
var innerInstruction = instructions[i];
if (innerInstruction.IsOpCode(OpCodes.Ldtoken))
{
if (displayClassType == null)
{
// First call to ldtoken with FieldDefinition contains the display class type
parameterFieldDefinition = GetFieldDefinition(innerInstruction);
if (parameterFieldDefinition != null)
{
displayClassType = parameterFieldDefinition.DeclaringType;
}
}
}
if (innerInstruction.IsOpCode(OpCodes.Stfld))
{
var fieldDefinition = innerInstruction.Operand as FieldDefinition;
if (fieldDefinition == null)
{
var fieldReference = innerInstruction.Operand as FieldReference;
if (fieldReference != null)
{
fieldDefinition = fieldReference.Resolve();
}
}
if (fieldDefinition == parameterFieldDefinition)
{
// We found it, now check 1 instruction back for the actual parameter
var finalInstruction = instructions[i - 1];
var finalFieldDefinition = finalInstruction.Operand as FieldDefinition;
if (finalFieldDefinition != null)
{
return finalFieldDefinition;
}
var parameterDefinition = finalInstruction.Operand as ParameterDefinition;
if (parameterDefinition != null)
{
return parameterDefinition;
}
}
}
}
return null;
}