private bool TryConvertParameterFuncToAsync([NotNull] IInvocationExpression invocationExpression, [NotNull] ParameterCompareResult parameterCompareResult)
        {
            var arguments = invocationExpression.Arguments;

            invocationExpression.PsiModule.GetPsiServices().Transactions.StartTransaction("convertAsyncParameter");
            try
            {
                for (var i = 0; i < arguments.Count; i++)
                {
                    var compareResult = parameterCompareResult.ParameterResults[i];
                    if (compareResult.Action == ParameterCompareResultAction.NeedConvertToAsyncFunc)
                    {
                        var lambdaExpression = arguments[i].Value as ILambdaExpression;
                        if (lambdaExpression == null)
                        {
                            invocationExpression.PsiModule.GetPsiServices().Transactions.RollbackTransaction();
                            return(false);
                        }
                        lambdaExpression.SetAsync(true);

                        IInvocationExpression innerInvocationExpression;
                        while ((innerInvocationExpression
                                    = lambdaExpression.DescendantsInScope <IInvocationExpression>().FirstOrDefault(syncWaitChecker.CanReplaceWaitToAsync)) != null)
                        {
                            syncWaitConverter.ReplaceWaitToAsync(innerInvocationExpression);
                        }

                        IReferenceExpression referenceExpression;
                        while ((referenceExpression
                                    = lambdaExpression.DescendantsInScope <IReferenceExpression>().FirstOrDefault(syncWaitChecker.CanReplaceResultToAsync)) != null)
                        {
                            syncWaitConverter.ReplaceResultToAsync(referenceExpression);
                        }

                        var innerInvocationExpressions = lambdaExpression.DescendantsInScope <IInvocationExpression>();
                        foreach (var innerInvocationExpression2 in innerInvocationExpressions)
                        {
                            if (!TryReplaceInvocationToAsync(innerInvocationExpression2))
                            {
                                //invocationExpression.PsiModule.GetPsiServices().Transactions.RollbackTransaction();
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                invocationExpression.PsiModule.GetPsiServices().Transactions.RollbackTransaction();
                return(false);
            }

            invocationExpression.PsiModule.GetPsiServices().Transactions.CommitTransaction();
            return(true);
        }
        private bool TryConvertParameterFuncToAsync([NotNull] IInvocationExpression invocationExpression, [NotNull] ParameterCompareResult parameterCompareResult)
        {
            var arguments = invocationExpression.Arguments;

            invocationExpression.PsiModule.GetPsiServices().Transactions.StartTransaction("convertAsyncParameter");
            try
            {
                for (var i = 0; i < arguments.Count; i++)
                {
                    var compareResult = parameterCompareResult.ParameterResults[i];
                    if (compareResult.Action == ParameterCompareResultAction.NeedConvertToAsyncFunc)
                    {
                        var lambdaExpression = arguments[i].Value as ILambdaExpression;
                        if (lambdaExpression == null)
                        {
                            invocationExpression.PsiModule.GetPsiServices().Transactions.RollbackTransaction();
                            return(false);
                        }
                        lambdaExpression.SetAsync(true);
                        var innerInvocationExpressions = lambdaExpression.DescendantsInScope <IInvocationExpression>();
                        foreach (var innerInvocationExpression in innerInvocationExpressions)
                        {
                            if (!TryReplaceInvocationToAsync(innerInvocationExpression))
                            {
                                invocationExpression.PsiModule.GetPsiServices().Transactions.RollbackTransaction();
                                return(false);
                            }
                        }

                        if (awaitEliderChecker.CanElide(lambdaExpression))
                        {
                            awaitElider.Elide(lambdaExpression);
                        }
                    }
                }
            }
            catch (Exception)
            {
                invocationExpression.PsiModule.GetPsiServices().Transactions.RollbackTransaction();
                return(false);
            }

            invocationExpression.PsiModule.GetPsiServices().Transactions.CommitTransaction();
            return(true);
        }