on master help sign in
Revert "Fix precedence of ui.virtual.whitespace (#8750)"

This reverts commit 41b307b673a34183123585d63746cb756c1779ed.

commit811d62d3b3699efb7b7ceb362f537979e5911871 authorBlaž Hrastnik <blaz@mxxn.io> dateWed 22 Nov 2023, 16:00 (3 years ago) parent41b307b
3 files changed+65−125
helix-term/src/ui/document.rs+24−60 helix-term/src/ui/editor.rs+38−58 helix-term/src/ui/picker.rs+3−7
helix-term/src/ui/document.rs+24−60
@@ -97,8 +97,7 @@ pub fn render_document(
9797 doc: &Document,
9898 offset: ViewPosition,
9999 doc_annotations: &TextAnnotations,
100− syntax_highlight_iter: impl Iterator<Item = HighlightEvent>,
101− overlay_highlight_iter: impl Iterator<Item = HighlightEvent>,
100+ highlight_iter: impl Iterator<Item = HighlightEvent>,
102101 theme: &Theme,
103102 line_decoration: &mut [Box<dyn LineDecoration + '_>],
104103 translated_positions: &mut [TranslatedPosition],
@@ -110,8 +109,7 @@ pub fn render_document(
110109 offset,
111110 &doc.text_format(viewport.width, Some(theme)),
112111 doc_annotations,
113− syntax_highlight_iter,
114− overlay_highlight_iter,
112+ highlight_iter,
115113 theme,
116114 line_decoration,
117115 translated_positions,
@@ -159,8 +157,7 @@ pub fn render_text<'t>(
159157 offset: ViewPosition,
160158 text_fmt: &TextFormat,
161159 text_annotations: &TextAnnotations,
162− syntax_highlight_iter: impl Iterator<Item = HighlightEvent>,
163− overlay_highlight_iter: impl Iterator<Item = HighlightEvent>,
160+ highlight_iter: impl Iterator<Item = HighlightEvent>,
164161 theme: &Theme,
165162 line_decorations: &mut [Box<dyn LineDecoration + '_>],
166163 translated_positions: &mut [TranslatedPosition],
@@ -181,16 +178,10 @@ pub fn render_text<'t>(
181178
182179 let (mut formatter, mut first_visible_char_idx) =
183180 DocumentFormatter::new_at_prev_checkpoint(text, text_fmt, text_annotations, offset.anchor);
184− let mut syntax_styles = StyleIter {
181+ let mut styles = StyleIter {
185182 text_style: renderer.text_style,
186183 active_highlights: Vec::with_capacity(64),
187− highlight_iter: syntax_highlight_iter,
188− theme,
189− };
190− let mut overlay_styles = StyleIter {
191− text_style: renderer.text_style,
192− active_highlights: Vec::with_capacity(64),
193− highlight_iter: overlay_highlight_iter,
184+ highlight_iter,
194185 theme,
195186 };
196187
@@ -202,10 +193,7 @@ pub fn render_text<'t>(
202193 };
203194 let mut is_in_indent_area = true;
204195 let mut last_line_indent_level = 0;
205− let mut syntax_style_span = syntax_styles
206− .next()
207− .unwrap_or_else(|| (Style::default(), usize::MAX));
208− let mut overlay_style_span = overlay_styles
196+ let mut style_span = styles
209197 .next()
210198 .unwrap_or_else(|| (Style::default(), usize::MAX));
211199
@@ -233,16 +221,9 @@ pub fn render_text<'t>(
233221
234222 // skip any graphemes on visual lines before the block start
235223 if pos.row < row_off {
236− if char_pos >= syntax_style_span.1 {
237− syntax_style_span = if let Some(syntax_style_span) = syntax_styles.next() {
238− syntax_style_span
239− } else {
240− break;
241− }
242− }
243− if char_pos >= overlay_style_span.1 {
244− overlay_style_span = if let Some(overlay_style_span) = overlay_styles.next() {
245− overlay_style_span
224+ if char_pos >= style_span.1 {
225+ style_span = if let Some(style_span) = styles.next() {
226+ style_span
246227 } else {
247228 break;
248229 }
@@ -279,15 +260,8 @@ pub fn render_text<'t>(
279260 }
280261
281262 // acquire the correct grapheme style
282− if char_pos >= syntax_style_span.1 {
283− syntax_style_span = syntax_styles
284− .next()
285− .unwrap_or((Style::default(), usize::MAX));
286− }
287− if char_pos >= overlay_style_span.1 {
288− overlay_style_span = overlay_styles
289− .next()
290− .unwrap_or((Style::default(), usize::MAX));
263+ if char_pos >= style_span.1 {
264+ style_span = styles.next().unwrap_or((Style::default(), usize::MAX));
291265 }
292266 char_pos += grapheme.doc_chars();
293267
@@ -301,25 +275,22 @@ pub fn render_text<'t>(
301275 pos,
302276 );
303277
304− let (syntax_style, overlay_style) =
305− if let GraphemeSource::VirtualText { highlight } = grapheme.source {
306− let mut style = renderer.text_style;
307− if let Some(highlight) = highlight {
308− style = style.patch(theme.highlight(highlight.0))
309− }
310− (style, Style::default())
278+ let grapheme_style = if let GraphemeSource::VirtualText { highlight } = grapheme.source {
279+ let style = renderer.text_style;
280+ if let Some(highlight) = highlight {
281+ style.patch(theme.highlight(highlight.0))
311282 } else {
312− (syntax_style_span.0, overlay_style_span.0)
313− };
283+ style
284+ }
285+ } else {
286+ style_span.0
287+ };
314288
315− let is_virtual = grapheme.is_virtual();
289+ let virt = grapheme.is_virtual();
316290 renderer.draw_grapheme(
317291 grapheme.grapheme,
318− GraphemeStyle {
319− syntax_style,
320− overlay_style,
321− },
322− is_virtual,
292+ grapheme_style,
293+ virt,
323294 &mut last_line_indent_level,
324295 &mut is_in_indent_area,
325296 pos,
@@ -351,11 +322,6 @@ pub struct TextRenderer<'a> {
351322 pub viewport: Rect,
352323}
353324
354−pub struct GraphemeStyle {
355− syntax_style: Style,
356− overlay_style: Style,
357−}
358−
359325impl<'a> TextRenderer<'a> {
360326 pub fn new(
361327 surface: &'a mut Surface,
@@ -429,7 +395,7 @@ impl<'a> TextRenderer<'a> {
429395 pub fn draw_grapheme(
430396 &mut self,
431397 grapheme: Grapheme,
432− grapheme_style: GraphemeStyle,
398+ mut style: Style,
433399 is_virtual: bool,
434400 last_indent_level: &mut usize,
435401 is_in_indent_area: &mut bool,
@@ -439,11 +405,9 @@ impl<'a> TextRenderer<'a> {
439405 let is_whitespace = grapheme.is_whitespace();
440406
441407 // TODO is it correct to apply the whitespace style to all unicode white spaces?
442− let mut style = grapheme_style.syntax_style;
443408 if is_whitespace {
444409 style = style.patch(self.whitespace_style);
445410 }
446− style = style.patch(grapheme_style.overlay_style);
447411
448412 let width = grapheme.width();
449413 let space = if is_virtual { " " } else { &self.space };
helix-term/src/ui/editor.rs+38−58
@@ -124,20 +124,16 @@ impl EditorView {
124124 line_decorations.push(Box::new(line_decoration));
125125 }
126126
127− let syntax_highlights =
127+ let mut highlights =
128128 Self::doc_syntax_highlights(doc, view.offset.anchor, inner.height, theme);
129−
130− let mut overlay_highlights =
131− Self::empty_highlight_iter(doc, view.offset.anchor, inner.height);
132− let overlay_syntax_highlights = Self::overlay_syntax_highlights(
129+ let overlay_highlights = Self::overlay_syntax_highlights(
133130 doc,
134131 view.offset.anchor,
135132 inner.height,
136133 &text_annotations,
137134 );
138− if !overlay_syntax_highlights.is_empty() {
139− overlay_highlights =
140− Box::new(syntax::merge(overlay_highlights, overlay_syntax_highlights));
135+ if !overlay_highlights.is_empty() {
136+ highlights = Box::new(syntax::merge(highlights, overlay_highlights));
141137 }
142138
143139 for diagnostic in Self::doc_diagnostics_highlights(doc, theme) {
@@ -146,12 +142,12 @@ impl EditorView {
146142 if diagnostic.is_empty() {
147143 continue;
148144 }
149− overlay_highlights = Box::new(syntax::merge(overlay_highlights, diagnostic));
145+ highlights = Box::new(syntax::merge(highlights, diagnostic));
150146 }
151147
152− if is_focused {
148+ let highlights: Box<dyn Iterator<Item = HighlightEvent>> = if is_focused {
153149 let highlights = syntax::merge(
154− overlay_highlights,
150+ highlights,
155151 Self::doc_selection_highlights(
156152 editor.mode(),
157153 doc,
@@ -162,11 +158,13 @@ impl EditorView {
162158 );
163159 let focused_view_elements = Self::highlight_focused_view_elements(view, doc, theme);
164160 if focused_view_elements.is_empty() {
165− overlay_highlights = Box::new(highlights)
161+ Box::new(highlights)
166162 } else {
167− overlay_highlights = Box::new(syntax::merge(highlights, focused_view_elements))
163+ Box::new(syntax::merge(highlights, focused_view_elements))
168164 }
169− }
165+ } else {
166+ Box::new(highlights)
167+ };
170168
171169 let gutter_overflow = view.gutter_offset(doc) == 0;
172170 if !gutter_overflow {
@@ -199,8 +197,7 @@ impl EditorView {
199197 doc,
200198 view.offset,
201199 &text_annotations,
202− syntax_highlights,
203− overlay_highlights,
200+ highlights,
204201 theme,
205202 &mut line_decorations,
206203 &mut translated_positions,
@@ -260,39 +257,27 @@ impl EditorView {
260257 .for_each(|area| surface.set_style(area, ruler_theme))
261258 }
262259
263− fn viewport_byte_range(
264− text: helix_core::RopeSlice,
265− row: usize,
266− height: u16,
267− ) -> std::ops::Range<usize> {
268− // Calculate viewport byte ranges:
269− // Saturating subs to make it inclusive zero indexing.
270− let last_line = text.len_lines().saturating_sub(1);
271− let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
272− let start = text.line_to_byte(row.min(last_line));
273− let end = text.line_to_byte(last_visible_line + 1);
274−
275− start..end
276− }
277−
278− pub fn empty_highlight_iter(
260+ pub fn overlay_syntax_highlights(
279261 doc: &Document,
280262 anchor: usize,
281263 height: u16,
282− ) -> Box<dyn Iterator<Item = HighlightEvent>> {
264+ text_annotations: &TextAnnotations,
265+ ) -> Vec<(usize, std::ops::Range<usize>)> {
283266 let text = doc.text().slice(..);
284267 let row = text.char_to_line(anchor.min(text.len_chars()));
285268
286− // Calculate viewport byte ranges:
287− // Saturating subs to make it inclusive zero indexing.
288− let range = Self::viewport_byte_range(text, row, height);
289− Box::new(
290− [HighlightEvent::Source {
291− start: text.byte_to_char(range.start),
292− end: text.byte_to_char(range.end),
293− }]
294− .into_iter(),
295− )
269+ let range = {
270+ // Calculate viewport byte ranges:
271+ // Saturating subs to make it inclusive zero indexing.
272+ let last_line = text.len_lines().saturating_sub(1);
273+ let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
274+ let start = text.line_to_byte(row.min(last_line));
275+ let end = text.line_to_byte(last_visible_line + 1);
276+
277+ start..end
278+ };
279+
280+ text_annotations.collect_overlay_highlights(range)
296281 }
297282
298283 /// Get syntax highlights for a document in a view represented by the first line
@@ -307,7 +292,16 @@ impl EditorView {
307292 let text = doc.text().slice(..);
308293 let row = text.char_to_line(anchor.min(text.len_chars()));
309294
310− let range = Self::viewport_byte_range(text, row, height);
295+ let range = {
296+ // Calculate viewport byte ranges:
297+ // Saturating subs to make it inclusive zero indexing.
298+ let last_line = text.len_lines().saturating_sub(1);
299+ let last_visible_line = (row + height as usize).saturating_sub(1).min(last_line);
300+ let start = text.line_to_byte(row.min(last_line));
301+ let end = text.line_to_byte(last_visible_line + 1);
302+
303+ start..end
304+ };
311305
312306 match doc.syntax() {
313307 Some(syntax) => {
@@ -340,20 +334,6 @@ impl EditorView {
340334 }
341335 }
342336
343− pub fn overlay_syntax_highlights(
344− doc: &Document,
345− anchor: usize,
346− height: u16,
347− text_annotations: &TextAnnotations,
348− ) -> Vec<(usize, std::ops::Range<usize>)> {
349− let text = doc.text().slice(..);
350− let row = text.char_to_line(anchor.min(text.len_chars()));
351−
352− let range = Self::viewport_byte_range(text, row, height);
353−
354− text_annotations.collect_overlay_highlights(range)
355− }
356−
357337 /// Get highlight spans for document diagnostics
358338 pub fn doc_diagnostics_highlights(
359339 doc: &Document,
helix-term/src/ui/picker.rs+3−7
@@ -736,20 +736,17 @@ impl<T: Item + 'static> Picker<T> {
736736 }
737737 }
738738
739− let syntax_highlights = EditorView::doc_syntax_highlights(
739+ let mut highlights = EditorView::doc_syntax_highlights(
740740 doc,
741741 offset.anchor,
742742 area.height,
743743 &cx.editor.theme,
744744 );
745−
746− let mut overlay_highlights =
747− EditorView::empty_highlight_iter(doc, offset.anchor, area.height);
748745 for spans in EditorView::doc_diagnostics_highlights(doc, &cx.editor.theme) {
749746 if spans.is_empty() {
750747 continue;
751748 }
752− overlay_highlights = Box::new(helix_core::syntax::merge(overlay_highlights, spans));
749+ highlights = Box::new(helix_core::syntax::merge(highlights, spans));
753750 }
754751 let mut decorations: Vec<Box<dyn LineDecoration>> = Vec::new();
755752
@@ -780,8 +777,7 @@ impl<T: Item + 'static> Picker<T> {
780777 offset,
781778 // TODO: compute text annotations asynchronously here (like inlay hints)
782779 &TextAnnotations::default(),
783− syntax_highlights,
784− overlay_highlights,
780+ highlights,
785781 &cx.editor.theme,
786782 &mut decorations,
787783 &mut [],