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