Skip to content

Commit ef98f0a

Browse files
author
Zibi Braniecki
committed
Dehardcode folds
1 parent 014750a commit ef98f0a

File tree

4 files changed

+81
-36
lines changed

4 files changed

+81
-36
lines changed

src/display_list.rs

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ pub enum DisplayLine {
9292
label: Option<String>,
9393
annotation_type: DisplayAnnotationType,
9494
},
95-
Fold,
95+
Fold {
96+
inline_marks: Vec<DisplayMark>,
97+
},
9698
}
9799

98100
#[derive(Debug, Clone, PartialEq)]
@@ -156,6 +158,53 @@ fn format_header(snippet: &Snippet, body: &[DisplayLine]) -> Vec<DisplayLine> {
156158
header
157159
}
158160

161+
fn fold_body(body: &[DisplayLine]) -> Vec<DisplayLine> {
162+
let mut new_body = vec![];
163+
164+
let mut no_annotation_lines_counter = 0;
165+
let mut idx = 0;
166+
167+
while idx < body.len() {
168+
match body[idx] {
169+
DisplayLine::Annotation {
170+
ref inline_marks, ..
171+
} => {
172+
if no_annotation_lines_counter > 10 {
173+
let fold_start = idx - no_annotation_lines_counter;
174+
let fold_end = idx;
175+
for i in fold_start..fold_start + 4 {
176+
new_body.push(body[i].clone());
177+
}
178+
new_body.push(DisplayLine::Fold {
179+
inline_marks: inline_marks.clone(),
180+
});
181+
for i in fold_end - 2..fold_end {
182+
new_body.push(body[i].clone());
183+
}
184+
} else {
185+
let start = idx - no_annotation_lines_counter;
186+
for i in start..idx {
187+
new_body.push(body[i].clone());
188+
}
189+
}
190+
no_annotation_lines_counter = 0;
191+
}
192+
DisplayLine::Source { .. } => {
193+
no_annotation_lines_counter += 1;
194+
idx += 1;
195+
continue;
196+
}
197+
_ => {
198+
no_annotation_lines_counter += 1;
199+
}
200+
}
201+
new_body.push(body[idx].clone());
202+
idx += 1;
203+
}
204+
205+
return new_body;
206+
}
207+
159208
fn format_body(snippet: &Snippet) -> Vec<DisplayLine> {
160209
let mut body = vec![];
161210

@@ -262,27 +311,7 @@ fn format_body(snippet: &Snippet) -> Vec<DisplayLine> {
262311
}
263312

264313
if snippet.fold.unwrap_or(false) {
265-
let mut no_annotation_lines_counter = 0;
266-
let mut idx = 0;
267-
while idx < body.len() {
268-
match body[idx] {
269-
DisplayLine::Annotation { .. } => {
270-
if no_annotation_lines_counter > 10 {
271-
let fold_start = idx - no_annotation_lines_counter + 5;
272-
let fold_end = idx - 2;
273-
let fold_len = fold_end - fold_start;
274-
275-
let slice = &[DisplayLine::Fold];
276-
277-
body.splice(fold_start..fold_end, slice.iter().cloned());
278-
idx -= fold_len - 1;
279-
}
280-
no_annotation_lines_counter += 0;
281-
}
282-
_ => no_annotation_lines_counter += 1,
283-
}
284-
idx += 1;
285-
}
314+
body = fold_body(&body);
286315
}
287316

288317
body.insert(0, DisplayLine::EmptySource);

src/display_list_formatting.rs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1+
use display_list::{DisplayAnnotationType, DisplayLine, DisplayMark, DisplaySnippetType};
12
use std::fmt;
2-
use display_list::{DisplayAnnotationType, DisplayLine, DisplayMark,
3-
DisplaySnippetType};
43

54
pub trait DisplayListFormatting {
65
fn format_snippet_type(snippet_type: &DisplaySnippetType) -> String;
@@ -54,28 +53,40 @@ pub trait DisplayListFormatting {
5453
}
5554
}
5655

57-
fn format_line(f: &mut fmt::Formatter, dl: &DisplayLine, lineno_width: usize, inline_marks_width: usize) -> fmt::Result {
56+
fn format_line(
57+
f: &mut fmt::Formatter,
58+
dl: &DisplayLine,
59+
lineno_width: usize,
60+
inline_marks_width: usize,
61+
) -> fmt::Result {
5862
match dl {
5963
DisplayLine::Description {
6064
snippet_type,
6165
id,
6266
label,
63-
} => writeln!(f,
67+
} => writeln!(
68+
f,
6469
"{}[{}]: {}",
6570
Self::format_snippet_type(&snippet_type),
6671
id,
6772
label
6873
),
69-
DisplayLine::Origin { path, row, col } => {
70-
writeln!(f, "{}--> {}:{}:{}", " ".repeat(lineno_width), path, row, col)
71-
}
74+
DisplayLine::Origin { path, row, col } => writeln!(
75+
f,
76+
"{}--> {}:{}:{}",
77+
" ".repeat(lineno_width),
78+
path,
79+
row,
80+
col
81+
),
7282
DisplayLine::EmptySource => writeln!(f, "{} |", " ".repeat(lineno_width)),
7383
DisplayLine::Source {
7484
lineno,
7585
inline_marks,
7686
content,
7787
..
78-
} => writeln!(f,
88+
} => writeln!(
89+
f,
7990
"{:>width$} |{} {}",
8091
lineno,
8192
Self::format_inline_marks(&inline_marks, inline_marks_width),
@@ -87,13 +98,18 @@ pub trait DisplayListFormatting {
8798
range,
8899
label,
89100
annotation_type,
90-
} => writeln!(f,
101+
} => writeln!(
102+
f,
91103
"{} |{}{}",
92104
" ".repeat(lineno_width),
93105
Self::format_inline_marks(&inline_marks, inline_marks_width),
94106
Self::format_annotation_content(range, &label, &annotation_type),
95107
),
96-
DisplayLine::Fold => writeln!(f, "... |",),
108+
DisplayLine::Fold { inline_marks } => writeln!(
109+
f,
110+
"... {}",
111+
Self::format_inline_marks(&inline_marks, inline_marks_width),
112+
),
97113
}
98114
}
99115
}

src/format.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use std::fmt;
21
use display_list::{DisplayLine, DisplayList, DisplaySnippetType};
32
use display_list_formatting::DisplayListFormatting;
3+
use std::fmt;
44

55
struct Formatter {}
66

@@ -37,7 +37,7 @@ impl fmt::Display for DisplayList {
3737
}
3838
_ => max,
3939
});
40-
40+
4141
for line in &self.body {
4242
Formatter::format_line(f, line, lineno_width, inline_marks_width)?;
4343
}

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
//! In order to produce such output, the user builds a
2626
//! [Snippet](self::snippet::Snippet) which has a single public method: `format`.
2727
28-
pub mod format;
29-
pub mod display_list_formatting;
3028
pub mod display_list;
29+
pub mod display_list_formatting;
30+
pub mod format;
3131
pub mod snippet;

0 commit comments

Comments
 (0)