private object ResolveOperand(object operand, GenericArguments genericArgs)
 {
     if (operand is MemberRef)
     {
         var memberRef = (MemberRef)operand;
         if (memberRef.IsFieldRef)
         {
             var field = ResolveField(memberRef.FieldSig, genericArgs);
             memberRef = new MemberRefUser(memberRef.Module, memberRef.Name, field, memberRef.Class);
         }
         else
         {
             var method = ResolveMethod(memberRef.MethodSig, genericArgs);
             memberRef = new MemberRefUser(memberRef.Module, memberRef.Name, method, memberRef.Class);
         }
         return(memberRef);
     }
     if (operand is TypeSpec)
     {
         var sig = ((TypeSpec)operand).TypeSig;
         return(genericArgs.ResolveType(sig).ToTypeDefOrRef());
     }
     if (operand is MethodSpec)
     {
         var spec = (MethodSpec)operand;
         spec = new MethodSpecUser(spec.Method, ResolveInst(spec.GenericInstMethodSig, genericArgs));
         return(spec);
     }
     return(operand);
 }
        private FieldSig ResolveField(FieldSig sig, GenericArguments genericArgs)
        {
            var newSig = sig.Clone();

            newSig.Type = genericArgs.ResolveType(newSig.Type);
            return(newSig);
        }
        GenericInstMethodSig ResolveInst(GenericInstMethodSig sig, GenericArguments genericArgs)
        {
            var newSig = sig.Clone();

            for (int i = 0; i < newSig.GenericArguments.Count; i++)
            {
                newSig.GenericArguments[i] = genericArgs.ResolveType(newSig.GenericArguments[i]);
            }
            return(newSig);
        }
        MethodSig ResolveMethod(MethodSig sig, GenericArguments genericArgs)
        {
            var newSig = sig.Clone();

            for (int i = 0; i < newSig.Params.Count; i++)
            {
                newSig.Params[i] = genericArgs.ResolveType(newSig.Params[i]);
            }

            if (newSig.ParamsAfterSentinel != null)
            {
                for (int i = 0; i < newSig.ParamsAfterSentinel.Count; i++)
                {
                    newSig.ParamsAfterSentinel[i] = genericArgs.ResolveType(newSig.ParamsAfterSentinel[i]);
                }
            }

            newSig.RetType = genericArgs.ResolveType(newSig.RetType);
            return(newSig);
        }
        private static ASTType?InferVarPush(ILASTExpression expr)
        {
            var method = (IMethod)expr.Operand;

            if (method.MethodSig.RetType.ElementType == ElementType.Void)
            {
                return(null);
            }

            var genArgs = new GenericArguments();

            if (method is MethodSpec)
            {
                genArgs.PushMethodArgs(((MethodSpec)method).GenericInstMethodSig.GenericArguments);
            }
            if (method.DeclaringType.TryGetGenericInstSig() != null)
            {
                genArgs.PushTypeArgs(method.DeclaringType.TryGetGenericInstSig().GenericArguments);
            }


            return(TypeInference.ToASTType(genArgs.ResolveType(method.MethodSig.RetType)));
        }