示例#1
0
        /// <inheritdoc/>
        protected override Size MeasureOverride(Size availableSize)
        {
            if (Items == null)
            {
                _placementMap.Clear();
                return(availableSize);
            }

            foreach (var item in Items.ToList())
            {
                var placement = DiagnosticInfoPlacementCalculator.CalculatePlacementRect(TextView, item, AdornmentSpaceReservation);
                if (_placementMap.ContainsKey(item))
                {
                    _placementMap[item] = placement;
                }
                else
                {
                    _placementMap.Add(item, placement);
                }
            }

            foreach (var placement in _placementMap.Keys.Where(x => !Items.Contains(x)).ToList())
            {
                _placementMap.Remove(placement);
            }

            return(availableSize);
        }
示例#2
0
        private void UpdateDiagnostics(IReadOnlyCollection <DiagnosticInfo> fileDiagnostics)
        {
            var lineMap = fileDiagnostics
                          .Select(x => x.LineNumber)
                          .Distinct()
                          .ToDictionary(x => x, x => DiagnosticInfoPlacementCalculator.GetRealLineNumber(TextView.TextView, x, OutliningManager));

            foreach (var diagnostic in fileDiagnostics)
            {
                if (!lineMap.ContainsKey(diagnostic.LineNumber))
                {
                    diagnostic.ComputedLineNumber = diagnostic.LineNumber;
                    continue;
                }

                diagnostic.ComputedLineNumber = lineMap[diagnostic.LineNumber];
            }

            // remove unused lines
            foreach (var line in DiagnosticInfoLines.Where(x => !lineMap.Values.Contains(x.LineNumber)).ToList())
            {
                DiagnosticInfoLines.Remove(line);
            }

            // update existing lines or add new ones
            foreach (var lineDiagnostics in fileDiagnostics.GroupBy(x => x.ComputedLineNumber))
            {
                var line = DiagnosticInfoLines.FirstOrDefault(x => x.LineNumber == lineDiagnostics.Key)
                           ?? new DiagnosticInfoLine(lineDiagnostics.Key, lineDiagnostics.OrderBy(x => x).ToList());

                if (!DiagnosticInfoLines.Contains(line))
                {
                    DiagnosticInfoLines.Add(line);
                }
                else
                {
                    line.DiagnosticInfos = lineDiagnostics.OrderBy(x => x).ToList();
                }
            }
        }