private static ImmutableArray <ParameterInfo> GetParameterInfos(
            InvocationExpressionSyntax invocation,
            IMethodSymbol methodSymbol)
        {
            bool isReduced = methodSymbol.MethodKind == MethodKind.ReducedExtension;

            if (isReduced)
            {
                methodSymbol = methodSymbol.GetConstructedReducedFrom();
            }

            ImmutableArray <IParameterSymbol> parameters = methodSymbol.Parameters;

            if (isReduced)
            {
                parameters = parameters.RemoveAt(0);
            }

            List <ParameterInfo> parameterInfos = null;

            SeparatedSyntaxList <ArgumentSyntax> arguments = invocation.ArgumentList.Arguments;

            foreach (ArgumentSyntax argument in arguments)
            {
                IParameterSymbol parameterSymbol = DetermineParameterHelper.DetermineParameter(argument, arguments, parameters);

                if (parameterSymbol != null)
                {
                    var parameterInfo = new ParameterInfo(parameterSymbol, argument.Expression);

                    (parameterInfos ?? (parameterInfos = new List <ParameterInfo>())).Add(parameterInfo);
                }
                else
                {
                    return(default(ImmutableArray <ParameterInfo>));
                }
            }

            foreach (IParameterSymbol parameterSymbol in parameters)
            {
                if (parameterInfos == null ||
                    parameterInfos.FindIndex(f =>
                {
                    Debug.WriteLine(f.ParameterSymbol == parameterSymbol);
                    Debug.WriteLine(f.ParameterSymbol.Equals(parameterSymbol));
                    Debug.WriteLine(f.ParameterSymbol.Name == parameterSymbol.Name);
                    return(f.ParameterSymbol.Equals(parameterSymbol));
                }) == -1)
                {
                    if (parameterSymbol.HasExplicitDefaultValue)
                    {
                        var parameterInfo = new ParameterInfo(parameterSymbol, parameterSymbol.GetDefaultValueSyntax());

                        (parameterInfos ?? (parameterInfos = new List <ParameterInfo>())).Add(parameterInfo);
                    }
                    else
                    {
                        return(default(ImmutableArray <ParameterInfo>));
                    }
                }
            }

            if (isReduced)
            {
                var memberAccess = (MemberAccessExpressionSyntax)invocation.Expression;

                var parameterInfo = new ParameterInfo(methodSymbol.Parameters[0], memberAccess.Expression.TrimTrivia());

                (parameterInfos ?? (parameterInfos = new List <ParameterInfo>())).Add(parameterInfo);
            }

            return((parameterInfos != null)
                ? parameterInfos.ToImmutableArray()
                : ImmutableArray <ParameterInfo> .Empty);
        }