on master help sign in
Update range markers so we can determine which layers can be reused
7315f6fBlaž Hrastnik
helix-core/src/syntax.rs+73−11
@@ -14,7 +14,7 @@ use slotmap::{DefaultKey as LayerId, HopSlotMap};
14use std::{
14use std::{
15 borrow::Cow,
15 borrow::Cow,
16 cell::RefCell,
16 cell::RefCell,
17− collections::{HashMap, HashSet},
17+ collections::{HashMap, HashSet, VecDeque},
18 fmt,
18 fmt,
19 path::Path,
19 path::Path,
20 sync::Arc,
20 sync::Arc,
@@ -459,7 +459,6 @@ impl Syntax {
459 source: &Rope,
459 source: &Rope,
460 changeset: &ChangeSet,
460 changeset: &ChangeSet,
461 ) -> Result<(), Error> {
461 ) -> Result<(), Error> {
462− use std::collections::{HashSet, VecDeque};
463 let mut queue = VecDeque::new();
462 let mut queue = VecDeque::new();
464 queue.push_back(self.root);
463 queue.push_back(self.root);
465
464
@@ -472,23 +471,84 @@ impl Syntax {
472 };
471 };
473
472
474 // HAXX: for now, clear all layers except root so they get re-parsed
473 // HAXX: for now, clear all layers except root so they get re-parsed
475− self.layers.retain(|id, _| id == self.root);
474+ // self.layers.retain(|id, _| id == self.root);
476
475
477 // Convert the changeset into tree sitter edits.
476 // Convert the changeset into tree sitter edits.
478 let edits = generate_edits(old_source, changeset);
477 let edits = generate_edits(old_source, changeset);
479
478
480 // TODO: use the edits to update all layers markers
479 // TODO: use the edits to update all layers markers
481 if !edits.is_empty() {
480 if !edits.is_empty() {
481+ fn point_add(a: Point, b: Point) -> Point {
482+ if b.row > 0 {
483+ Point::new(a.row.saturating_add(b.row), b.column)
484+ } else {
485+ Point::new(0, a.column.saturating_add(b.column))
486+ }
487+ }
488+ fn point_sub(a: Point, b: Point) -> Point {
489+ if a.row > b.row {
490+ Point::new(a.row.saturating_sub(b.row), a.column)
491+ } else {
492+ Point::new(0, a.column.saturating_sub(b.column))
493+ }
494+ }
495+
482 for layer in &mut self.layers.values_mut() {
496 for layer in &mut self.layers.values_mut() {
483 for range in &mut layer.ranges {
497 for range in &mut layer.ranges {
484− for edit in &edits {
498+ for edit in edits.iter().rev() {
499+ let is_pure_insertion = edit.old_end_byte == edit.start_byte;
500+
485 // if edit is after range, skip
501 // if edit is after range, skip
486 if edit.start_byte > range.end_byte {
502 if edit.start_byte > range.end_byte {
503+ // TODO: || (is_noop && edit.start_byte == range.end_byte)
487 continue;
504 continue;
488 }
505 }
489
506
490 // if edit is before range, shift entire range by len
507 // if edit is before range, shift entire range by len
491− if edit.old_end_byte < range.start_byte {}
508+ if edit.old_end_byte < range.start_byte {
509+ range.start_byte =
510+ edit.new_end_byte + (range.start_byte - edit.old_end_byte);
511+ range.start_point = point_add(
512+ edit.new_end_position,
513+ point_sub(range.start_point, edit.old_end_position),
514+ );
515+
516+ range.end_byte = edit
517+ .new_end_byte
518+ .saturating_add(range.end_byte - edit.old_end_byte);
519+ range.end_point = point_add(
520+ edit.new_end_position,
521+ point_sub(range.end_point, edit.old_end_position),
522+ );
523+ }
524+ // if the edit starts in the space before and extends into the range
525+ else if edit.start_byte < range.start_byte {
526+ range.start_byte = edit.new_end_byte;
527+ range.start_point = edit.new_end_position;
528+
529+ range.end_byte = range
530+ .end_byte
531+ .saturating_sub(edit.old_end_byte)
532+ .saturating_add(edit.new_end_byte);
533+ range.end_point = point_add(
534+ edit.new_end_position,
535+ point_sub(range.end_point, edit.old_end_position),
536+ );
537+ }
538+ // If the edit is an insertion at the start of the tree, shift
539+ else if edit.start_byte == range.start_byte && is_pure_insertion {
540+ range.start_byte = edit.new_end_byte;
541+ range.start_point = edit.new_end_position;
542+ } else {
543+ range.end_byte = range
544+ .end_byte
545+ .saturating_sub(edit.old_end_byte)
546+ .saturating_add(edit.new_end_byte);
547+ range.end_point = point_add(
548+ edit.new_end_position,
549+ point_sub(range.end_point, edit.old_end_position),
550+ );
551+ }
492 }
552 }
493 }
553 }
494 }
554 }
@@ -506,6 +566,9 @@ impl Syntax {
506 // TODO: we should be able to avoid editing & parsing layers with ranges earlier in the document before the edit
566 // TODO: we should be able to avoid editing & parsing layers with ranges earlier in the document before the edit
507
567
508 while let Some(layer_id) = queue.pop_front() {
568 while let Some(layer_id) = queue.pop_front() {
569+ // Mark the layer as touched
570+ touched.insert(layer_id);
571+
509 let layer = &mut self.layers[layer_id];
572 let layer = &mut self.layers[layer_id];
510
573
511 // If a tree already exists, notify it of changes.
574 // If a tree already exists, notify it of changes.
@@ -610,10 +673,14 @@ impl Syntax {
610 layer.depth == depth && // TODO: track parent id instead
673 layer.depth == depth && // TODO: track parent id instead
611 layer.config.language == config.language && layer.ranges == ranges
674 layer.config.language == config.language && layer.ranges == ranges
612 })
675 })
613− .map(|(id, _layer)| id);
676+ .map(|(id, _layer)| {
677+ log::info!("match! {:?}", id);
678+ id
679+ });
614
680
615 // ...or insert a new one.
681 // ...or insert a new one.
616 let layer_id = layer.unwrap_or_else(|| {
682 let layer_id = layer.unwrap_or_else(|| {
683+ log::info!("miss! {:?}", ranges);
617 self.layers.insert(LanguageLayer {
684 self.layers.insert(LanguageLayer {
618 tree: None,
685 tree: None,
619 config,
686 config,
@@ -625,9 +692,6 @@ impl Syntax {
625 queue.push_back(layer_id);
692 queue.push_back(layer_id);
626 }
693 }
627
694
628− // Mark the layer as touched
629− touched.insert(layer_id);
630−
631 // TODO: pre-process local scopes at this time, rather than highlight?
695 // TODO: pre-process local scopes at this time, rather than highlight?
632 // would solve problems with locals not working across boundaries
696 // would solve problems with locals not working across boundaries
633 }
697 }
@@ -723,8 +787,6 @@ impl Syntax {
723 })
787 })
724 .collect::<Vec<_>>();
788 .collect::<Vec<_>>();
725
789
726− log::info!("--");
727−
728 // HAXX: arrange layers by byte range, with deeper layers positioned first
790 // HAXX: arrange layers by byte range, with deeper layers positioned first
729 layers.sort_by_key(|layer| {
791 layers.sort_by_key(|layer| {
730 (
792 (