bool LookaheadArray(ref ILReader reader) { var fork = reader.Clone(); if (fork.TryGetCall(nameof(Array.Empty)) != null && fork.TryGetCall(nameof(Expression.Lambda)) != null && fork.TryGetCall("Expression") != null && fork.TryGet(OpCodes.Ret) != null) { reader.Position = fork.Position; return(true); } return(false); }
bool LookaheadExpressionThisConstant(ref ILReader reader, TypeReference thisType) { var fork = reader.Clone(); if (//Expression.Constant(typeof(ThisType), this) fork.TryGet(OpCodes.Ldarg, 0) != null && fork.TryGet(OpCodes.Ldtoken) is Instruction ldTok && ldTok.Operand.Equals(thisType) & fork.TryGetCall(nameof(Type.GetTypeFromHandle)) != null && fork.TryGetCall(nameof(Expression.Constant)) != null) { reader.Position = fork.Position; return(true); } return(false); }
bool LookaheadClosureAssignment(bool isDup, ref ILReader reader, out ParameterReference parameterReference, out FieldReference fieldReference) { fieldReference = null; parameterReference = null; var fork = reader.Clone(); if ((isDup || fork.TryGet(OpCodes.Ldloc, 0) != null) && fork.TryGet(OpCodes.Ldarg) is Instruction ldarg && fork.TryGet(OpCodes.Stfld) is Instruction stfld) { parameterReference = (ParameterReference)ldarg.Operand; fieldReference = (FieldReference)stfld.Operand; reader.Position = fork.Position; return(true); } return(false); }
bool LookaheadExpressionFieldConstant(bool isDup, ref ILReader reader, out MetadataToken?fieldToken) { fieldToken = null; var fork = reader.Clone(); if (//Expression.Constant(typeof(<>__DisplayClass>), c) (isDup || fork.TryGet(OpCodes.Ldloc, 0) != null) && fork.TryGet(OpCodes.Ldtoken) != null && fork.TryGetCall(nameof(Type.GetTypeFromHandle)) != null && fork.TryGetCall(nameof(Expression.Constant)) != null && //Expression.Field( , fieldof(c.a)); fork.TryGet(OpCodes.Ldtoken) is Instruction ldtoken && fork.TryGetCall(nameof(System.Reflection.FieldInfo.GetFieldFromHandle)) != null && fork.TryGetCall(nameof(Expression.Field)) != null) { fieldToken = ((FieldReference)ldtoken.Operand).MetadataToken; reader.Position = fork.Position; return(true); } return(false); }