@@ -139,31 +139,34 @@ impl EditorView {
139 start..end
139 start..end
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 } => {
152+ text.byte_to_char(ensure_grapheme_boundary_next_byte(text, start));
154+ text.byte_to_char(ensure_grapheme_boundary_next_byte(text, end));
155+ HighlightEvent::Source { start, end }
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),
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 }
166− Box::new(highlights)
169 /// Get highlight spans for document diagnostics
172 /// Get highlight spans for document diagnostics