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