textDiagnosticLineDecorationsForDocument function

List<TextLineDecoration> textDiagnosticLineDecorationsForDocument({
  1. required TextDocument document,
  2. required Iterable<TextDiagnosticRange> diagnostics,
})

Implementation

List<TextLineDecoration> textDiagnosticLineDecorationsForDocument({
  required TextDocument document,
  required Iterable<TextDiagnosticRange> diagnostics,
}) {
  final normalizedDiagnostics = normalizeTextDiagnostics(diagnostics);
  if (normalizedDiagnostics.isEmpty) {
    return const [];
  }
  final lineSeverities = <int, TextDiagnosticSeverity>{};

  for (final diagnostic in normalizedDiagnostics) {
    final normalized = diagnostic.normalized();
    final startOffset = normalized.startOffset.clamp(0, document.length);
    final endOffset = normalized.endOffset.clamp(startOffset, document.length);
    final startLine = document.positionForOffset(startOffset).line;
    final endLine = endOffset <= startOffset
        ? startLine
        : document.positionForOffset(endOffset - 1).line;

    for (var lineIndex = startLine; lineIndex <= endLine; lineIndex++) {
      final existing = lineSeverities[lineIndex];
      if (existing == null ||
          _diagnosticSeverityRank(normalized.severity) >
              _diagnosticSeverityRank(existing)) {
        lineSeverities[lineIndex] = normalized.severity;
      }
    }
  }

  final sortedLines = lineSeverities.keys.toList(growable: false)..sort();
  return List<TextLineDecoration>.unmodifiable([
    for (final lineIndex in sortedLines)
      TextLineDecoration(
        lineIndex: lineIndex,
        styleKey: textDiagnosticLineStyleKey(lineSeverities[lineIndex]!),
        lineNumberMarker: textDiagnosticLineMarker(lineSeverities[lineIndex]!),
        lineNumberStyleKey: textDiagnosticLineNumberStyleKey(
          lineSeverities[lineIndex]!,
        ),
      ),
  ]);
}