in PluginsAndFeatures/azure-toolkit-for-rider/src/dotnet/ReSharper.Azure/Azure.Daemon/FunctionApp/Stages/Analysis/TimerTriggerCronExpressionAnalyzer.cs [46:92]
protected override void Run(IAttribute element, ElementProblemAnalyzerData data, IHighlightingConsumer consumer)
{
if (element.Arguments.Count != 1) return;
var resolveResult = element.TypeReference?.Resolve();
var typeElement = resolveResult?.DeclaredElement as ITypeElement;
if (typeElement == null) return;
if (!typeElement.IsTimerTriggerAttribute()) return;
var expressionArgument = element.Arguments.FirstOrDefault()?.Value;
if (expressionArgument is null || !expressionArgument.Type().IsString()) return;
if (expressionArgument is not ICSharpLiteralExpression literalExpression) return;
var literal = literalExpression.ConstantValue.StringValue;
if (literal.IsEmpty()) return;
if (literal.StartsWith('%') && literal.EndsWith('%') && literal.Length > 2) return;
var mayBeTimeSpanSchedule = literal.Contains(':');
if (mayBeTimeSpanSchedule)
{
if (IsValidTimeSpanSchedule(literal, out var errorMessage, out var description) &&
!string.IsNullOrEmpty(description))
{
consumer.AddHighlighting(new TimerTriggerCronExpressionHint(description, literalExpression,
literalExpression.GetDocumentEndOffset()));
}
else
{
consumer.AddHighlighting(new TimerTriggerCronExpressionError(literalExpression, errorMessage));
}
}
else
{
if (IsValidCrontabSchedule(literal, out var errorMessage, out var description) &&
!string.IsNullOrEmpty(description))
{
consumer.AddHighlighting(new TimerTriggerCronExpressionHint(description, literalExpression,
literalExpression.GetDocumentEndOffset()));
}
else
{
consumer.AddHighlighting(new TimerTriggerCronExpressionError(literalExpression, errorMessage));
}
}
}