sqruff_lib/utils/reflow/
helpers.rs

1use smol_str::SmolStr;
2use sqruff_lib_core::dialects::syntax::SyntaxKind;
3use sqruff_lib_core::lint_fix::LintFix;
4use sqruff_lib_core::parser::segments::base::ErasedSegment;
5
6use crate::core::rules::base::LintResult;
7
8/// Return a list of fixes from an iterable of LintResult.
9pub fn fixes_from_results(
10    results: impl Iterator<Item = LintResult>,
11) -> impl Iterator<Item = LintFix> {
12    results.flat_map(|result| result.fixes)
13}
14
15pub fn pretty_segment_name(segment: &ErasedSegment) -> String {
16    if segment.is_type(SyntaxKind::Symbol) {
17        format!(
18            "{} {:?}",
19            segment.get_type().as_str().replace('_', " "),
20            segment.raw()
21        )
22    } else if segment.is_type(SyntaxKind::Keyword) {
23        format!("{:?} keyword", segment.raw())
24    } else {
25        segment.get_type().as_str().replace('_', " ")
26    }
27}
28
29/// Given a raw segment, deduce the indent of its line.
30pub fn deduce_line_indent(raw_segment: &ErasedSegment, root_segment: &ErasedSegment) -> SmolStr {
31    let seg_idx = root_segment
32        .get_raw_segments()
33        .iter()
34        .position(|seg| seg == raw_segment);
35    let mut indent_seg = None;
36    let raw_segments = root_segment.get_raw_segments();
37    if let Some(idx) = seg_idx {
38        for seg in raw_segments[..=idx].iter().rev() {
39            if seg.is_code() {
40                indent_seg = None;
41            } else if seg.is_type(SyntaxKind::Whitespace) {
42                indent_seg = Some(seg);
43            } else if seg.is_type(SyntaxKind::Newline) {
44                break;
45            }
46        }
47    }
48
49    indent_seg.map(|seg| seg.raw().clone()).unwrap_or_default()
50}