private static async Task<Document> FixMember(Document document, MemberAccessExpressionSyntax memberAccessExpression, string apiId, string varName, CancellationToken cancellationToken)
        {
            var apiConversion = WinUIAppWindowAnalyzer.MemberApiConversions[apiId]!;
            if (apiConversion.ToApi is not IMemberDescription)
            {
                throw new InvalidOperationException($"Expecting all types in MemberApiConversions dictionary to be of type ITypeMemberDescription but found {apiConversion.ToApi.GetType()}");
            }

            var fromMember = (IMemberDescription)apiConversion.FromApi;
            var toMember = (IMemberDescription)apiConversion.ToApi;
            var (newTypeNamespace, newTypeName, newMemberName) = (toMember.TypeDescription.Namespace, toMember.TypeDescription.TypeName, toMember.MemberName);

            if (apiConversion.NeedsManualUpgradation)
            {
                var comment = SyntaxFactory.Comment(@$"
                    /* 
                        TODO {WinUIAppWindowAnalyzer.DiagnosticIdAppWindowMember}
                        Use {newTypeNamespace}.{newTypeName}.{newMemberName} instead of {fromMember.MemberName}.
                        Read: {apiConversion.DocumentationUrl}
                    */
                    ");
                var existingRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
                return document.WithSyntaxRoot(existingRoot!.ReplaceNode(memberAccessExpression, memberAccessExpression.WithLeadingTrivia(comment)));
            }

            var documentEditor = await DocumentEditor.CreateAsync(document, cancellationToken).ConfigureAwait(false);
            var instance = toMember.IsStatic ? $"{newTypeNamespace}.{newTypeName}" : varName;
            if (toMember.ApiType == ApiType.PropertyApi)
            {
                var expr = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                    SyntaxFactory.ParseExpression(instance), (SimpleNameSyntax)SyntaxFactory.ParseName(newMemberName));

                documentEditor.ReplaceNode(memberAccessExpression, expr.WithLeadingTrivia(memberAccessExpression.GetLeadingTrivia()));
                return document.WithSyntaxRoot(documentEditor.GetChangedRoot());
            }

            var invocationExpression = memberAccessExpression.AncestorsAndSelf().OfType<InvocationExpressionSyntax>().First();
            var newExpression = SyntaxFactory.InvocationExpression(SyntaxFactory.ParseExpression($"{instance}.{newMemberName}"));
            var newExpressionArgs = newExpression.DescendantNodes().OfType<ArgumentListSyntax>().First();
            var argsToAdd = invocationExpression.DescendantNodes().OfType<ArgumentListSyntax>().First().Arguments.ToArray();
            var newArgs = newExpressionArgs.AddArguments(argsToAdd);
            var newExpressionWithArgs = newExpression.ReplaceNode(newExpressionArgs, newArgs);

            if (fromMember.ApiType == ApiType.MethodApi && toMember.ApiType == ApiType.MethodApi
                && ((MethodDescription)fromMember).IsAsync && !((MethodDescription)toMember).IsAsync)
            {
                var awaitExpression = invocationExpression.Ancestors().OfType<AwaitExpressionSyntax>().FirstOrDefault();
                if (awaitExpression is not null)
                {
                    documentEditor.ReplaceNode(awaitExpression, newExpressionWithArgs.WithLeadingTrivia(invocationExpression.GetLeadingTrivia()));
                    return document.WithSyntaxRoot(documentEditor.GetChangedRoot());
                }
            }

            documentEditor.ReplaceNode(invocationExpression, newExpressionWithArgs.WithLeadingTrivia(invocationExpression.GetLeadingTrivia()));
            return document.WithSyntaxRoot(documentEditor.GetChangedRoot());
        }
        private Task <Document> InsertConfigurationComment(Document document, MemberAccessExpressionSyntax firstProperty, SyntaxNode root, LoggerConfiguration configuration, Func <LoggerConfiguration, string> generateConfig, CancellationToken cancellationToken)
        {
            var trivia = SyntaxFactory.ParseTrailingTrivia(generateConfig(configuration));

            var statement    = firstProperty.AncestorsAndSelf().OfType <StatementSyntax>().FirstOrDefault();
            var newStatement = statement.WithLeadingTrivia(statement.GetLeadingTrivia().InsertRange(0, trivia)).WithAdditionalAnnotations(Formatter.Annotation);
            var newRoot      = root.ReplaceNode(statement, newStatement);
            var newDocument  = document.WithSyntaxRoot(newRoot);

            return(Task.FromResult(newDocument));
        }