public static IType GuessType(RefactoringContext context, AstNode expr)
        {
            if (expr is SimpleType && expr.Role == Roles.TypeArgument)
            {
                if (expr.Parent is MemberReferenceExpression || expr.Parent is IdentifierExpression)
                {
                    var rr             = context.Resolve(expr.Parent);
                    var argumentNumber = expr.Parent.GetChildrenByRole(Roles.TypeArgument).TakeWhile(c => c != expr).Count();

                    var mgrr = rr as MethodGroupResolveResult;
                    if (mgrr != null && mgrr.Methods.Any() && mgrr.Methods.First().TypeArguments.Count > argumentNumber)
                    {
                        return(mgrr.Methods.First().TypeParameters[argumentNumber]);
                    }
                }
                else if (expr.Parent is MemberType || expr.Parent is SimpleType)
                {
                    var rr             = context.Resolve(expr.Parent);
                    var argumentNumber = expr.Parent.GetChildrenByRole(Roles.TypeArgument).TakeWhile(c => c != expr).Count();
                    var mgrr           = rr as TypeResolveResult;
                    if (mgrr != null && mgrr.Type.TypeParameterCount > argumentNumber)
                    {
                        return(mgrr.Type.GetDefinition().TypeParameters[argumentNumber]);
                    }
                }
            }

            var type          = GetValidTypes(context.Resolver, expr).ToArray();
            var typeInference = new TypeInference(context.Compilation);

            typeInference.Algorithm = TypeInferenceAlgorithm.Improved;
            var inferedType = typeInference.FindTypeInBounds(type, emptyTypes);

            return(inferedType);
        }
        internal static IType GuessType(RefactoringContext context, Expression expr)
        {
            var type          = GetValidTypes(context.Resolver, expr).ToArray();
            var typeInference = new TypeInference(context.Compilation);

            typeInference.Algorithm = TypeInferenceAlgorithm.ImprovedReturnAllResults;
            var inferedType = typeInference.FindTypeInBounds(type, emptyTypes);

            return(inferedType);
        }
        public static AstType GuessAstType(RefactoringContext context, AstNode expr)
        {
            var type          = GetValidTypes(context.Resolver, expr).ToArray();
            var typeInference = new TypeInference(context.Compilation);

            typeInference.Algorithm = TypeInferenceAlgorithm.Improved;
            var inferedType = typeInference.FindTypeInBounds(type, emptyTypes);

            if (inferedType.Kind == TypeKind.Unknown)
            {
                return(new PrimitiveType("object"));
            }
            return(context.CreateShortType(inferedType));
        }