Tie the GutterFn lifetime to the doc so we can avoid cloning data

This commit is contained in:
Blaž Hrastnik 2021-11-22 16:45:52 +09:00
parent c71c9f69e2
commit ba45db84d4

View File

@ -421,19 +421,19 @@ pub fn render_gutter(
.map(|range| range.cursor_line(text))
.collect();
fn diagnostic(
doc: &Document,
fn diagnostic<'doc>(
doc: &'doc Document,
_view: &View,
theme: &Theme,
_config: &Config,
_is_focused: bool,
_width: usize,
) -> GutterFn {
) -> GutterFn<'doc> {
let warning = theme.get("warning");
let error = theme.get("error");
let info = theme.get("info");
let hint = theme.get("hint");
let diagnostics = doc.diagnostics().to_vec(); // TODO
let diagnostics = doc.diagnostics();
Box::new(move |line: usize, _selected: bool| {
use helix_core::diagnostic::Severity;
@ -452,14 +452,14 @@ fn diagnostic(
})
}
fn line_number(
doc: &Document,
fn line_number<'doc>(
doc: &'doc Document,
view: &View,
theme: &Theme,
config: &Config,
is_focused: bool,
width: usize,
) -> GutterFn {
) -> GutterFn<'doc> {
let text = doc.text().slice(..);
let last_line = view.last_line(doc);
// Whether to draw the line number for the last line of the
@ -499,8 +499,9 @@ fn line_number(
})
}
type GutterFn = Box<dyn Fn(usize, bool) -> Option<(String, Style)>>;
type Gutter = fn(&Document, &View, &Theme, &Config, bool, usize) -> GutterFn;
type GutterFn<'doc> = Box<dyn Fn(usize, bool) -> Option<(String, Style)> + 'doc>;
type Gutter =
for<'doc> fn(&'doc Document, &View, &Theme, &Config, bool, usize) -> GutterFn<'doc>;
let gutters: &[(Gutter, usize)] = &[(diagnostic, 1), (line_number, 5)];
let mut offset = 0;