sqruff_lib/utils/reflow/
helpers.rs1use 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
8pub 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
29pub 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}