public sealed override async Task RegisterCodeFixesAsync()

in src/WebJobs.Extensions.DurableTask.Analyzers/CodefixProviders/Orchestrator/TimerCodeFixProvider.cs [33:83]


        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

            var diagnostic = context.Diagnostics.First();
            var diagnosticSpan = diagnostic.Location.SourceSpan;

            var expression = root.FindNode(diagnosticSpan, false, true);
            if (!TryGetInvocationExpression(expression, out SyntaxNode invocationExpression))
            {
                return;
            }

            SemanticModel semanticModel = await context.Document.GetSemanticModelAsync();
            var durableVersion = SyntaxNodeUtils.GetDurableVersion(semanticModel);

            if (SyntaxNodeUtils.IsInsideOrchestrationTrigger(invocationExpression) && durableVersion.Equals(DurableVersion.V2))
            {
                if (CodeFixProviderUtils.TryGetDurableOrchestrationContextVariableName(invocationExpression, out string variableName))
                {
                    var newExpression = "";
                    if (TryGetMillisecondsParameter(invocationExpression, out string milliseconds))
                    {

                        if (TryGetCancellationTokenParameter(invocationExpression, semanticModel, out string cancellationToken))
                        {
                            newExpression = variableName + ".CreateTimer(" + variableName + ".CurrentUtcDateTime.AddMilliseconds(" + milliseconds + "), " + cancellationToken + ")";
                        }
                        else
                        {
                            newExpression = variableName + ".CreateTimer(" + variableName + ".CurrentUtcDateTime.AddMilliseconds(" + milliseconds + "), CancellationToken.None)";
                        }
                    }
                    else if (TryGetTimespanParameter(invocationExpression, semanticModel, out string timeSpan))
                    {
                        if (TryGetCancellationTokenParameter(invocationExpression, semanticModel, out string cancellationToken))
                        {
                            newExpression = variableName + ".CreateTimer(" + variableName + ".CurrentUtcDateTime.Add(" + timeSpan + "), " + cancellationToken + ")";
                        }
                        else
                        {
                            newExpression = variableName + ".CreateTimer(" + variableName + ".CurrentUtcDateTime.Add(" + timeSpan + "), CancellationToken.None)";
                        }
                    }

                    context.RegisterCodeFix(
                    CodeAction.Create(FixTimerInOrchestrator.ToString(), c => ReplaceWithAwaitExpressionAsync(context.Document, expression, c, newExpression), nameof(TimerCodeFixProvider)),
                    diagnostic);
                }
            }
        }