@@ -139,31 +139,34 @@ impl EditorView {
139139 start..end
140140 };
141141
142− // TODO: range doesn't actually restrict source, just highlight range
143− let highlights = match doc.syntax() {
142+ match doc.syntax() {
144143 Some(syntax) => {
145− syntax
144+ let iter = syntax
145+ // TODO: range doesn't actually restrict source, just highlight range
146146 .highlight_iter(text.slice(..), Some(range), None)
147147 .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)
149161 }
150− None => vec![HighlightEvent::Source {
151− start: range.start,
152− end: range.end,
153− }],
162+ None => Box::new(
163+ [HighlightEvent::Source {
164+ start: text.byte_to_char(range.start),
165+ end: text.byte_to_char(range.end),
166+ }]
167+ .into_iter(),
168+ ),
154169 }
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)
167170 }
168171
169172 /// Get highlight spans for document diagnostics