// ReSharper disable once SuggestBaseTypeForParameter
        private bool TryFillCompetitionTargetsFromLog(
            CompetitionTargets competitionTargets, XDocument[] xmlAnnotationDocs, CompetitionState competitionState)
        {
            competitionState.Logger.WriteLineInfo(
                $"{LogVerbosePrefix} Parsing XML annotations ({xmlAnnotationDocs.Length} doc(s)) from log '{PreviousRunLogUri}'.");

            bool updated = false;

            foreach (var competitionTarget in competitionTargets.Values)
            {
                bool hasAnnotations = false;

                foreach (var doc in xmlAnnotationDocs)
                {
                    var parsedLimit = XmlAnnotations.TryParseCompetitionLimit(competitionTarget.Target, doc, competitionState);
                    if (parsedLimit != null)
                    {
                        hasAnnotations = true;
                        updated       |= competitionTarget.UnionWith(parsedLimit);
                    }
                }

                if (!hasAnnotations)
                {
                    competitionState.WriteMessage(
                        MessageSource.Analyser, MessageSeverity.Warning,
                        $"No logged XML annotation for {competitionTarget.Target.MethodTitle} found. Check if the method was renamed.");
                }
            }

            return(updated);
        }
        private XDocument[] ReadXmlAnnotationDocsFromLog(Summary summary, CompetitionState competitionState)
        {
            competitionState.Logger.WriteLineInfo(
                $"{LogVerbosePrefix} Reading XML annotation documents from log '{PreviousRunLogUri}'.");

            var xmlAnnotationDocs = _annotationsCacheSlot[summary].GetOrAdd(
                PreviousRunLogUri,
                uri => XmlAnnotations.TryParseXmlAnnotationDocsFromLog(uri, competitionState));

            return(xmlAnnotationDocs);
        }
        /// <summary>Performs limit checking for competition benchmarks.</summary>
        /// <param name="summary">Summary for the run.</param>
        /// <returns>Enumerable with warnings for the benchmarks.</returns>
        public IEnumerable <IWarning> Analyse([NotNull] Summary summary)
        {
            Code.NotNull(summary, nameof(summary));

            var competitionState   = CompetitionCore.RunState[summary];
            var competitionTargets = TargetsSlot[summary];
            var warnings           = new List <IWarning>();

            if (CheckPreconditions(summary, competitionState))
            {
                AnalyseCore(summary, competitionTargets, competitionState, warnings);
            }

            if (competitionState.LooksLikeLastRun && LogCompetitionLimits)
            {
                XmlAnnotations.LogCompetitionTargets(competitionTargets.Values, competitionState);
            }

            return(warnings.ToArray());
        }
        private CompetitionLimit TryParseCompetitionLimit(
            Target target,
            CompetitionMetadata competitionMetadata,
            CompetitionState competitionState)
        {
            CompetitionLimit result = null;

            // DONTTOUCH: the doc should be loaded for validation even if IgnoreExistingAnnotations = true
            var resourceKey = new ResourceKey(
                target.Type.Assembly,
                competitionMetadata.MetadataResourceName,
                competitionMetadata.UseFullTypeName);

            var xmlAnnotationDoc = _xmlAnnotationsCache.GetOrAdd(
                resourceKey,
                r => XmlAnnotations.TryParseXmlAnnotationDoc(r.Item1, r.Item2, r.Item3, competitionState));

            if (!IgnoreExistingAnnotations && xmlAnnotationDoc != null)
            {
                var parsedLimit = XmlAnnotations.TryParseCompetitionLimit(
                    target,
                    xmlAnnotationDoc,
                    competitionState);

                if (parsedLimit == null)
                {
                    competitionState.WriteMessage(
                        MessageSource.Analyser, MessageSeverity.Warning,
                        $"No XML annotation for {target.MethodTitle} found. Check if the method was renamed.");
                }
                else
                {
                    result = parsedLimit;
                }
            }

            return(result);
        }