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);
}
}
}