textDiagnosticLineDecorationsForDocument function
List<TextLineDecoration>
textDiagnosticLineDecorationsForDocument({
- required TextDocument document,
- 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]!,
),
),
]);
}