on master help sign in
Stop collecting highlight_iter events then turning back into iter
62561e9Blaž Hrastnik
helix-term/src/ui/editor.rs+23−20
@@ -139,31 +139,34 @@ impl EditorView {
139 start..end
139 start..end
140 };
140 };
141
141
142− // TODO: range doesn't actually restrict source, just highlight range
143− let highlights = match doc.syntax() {
142+ match doc.syntax() {
144 Some(syntax) => {
143 Some(syntax) => {
145− syntax
144+ let iter = syntax
145+ // TODO: range doesn't actually restrict source, just highlight range
146 .highlight_iter(text.slice(..), Some(range), None)
146 .highlight_iter(text.slice(..), Some(range), None)
147 .map(|event| event.unwrap())
147 .map(|event| event.unwrap())
148− .collect() // TODO: we collect here to avoid holding the lock, fix later
148+ .map(move |event| match event {
149+ // convert byte offsets to char offset
150+ HighlightEvent::Source { start, end } => {
151+ let start =
152+ text.byte_to_char(ensure_grapheme_boundary_next_byte(text, start));
153+ let end =
154+ text.byte_to_char(ensure_grapheme_boundary_next_byte(text, end));
155+ HighlightEvent::Source { start, end }
156+ }
157+ event => event,
158+ });
159+
160+ Box::new(iter)
149 }
161 }
162+ None => Box::new(
150− None => vec![HighlightEvent::Source {
163+ [HighlightEvent::Source {
151− start: range.start,
164+ start: text.byte_to_char(range.start),
152− end: range.end,
165+ end: text.byte_to_char(range.end),
153− }],
166+ }]
167+ .into_iter(),
168+ ),
154 }
169 }
155− .into_iter()
156− .map(move |event| match event {
157− // convert byte offsets to char offset
158− HighlightEvent::Source { start, end } => {
159− let start = text.byte_to_char(ensure_grapheme_boundary_next_byte(text, start));
160− let end = text.byte_to_char(ensure_grapheme_boundary_next_byte(text, end));
161− HighlightEvent::Source { start, end }
162− }
163− event => event,
164− });
165−
166− Box::new(highlights)
167 }
170 }
168
171
169 /// Get highlight spans for document diagnostics
172 /// Get highlight spans for document diagnostics