syntax_map.rs

   1use crate::{Grammar, InjectionConfig, Language, LanguageRegistry};
   2use lazy_static::lazy_static;
   3use parking_lot::Mutex;
   4use std::{
   5    borrow::Cow,
   6    cell::RefCell,
   7    cmp::{Ordering, Reverse},
   8    collections::BinaryHeap,
   9    ops::{Deref, DerefMut, Range},
  10    sync::Arc,
  11};
  12use sum_tree::{Bias, SeekTarget, SumTree};
  13use text::{rope, Anchor, BufferSnapshot, OffsetRangeExt, Point, Rope, ToOffset, ToPoint};
  14use tree_sitter::{
  15    Node, Parser, Query, QueryCapture, QueryCaptures, QueryCursor, QueryMatches, Tree,
  16};
  17
  18thread_local! {
  19    static PARSER: RefCell<Parser> = RefCell::new(Parser::new());
  20}
  21
  22lazy_static! {
  23    static ref QUERY_CURSORS: Mutex<Vec<QueryCursor>> = Default::default();
  24}
  25
  26#[derive(Default)]
  27pub struct SyntaxMap {
  28    parsed_version: clock::Global,
  29    interpolated_version: clock::Global,
  30    snapshot: SyntaxSnapshot,
  31    language_registry: Option<Arc<LanguageRegistry>>,
  32}
  33
  34#[derive(Clone, Default)]
  35pub struct SyntaxSnapshot {
  36    layers: SumTree<SyntaxLayer>,
  37}
  38
  39#[derive(Default)]
  40pub struct SyntaxMapCaptures<'a> {
  41    layers: Vec<SyntaxMapCapturesLayer<'a>>,
  42    active_layer_count: usize,
  43    grammars: Vec<&'a Grammar>,
  44}
  45
  46#[derive(Default)]
  47pub struct SyntaxMapMatches<'a> {
  48    layers: Vec<SyntaxMapMatchesLayer<'a>>,
  49    active_layer_count: usize,
  50    grammars: Vec<&'a Grammar>,
  51}
  52
  53#[derive(Debug)]
  54pub struct SyntaxMapCapture<'a> {
  55    pub depth: usize,
  56    pub node: Node<'a>,
  57    pub index: u32,
  58    pub grammar_index: usize,
  59}
  60
  61#[derive(Debug)]
  62pub struct SyntaxMapMatch<'a> {
  63    pub depth: usize,
  64    pub pattern_index: usize,
  65    pub captures: &'a [QueryCapture<'a>],
  66    pub grammar_index: usize,
  67}
  68
  69struct SyntaxMapCapturesLayer<'a> {
  70    depth: usize,
  71    captures: QueryCaptures<'a, 'a, TextProvider<'a>>,
  72    next_capture: Option<QueryCapture<'a>>,
  73    grammar_index: usize,
  74    _query_cursor: QueryCursorHandle,
  75}
  76
  77struct SyntaxMapMatchesLayer<'a> {
  78    depth: usize,
  79    next_pattern_index: usize,
  80    next_captures: Vec<QueryCapture<'a>>,
  81    has_next: bool,
  82    matches: QueryMatches<'a, 'a, TextProvider<'a>>,
  83    grammar_index: usize,
  84    _query_cursor: QueryCursorHandle,
  85}
  86
  87#[derive(Clone)]
  88struct SyntaxLayer {
  89    depth: usize,
  90    range: Range<Anchor>,
  91    tree: tree_sitter::Tree,
  92    language: Arc<Language>,
  93}
  94
  95#[derive(Debug, Clone)]
  96struct SyntaxLayerSummary {
  97    min_depth: usize,
  98    max_depth: usize,
  99    range: Range<Anchor>,
 100    last_layer_range: Range<Anchor>,
 101}
 102
 103#[derive(Clone, Debug)]
 104struct DepthAndRange(usize, Range<Anchor>);
 105
 106#[derive(Clone, Debug)]
 107struct DepthAndMaxPosition(usize, Anchor);
 108
 109#[derive(Clone, Debug)]
 110struct DepthAndRangeOrMaxPosition(DepthAndRange, DepthAndMaxPosition);
 111
 112struct ReparseStep {
 113    depth: usize,
 114    language: Arc<Language>,
 115    ranges: Vec<tree_sitter::Range>,
 116    range: Range<Anchor>,
 117}
 118
 119#[derive(Debug, PartialEq, Eq)]
 120struct ChangedRegion {
 121    depth: usize,
 122    range: Range<Anchor>,
 123}
 124
 125#[derive(Default)]
 126struct ChangeRegionSet(Vec<ChangedRegion>);
 127
 128struct TextProvider<'a>(&'a Rope);
 129
 130struct ByteChunks<'a>(rope::Chunks<'a>);
 131
 132struct QueryCursorHandle(Option<QueryCursor>);
 133
 134impl SyntaxMap {
 135    pub fn new() -> Self {
 136        Self::default()
 137    }
 138
 139    pub fn set_language_registry(&mut self, registry: Arc<LanguageRegistry>) {
 140        self.language_registry = Some(registry);
 141    }
 142
 143    pub fn snapshot(&self) -> SyntaxSnapshot {
 144        self.snapshot.clone()
 145    }
 146
 147    pub fn language_registry(&self) -> Option<Arc<LanguageRegistry>> {
 148        self.language_registry.clone()
 149    }
 150
 151    pub fn parsed_version(&self) -> clock::Global {
 152        self.parsed_version.clone()
 153    }
 154
 155    pub fn interpolate(&mut self, text: &BufferSnapshot) {
 156        self.snapshot.interpolate(&self.interpolated_version, text);
 157        self.interpolated_version = text.version.clone();
 158    }
 159
 160    #[cfg(test)]
 161    pub fn reparse(&mut self, language: Arc<Language>, text: &BufferSnapshot) {
 162        if !self.interpolated_version.observed_all(&text.version) {
 163            self.interpolate(text);
 164        }
 165
 166        self.snapshot.reparse(
 167            &self.parsed_version,
 168            text,
 169            self.language_registry.clone(),
 170            language,
 171        );
 172        self.parsed_version = text.version.clone();
 173    }
 174
 175    pub fn did_parse(&mut self, snapshot: SyntaxSnapshot, version: clock::Global) {
 176        self.interpolated_version = version.clone();
 177        self.parsed_version = version;
 178        self.snapshot = snapshot;
 179    }
 180
 181    pub fn clear(&mut self) {
 182        self.snapshot = SyntaxSnapshot::default();
 183    }
 184}
 185
 186impl SyntaxSnapshot {
 187    pub fn is_empty(&self) -> bool {
 188        self.layers.is_empty()
 189    }
 190
 191    pub fn interpolate(&mut self, from_version: &clock::Global, text: &BufferSnapshot) {
 192        let edits = text
 193            .edits_since::<(usize, Point)>(&from_version)
 194            .collect::<Vec<_>>();
 195        if edits.is_empty() {
 196            return;
 197        }
 198
 199        let mut layers = SumTree::new();
 200        let mut edits_for_depth = &edits[..];
 201        let mut cursor = self.layers.cursor::<SyntaxLayerSummary>();
 202        cursor.next(text);
 203
 204        'outer: loop {
 205            let depth = cursor.end(text).max_depth;
 206
 207            // Preserve any layers at this depth that precede the first edit.
 208            if let Some(first_edit) = edits_for_depth.first() {
 209                let target = DepthAndMaxPosition(depth, text.anchor_before(first_edit.new.start.0));
 210                if target.cmp(&cursor.start(), text).is_gt() {
 211                    let slice = cursor.slice(&target, Bias::Left, text);
 212                    layers.push_tree(slice, text);
 213                }
 214            }
 215            // If this layer follows all of the edits, then preserve it and any
 216            // subsequent layers at this same depth.
 217            else {
 218                let slice = cursor.slice(
 219                    &DepthAndRange(depth + 1, Anchor::MIN..Anchor::MAX),
 220                    Bias::Left,
 221                    text,
 222                );
 223                layers.push_tree(slice, text);
 224                edits_for_depth = &edits[..];
 225                continue;
 226            };
 227
 228            let layer = if let Some(layer) = cursor.item() {
 229                layer
 230            } else {
 231                break;
 232            };
 233
 234            let mut endpoints = text
 235                .summaries_for_anchors::<(usize, Point), _>([&layer.range.start, &layer.range.end]);
 236            let layer_range = endpoints.next().unwrap()..endpoints.next().unwrap();
 237            let start_byte = layer_range.start.0;
 238            let start_point = layer_range.start.1;
 239            let end_byte = layer_range.end.0;
 240
 241            // Ignore edits that end before the start of this layer, and don't consider them
 242            // for any subsequent layers at this same depth.
 243            loop {
 244                if let Some(edit) = edits_for_depth.first() {
 245                    if edit.new.end.0 < start_byte {
 246                        edits_for_depth = &edits_for_depth[1..];
 247                    } else {
 248                        break;
 249                    }
 250                } else {
 251                    continue 'outer;
 252                }
 253            }
 254
 255            let mut layer = layer.clone();
 256            for edit in edits_for_depth {
 257                // Ignore any edits that follow this layer.
 258                if edit.new.start.0 > end_byte {
 259                    break;
 260                }
 261
 262                // Apply any edits that intersect this layer to the layer's syntax tree.
 263                let tree_edit = if edit.new.start.0 >= start_byte {
 264                    tree_sitter::InputEdit {
 265                        start_byte: edit.new.start.0 - start_byte,
 266                        old_end_byte: edit.new.start.0 - start_byte
 267                            + (edit.old.end.0 - edit.old.start.0),
 268                        new_end_byte: edit.new.end.0 - start_byte,
 269                        start_position: (edit.new.start.1 - start_point).to_ts_point(),
 270                        old_end_position: (edit.new.start.1 - start_point
 271                            + (edit.old.end.1 - edit.old.start.1))
 272                            .to_ts_point(),
 273                        new_end_position: (edit.new.end.1 - start_point).to_ts_point(),
 274                    }
 275                } else {
 276                    tree_sitter::InputEdit {
 277                        start_byte: 0,
 278                        old_end_byte: edit.new.end.0 - start_byte,
 279                        new_end_byte: 0,
 280                        start_position: Default::default(),
 281                        old_end_position: (edit.new.end.1 - start_point).to_ts_point(),
 282                        new_end_position: Default::default(),
 283                    }
 284                };
 285
 286                layer.tree.edit(&tree_edit);
 287                if edit.new.start.0 < start_byte {
 288                    break;
 289                }
 290            }
 291
 292            layers.push(layer, text);
 293            cursor.next(text);
 294        }
 295
 296        layers.push_tree(cursor.suffix(&text), &text);
 297        drop(cursor);
 298        self.layers = layers;
 299    }
 300
 301    pub fn reparse(
 302        &mut self,
 303        from_version: &clock::Global,
 304        text: &BufferSnapshot,
 305        registry: Option<Arc<LanguageRegistry>>,
 306        language: Arc<Language>,
 307    ) {
 308        let edits = text.edits_since::<usize>(from_version).collect::<Vec<_>>();
 309        let max_depth = self.layers.summary().max_depth;
 310        let mut cursor = self.layers.cursor::<SyntaxLayerSummary>();
 311        cursor.next(&text);
 312        let mut layers = SumTree::new();
 313
 314        let mut changed_regions = ChangeRegionSet::default();
 315        let mut queue = BinaryHeap::new();
 316        queue.push(ReparseStep {
 317            depth: 0,
 318            language: language.clone(),
 319            ranges: Vec::new(),
 320            range: Anchor::MIN..Anchor::MAX,
 321        });
 322
 323        loop {
 324            let step = queue.pop();
 325            let (depth, range) = if let Some(step) = &step {
 326                (step.depth, step.range.clone())
 327            } else {
 328                (max_depth + 1, Anchor::MAX..Anchor::MAX)
 329            };
 330
 331            let target = DepthAndRange(depth, range.clone());
 332            let mut done = cursor.item().is_none();
 333            while !done && target.cmp(&cursor.end(text), &text).is_gt() {
 334                done = true;
 335
 336                let bounded_target =
 337                    DepthAndRangeOrMaxPosition(target.clone(), changed_regions.start_position());
 338                if bounded_target.cmp(&cursor.start(), &text).is_gt() {
 339                    let slice = cursor.slice(&bounded_target, Bias::Left, text);
 340                    if !slice.is_empty() {
 341                        layers.push_tree(slice, &text);
 342                        if changed_regions.prune(cursor.end(text), text) {
 343                            done = false;
 344                        }
 345                    }
 346                }
 347
 348                while target.cmp(&cursor.end(text), text).is_gt() {
 349                    let layer = if let Some(layer) = cursor.item() {
 350                        layer
 351                    } else {
 352                        break;
 353                    };
 354
 355                    if changed_regions.intersects(&layer, text) {
 356                        changed_regions.insert(
 357                            ChangedRegion {
 358                                depth: depth + 1,
 359                                range: layer.range.clone(),
 360                            },
 361                            text,
 362                        );
 363                    } else {
 364                        layers.push(layer.clone(), text);
 365                    }
 366
 367                    cursor.next(text);
 368                    if changed_regions.prune(cursor.end(text), text) {
 369                        done = false;
 370                    }
 371                }
 372            }
 373
 374            let (ranges, language) = if let Some(step) = step {
 375                (step.ranges, step.language)
 376            } else {
 377                break;
 378            };
 379
 380            let start_point;
 381            let start_byte;
 382            let end_byte;
 383            if let Some((first, last)) = ranges.first().zip(ranges.last()) {
 384                start_point = first.start_point;
 385                start_byte = first.start_byte;
 386                end_byte = last.end_byte;
 387            } else {
 388                start_point = Point::zero().to_ts_point();
 389                start_byte = 0;
 390                end_byte = text.len();
 391            };
 392
 393            let mut old_layer = cursor.item();
 394            if let Some(layer) = old_layer {
 395                if layer.range.to_offset(text) == (start_byte..end_byte) {
 396                    cursor.next(&text);
 397                } else {
 398                    old_layer = None;
 399                }
 400            }
 401
 402            let grammar = if let Some(grammar) = language.grammar.as_deref() {
 403                grammar
 404            } else {
 405                continue;
 406            };
 407
 408            let tree;
 409            let changed_ranges;
 410            if let Some(old_layer) = old_layer {
 411                tree = parse_text(
 412                    grammar,
 413                    text.as_rope(),
 414                    Some(old_layer.tree.clone()),
 415                    ranges,
 416                );
 417                changed_ranges = join_ranges(
 418                    edits
 419                        .iter()
 420                        .map(|e| e.new.clone())
 421                        .filter(|range| range.start < end_byte && range.end > start_byte),
 422                    old_layer
 423                        .tree
 424                        .changed_ranges(&tree)
 425                        .map(|r| start_byte + r.start_byte..start_byte + r.end_byte),
 426                );
 427            } else {
 428                tree = parse_text(grammar, text.as_rope(), None, ranges);
 429                changed_ranges = vec![start_byte..end_byte];
 430            }
 431
 432            layers.push(
 433                SyntaxLayer {
 434                    depth,
 435                    range,
 436                    tree: tree.clone(),
 437                    language: language.clone(),
 438                },
 439                &text,
 440            );
 441
 442            if let (Some((config, registry)), false) = (
 443                grammar.injection_config.as_ref().zip(registry.as_ref()),
 444                changed_ranges.is_empty(),
 445            ) {
 446                let depth = depth + 1;
 447                for range in &changed_ranges {
 448                    changed_regions.insert(
 449                        ChangedRegion {
 450                            depth,
 451                            range: text.anchor_before(range.start)..text.anchor_after(range.end),
 452                        },
 453                        text,
 454                    );
 455                }
 456                get_injections(
 457                    config,
 458                    text,
 459                    tree.root_node_with_offset(start_byte, start_point),
 460                    registry,
 461                    depth,
 462                    &changed_ranges,
 463                    &mut queue,
 464                );
 465            }
 466        }
 467
 468        drop(cursor);
 469        self.layers = layers;
 470    }
 471
 472    pub fn single_tree_captures<'a>(
 473        range: Range<usize>,
 474        text: &'a Rope,
 475        tree: &'a Tree,
 476        grammar: &'a Grammar,
 477        query: fn(&Grammar) -> Option<&Query>,
 478    ) -> SyntaxMapCaptures<'a> {
 479        SyntaxMapCaptures::new(
 480            range.clone(),
 481            text,
 482            [(grammar, 0, tree.root_node())].into_iter(),
 483            query,
 484        )
 485    }
 486
 487    pub fn captures<'a>(
 488        &'a self,
 489        range: Range<usize>,
 490        buffer: &'a BufferSnapshot,
 491        query: fn(&Grammar) -> Option<&Query>,
 492    ) -> SyntaxMapCaptures {
 493        SyntaxMapCaptures::new(
 494            range.clone(),
 495            buffer.as_rope(),
 496            self.layers_for_range(range, buffer).into_iter(),
 497            query,
 498        )
 499    }
 500
 501    pub fn matches<'a>(
 502        &'a self,
 503        range: Range<usize>,
 504        buffer: &'a BufferSnapshot,
 505        query: fn(&Grammar) -> Option<&Query>,
 506    ) -> SyntaxMapMatches {
 507        SyntaxMapMatches::new(
 508            range.clone(),
 509            buffer.as_rope(),
 510            self.layers_for_range(range, buffer).into_iter(),
 511            query,
 512        )
 513    }
 514
 515    #[cfg(test)]
 516    pub fn layers(&self, buffer: &BufferSnapshot) -> Vec<(&Grammar, usize, Node)> {
 517        self.layers_for_range(0..buffer.len(), buffer)
 518    }
 519
 520    pub fn layers_for_range<'a, T: ToOffset>(
 521        &self,
 522        range: Range<T>,
 523        buffer: &BufferSnapshot,
 524    ) -> Vec<(&Grammar, usize, Node)> {
 525        let start = buffer.anchor_before(range.start.to_offset(buffer));
 526        let end = buffer.anchor_after(range.end.to_offset(buffer));
 527
 528        let mut cursor = self.layers.filter::<_, ()>(|summary| {
 529            if summary.max_depth > summary.min_depth {
 530                true
 531            } else {
 532                let is_before_start = summary.range.end.cmp(&start, buffer).is_lt();
 533                let is_after_end = summary.range.start.cmp(&end, buffer).is_gt();
 534                !is_before_start && !is_after_end
 535            }
 536        });
 537
 538        let mut result = Vec::new();
 539        cursor.next(buffer);
 540        while let Some(layer) = cursor.item() {
 541            if let Some(grammar) = &layer.language.grammar {
 542                result.push((
 543                    grammar.as_ref(),
 544                    layer.depth,
 545                    layer.tree.root_node_with_offset(
 546                        layer.range.start.to_offset(buffer),
 547                        layer.range.start.to_point(buffer).to_ts_point(),
 548                    ),
 549                ));
 550            }
 551            cursor.next(buffer)
 552        }
 553
 554        result
 555    }
 556}
 557
 558impl<'a> SyntaxMapCaptures<'a> {
 559    fn new(
 560        range: Range<usize>,
 561        text: &'a Rope,
 562        layers: impl Iterator<Item = (&'a Grammar, usize, Node<'a>)>,
 563        query: fn(&Grammar) -> Option<&Query>,
 564    ) -> Self {
 565        let mut result = Self {
 566            layers: Vec::new(),
 567            grammars: Vec::new(),
 568            active_layer_count: 0,
 569        };
 570        for (grammar, depth, node) in layers {
 571            let query = if let Some(query) = query(grammar) {
 572                query
 573            } else {
 574                continue;
 575            };
 576
 577            let mut query_cursor = QueryCursorHandle::new();
 578
 579            // TODO - add a Tree-sitter API to remove the need for this.
 580            let cursor = unsafe {
 581                std::mem::transmute::<_, &'static mut QueryCursor>(query_cursor.deref_mut())
 582            };
 583
 584            cursor.set_byte_range(range.clone());
 585            let captures = cursor.captures(query, node, TextProvider(text));
 586            let grammar_index = result
 587                .grammars
 588                .iter()
 589                .position(|g| g.id == grammar.id())
 590                .unwrap_or_else(|| {
 591                    result.grammars.push(grammar);
 592                    result.grammars.len() - 1
 593                });
 594            let mut layer = SyntaxMapCapturesLayer {
 595                depth,
 596                grammar_index,
 597                next_capture: None,
 598                captures,
 599                _query_cursor: query_cursor,
 600            };
 601
 602            layer.advance();
 603            if layer.next_capture.is_some() {
 604                let key = layer.sort_key();
 605                let ix = match result.layers[..result.active_layer_count]
 606                    .binary_search_by_key(&key, |layer| layer.sort_key())
 607                {
 608                    Ok(ix) | Err(ix) => ix,
 609                };
 610                result.layers.insert(ix, layer);
 611                result.active_layer_count += 1;
 612            } else {
 613                result.layers.push(layer);
 614            }
 615        }
 616
 617        result
 618    }
 619
 620    pub fn grammars(&self) -> &[&'a Grammar] {
 621        &self.grammars
 622    }
 623
 624    pub fn peek(&self) -> Option<SyntaxMapCapture<'a>> {
 625        let layer = self.layers[..self.active_layer_count].first()?;
 626        let capture = layer.next_capture?;
 627        Some(SyntaxMapCapture {
 628            depth: layer.depth,
 629            grammar_index: layer.grammar_index,
 630            index: capture.index,
 631            node: capture.node,
 632        })
 633    }
 634
 635    pub fn advance(&mut self) -> bool {
 636        let layer = if let Some(layer) = self.layers[..self.active_layer_count].first_mut() {
 637            layer
 638        } else {
 639            return false;
 640        };
 641
 642        layer.advance();
 643        if layer.next_capture.is_some() {
 644            let key = layer.sort_key();
 645            let i = 1 + self.layers[1..self.active_layer_count]
 646                .iter()
 647                .position(|later_layer| key < later_layer.sort_key())
 648                .unwrap_or(self.active_layer_count - 1);
 649            self.layers[0..i].rotate_left(1);
 650        } else {
 651            self.layers[0..self.active_layer_count].rotate_left(1);
 652            self.active_layer_count -= 1;
 653        }
 654
 655        true
 656    }
 657
 658    pub fn set_byte_range(&mut self, range: Range<usize>) {
 659        for layer in &mut self.layers {
 660            layer.captures.set_byte_range(range.clone());
 661            if let Some(capture) = &layer.next_capture {
 662                if capture.node.end_byte() > range.start {
 663                    continue;
 664                }
 665            }
 666            layer.advance();
 667        }
 668        self.layers.sort_unstable_by_key(|layer| layer.sort_key());
 669        self.active_layer_count = self
 670            .layers
 671            .iter()
 672            .position(|layer| layer.next_capture.is_none())
 673            .unwrap_or(self.layers.len());
 674    }
 675}
 676
 677impl<'a> SyntaxMapMatches<'a> {
 678    fn new(
 679        range: Range<usize>,
 680        text: &'a Rope,
 681        layers: impl Iterator<Item = (&'a Grammar, usize, Node<'a>)>,
 682        query: fn(&Grammar) -> Option<&Query>,
 683    ) -> Self {
 684        let mut result = Self::default();
 685        for (grammar, depth, node) in layers {
 686            let query = if let Some(query) = query(grammar) {
 687                query
 688            } else {
 689                continue;
 690            };
 691
 692            let mut query_cursor = QueryCursorHandle::new();
 693
 694            // TODO - add a Tree-sitter API to remove the need for this.
 695            let cursor = unsafe {
 696                std::mem::transmute::<_, &'static mut QueryCursor>(query_cursor.deref_mut())
 697            };
 698
 699            cursor.set_byte_range(range.clone());
 700            let matches = cursor.matches(query, node, TextProvider(text));
 701            let grammar_index = result
 702                .grammars
 703                .iter()
 704                .position(|g| g.id == grammar.id())
 705                .unwrap_or_else(|| {
 706                    result.grammars.push(grammar);
 707                    result.grammars.len() - 1
 708                });
 709            let mut layer = SyntaxMapMatchesLayer {
 710                depth,
 711                grammar_index,
 712                matches,
 713                next_pattern_index: 0,
 714                next_captures: Vec::new(),
 715                has_next: false,
 716                _query_cursor: query_cursor,
 717            };
 718
 719            layer.advance();
 720            if layer.has_next {
 721                let key = layer.sort_key();
 722                let ix = match result.layers[..result.active_layer_count]
 723                    .binary_search_by_key(&key, |layer| layer.sort_key())
 724                {
 725                    Ok(ix) | Err(ix) => ix,
 726                };
 727                result.layers.insert(ix, layer);
 728                result.active_layer_count += 1;
 729            } else {
 730                result.layers.push(layer);
 731            }
 732        }
 733        result
 734    }
 735
 736    pub fn grammars(&self) -> &[&'a Grammar] {
 737        &self.grammars
 738    }
 739
 740    pub fn peek(&self) -> Option<SyntaxMapMatch> {
 741        let layer = self.layers.first()?;
 742        if !layer.has_next {
 743            return None;
 744        }
 745        Some(SyntaxMapMatch {
 746            depth: layer.depth,
 747            grammar_index: layer.grammar_index,
 748            pattern_index: layer.next_pattern_index,
 749            captures: &layer.next_captures,
 750        })
 751    }
 752
 753    pub fn advance(&mut self) -> bool {
 754        let layer = if let Some(layer) = self.layers.first_mut() {
 755            layer
 756        } else {
 757            return false;
 758        };
 759
 760        layer.advance();
 761        if layer.has_next {
 762            let key = layer.sort_key();
 763            let i = 1 + self.layers[1..self.active_layer_count]
 764                .iter()
 765                .position(|later_layer| key < later_layer.sort_key())
 766                .unwrap_or(self.active_layer_count - 1);
 767            self.layers[0..i].rotate_left(1);
 768        } else {
 769            self.layers[0..self.active_layer_count].rotate_left(1);
 770            self.active_layer_count -= 1;
 771        }
 772
 773        true
 774    }
 775}
 776
 777impl<'a> SyntaxMapCapturesLayer<'a> {
 778    fn advance(&mut self) {
 779        self.next_capture = self.captures.next().map(|(mat, ix)| mat.captures[ix]);
 780    }
 781
 782    fn sort_key(&self) -> (usize, Reverse<usize>, usize) {
 783        if let Some(capture) = &self.next_capture {
 784            let range = capture.node.byte_range();
 785            (range.start, Reverse(range.end), self.depth)
 786        } else {
 787            (usize::MAX, Reverse(0), usize::MAX)
 788        }
 789    }
 790}
 791
 792impl<'a> SyntaxMapMatchesLayer<'a> {
 793    fn advance(&mut self) {
 794        if let Some(mat) = self.matches.next() {
 795            self.next_captures.clear();
 796            self.next_captures.extend_from_slice(&mat.captures);
 797            self.next_pattern_index = mat.pattern_index;
 798            self.has_next = true;
 799        } else {
 800            self.has_next = false;
 801        }
 802    }
 803
 804    fn sort_key(&self) -> (usize, Reverse<usize>, usize) {
 805        if self.has_next {
 806            let captures = &self.next_captures;
 807            if let Some((first, last)) = captures.first().zip(captures.last()) {
 808                return (
 809                    first.node.start_byte(),
 810                    Reverse(last.node.end_byte()),
 811                    self.depth,
 812                );
 813            }
 814        }
 815        (usize::MAX, Reverse(0), usize::MAX)
 816    }
 817}
 818
 819impl<'a> Iterator for SyntaxMapCaptures<'a> {
 820    type Item = SyntaxMapCapture<'a>;
 821
 822    fn next(&mut self) -> Option<Self::Item> {
 823        let result = self.peek();
 824        self.advance();
 825        result
 826    }
 827}
 828
 829fn join_ranges(
 830    a: impl Iterator<Item = Range<usize>>,
 831    b: impl Iterator<Item = Range<usize>>,
 832) -> Vec<Range<usize>> {
 833    let mut result = Vec::<Range<usize>>::new();
 834    let mut a = a.peekable();
 835    let mut b = b.peekable();
 836    loop {
 837        let range = match (a.peek(), b.peek()) {
 838            (Some(range_a), Some(range_b)) => {
 839                if range_a.start < range_b.start {
 840                    a.next().unwrap()
 841                } else {
 842                    b.next().unwrap()
 843                }
 844            }
 845            (None, Some(_)) => b.next().unwrap(),
 846            (Some(_), None) => a.next().unwrap(),
 847            (None, None) => break,
 848        };
 849
 850        if let Some(last) = result.last_mut() {
 851            if range.start <= last.end {
 852                last.end = last.end.max(range.end);
 853                continue;
 854            }
 855        }
 856        result.push(range);
 857    }
 858    result
 859}
 860
 861fn parse_text(
 862    grammar: &Grammar,
 863    text: &Rope,
 864    old_tree: Option<Tree>,
 865    mut ranges: Vec<tree_sitter::Range>,
 866) -> Tree {
 867    let (start_byte, start_point) = ranges
 868        .first()
 869        .map(|range| (range.start_byte, Point::from_ts_point(range.start_point)))
 870        .unwrap_or_default();
 871
 872    for range in &mut ranges {
 873        range.start_byte -= start_byte;
 874        range.end_byte -= start_byte;
 875        range.start_point = (Point::from_ts_point(range.start_point) - start_point).to_ts_point();
 876        range.end_point = (Point::from_ts_point(range.end_point) - start_point).to_ts_point();
 877    }
 878
 879    PARSER.with(|parser| {
 880        let mut parser = parser.borrow_mut();
 881        let mut chunks = text.chunks_in_range(start_byte..text.len());
 882        parser
 883            .set_included_ranges(&ranges)
 884            .expect("overlapping ranges");
 885        parser
 886            .set_language(grammar.ts_language)
 887            .expect("incompatible grammar");
 888        parser
 889            .parse_with(
 890                &mut move |offset, _| {
 891                    chunks.seek(start_byte + offset);
 892                    chunks.next().unwrap_or("").as_bytes()
 893                },
 894                old_tree.as_ref(),
 895            )
 896            .expect("invalid language")
 897    })
 898}
 899
 900fn get_injections(
 901    config: &InjectionConfig,
 902    text: &BufferSnapshot,
 903    node: Node,
 904    language_registry: &LanguageRegistry,
 905    depth: usize,
 906    query_ranges: &[Range<usize>],
 907    queue: &mut BinaryHeap<ReparseStep>,
 908) -> bool {
 909    let mut result = false;
 910    let mut query_cursor = QueryCursorHandle::new();
 911    let mut prev_match = None;
 912    for query_range in query_ranges {
 913        query_cursor.set_byte_range(query_range.start..query_range.end);
 914        for mat in query_cursor.matches(&config.query, node, TextProvider(text.as_rope())) {
 915            let content_ranges = mat
 916                .nodes_for_capture_index(config.content_capture_ix)
 917                .map(|node| node.range())
 918                .collect::<Vec<_>>();
 919            if content_ranges.is_empty() {
 920                continue;
 921            }
 922
 923            // Avoid duplicate matches if two changed ranges intersect the same injection.
 924            let content_range =
 925                content_ranges.first().unwrap().start_byte..content_ranges.last().unwrap().end_byte;
 926            if let Some((last_pattern_ix, last_range)) = &prev_match {
 927                if mat.pattern_index == *last_pattern_ix && content_range == *last_range {
 928                    continue;
 929                }
 930            }
 931            prev_match = Some((mat.pattern_index, content_range.clone()));
 932
 933            let language_name = config.languages_by_pattern_ix[mat.pattern_index]
 934                .as_ref()
 935                .map(|s| Cow::Borrowed(s.as_ref()))
 936                .or_else(|| {
 937                    let ix = config.language_capture_ix?;
 938                    let node = mat.nodes_for_capture_index(ix).next()?;
 939                    Some(Cow::Owned(text.text_for_range(node.byte_range()).collect()))
 940                });
 941
 942            if let Some(language_name) = language_name {
 943                if let Some(language) = language_registry.get_language(language_name.as_ref()) {
 944                    result = true;
 945                    let range = text.anchor_before(content_range.start)
 946                        ..text.anchor_after(content_range.end);
 947                    queue.push(ReparseStep {
 948                        depth,
 949                        language,
 950                        ranges: content_ranges,
 951                        range,
 952                    })
 953                }
 954            }
 955        }
 956    }
 957    result
 958}
 959
 960impl std::ops::Deref for SyntaxMap {
 961    type Target = SyntaxSnapshot;
 962
 963    fn deref(&self) -> &Self::Target {
 964        &self.snapshot
 965    }
 966}
 967
 968impl PartialEq for ReparseStep {
 969    fn eq(&self, _: &Self) -> bool {
 970        false
 971    }
 972}
 973
 974impl Eq for ReparseStep {}
 975
 976impl PartialOrd for ReparseStep {
 977    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
 978        Some(self.cmp(&other))
 979    }
 980}
 981
 982impl Ord for ReparseStep {
 983    fn cmp(&self, other: &Self) -> Ordering {
 984        let range_a = self.range();
 985        let range_b = other.range();
 986        Ord::cmp(&other.depth, &self.depth)
 987            .then_with(|| Ord::cmp(&range_b.start, &range_a.start))
 988            .then_with(|| Ord::cmp(&range_a.end, &range_b.end))
 989    }
 990}
 991
 992impl ReparseStep {
 993    fn range(&self) -> Range<usize> {
 994        let start = self.ranges.first().map_or(0, |r| r.start_byte);
 995        let end = self.ranges.last().map_or(0, |r| r.end_byte);
 996        start..end
 997    }
 998}
 999
1000impl ChangedRegion {
1001    fn cmp(&self, other: &Self, buffer: &BufferSnapshot) -> Ordering {
1002        let range_a = &self.range;
1003        let range_b = &other.range;
1004        Ord::cmp(&self.depth, &other.depth)
1005            .then_with(|| range_a.start.cmp(&range_b.start, buffer))
1006            .then_with(|| range_b.end.cmp(&range_a.end, buffer))
1007    }
1008}
1009
1010impl ChangeRegionSet {
1011    fn start_position(&self) -> DepthAndMaxPosition {
1012        self.0
1013            .first()
1014            .map_or(DepthAndMaxPosition(usize::MAX, Anchor::MAX), |region| {
1015                DepthAndMaxPosition(region.depth, region.range.start)
1016            })
1017    }
1018
1019    fn intersects(&self, layer: &SyntaxLayer, text: &BufferSnapshot) -> bool {
1020        for region in &self.0 {
1021            if region.depth < layer.depth {
1022                continue;
1023            }
1024            if region.depth > layer.depth {
1025                break;
1026            }
1027            if region.range.end.cmp(&layer.range.start, text).is_le() {
1028                continue;
1029            }
1030            if region.range.start.cmp(&layer.range.end, text).is_ge() {
1031                break;
1032            }
1033            return true;
1034        }
1035        false
1036    }
1037
1038    fn insert(&mut self, region: ChangedRegion, text: &BufferSnapshot) {
1039        if let Err(ix) = self.0.binary_search_by(|probe| probe.cmp(&region, text)) {
1040            self.0.insert(ix, region);
1041        }
1042    }
1043
1044    fn prune(&mut self, summary: SyntaxLayerSummary, text: &BufferSnapshot) -> bool {
1045        let prev_len = self.0.len();
1046        self.0.retain(|region| {
1047            region.depth > summary.max_depth
1048                || (region.depth == summary.max_depth
1049                    && region
1050                        .range
1051                        .end
1052                        .cmp(&summary.last_layer_range.start, text)
1053                        .is_gt())
1054        });
1055        self.0.len() < prev_len
1056    }
1057}
1058
1059impl Default for SyntaxLayerSummary {
1060    fn default() -> Self {
1061        Self {
1062            max_depth: 0,
1063            min_depth: 0,
1064            range: Anchor::MAX..Anchor::MIN,
1065            last_layer_range: Anchor::MIN..Anchor::MAX,
1066        }
1067    }
1068}
1069
1070impl sum_tree::Summary for SyntaxLayerSummary {
1071    type Context = BufferSnapshot;
1072
1073    fn add_summary(&mut self, other: &Self, buffer: &Self::Context) {
1074        if other.max_depth > self.max_depth {
1075            self.max_depth = other.max_depth;
1076            self.range = other.range.clone();
1077        } else {
1078            if other.range.start.cmp(&self.range.start, buffer).is_lt() {
1079                self.range.start = other.range.start;
1080            }
1081            if other.range.end.cmp(&self.range.end, buffer).is_gt() {
1082                self.range.end = other.range.end;
1083            }
1084        }
1085        self.last_layer_range = other.last_layer_range.clone();
1086    }
1087}
1088
1089impl<'a> SeekTarget<'a, SyntaxLayerSummary, SyntaxLayerSummary> for DepthAndRange {
1090    fn cmp(&self, cursor_location: &SyntaxLayerSummary, buffer: &BufferSnapshot) -> Ordering {
1091        Ord::cmp(&self.0, &cursor_location.max_depth)
1092            .then_with(|| {
1093                self.1
1094                    .start
1095                    .cmp(&cursor_location.last_layer_range.start, buffer)
1096            })
1097            .then_with(|| {
1098                cursor_location
1099                    .last_layer_range
1100                    .end
1101                    .cmp(&self.1.end, buffer)
1102            })
1103    }
1104}
1105
1106impl<'a> SeekTarget<'a, SyntaxLayerSummary, SyntaxLayerSummary> for DepthAndMaxPosition {
1107    fn cmp(&self, cursor_location: &SyntaxLayerSummary, text: &BufferSnapshot) -> Ordering {
1108        Ord::cmp(&self.0, &cursor_location.max_depth)
1109            .then_with(|| self.1.cmp(&cursor_location.range.end, text))
1110    }
1111}
1112
1113impl<'a> SeekTarget<'a, SyntaxLayerSummary, SyntaxLayerSummary> for DepthAndRangeOrMaxPosition {
1114    fn cmp(&self, cursor_location: &SyntaxLayerSummary, buffer: &BufferSnapshot) -> Ordering {
1115        if self.1.cmp(cursor_location, buffer).is_le() {
1116            return Ordering::Less;
1117        } else {
1118            self.0.cmp(cursor_location, buffer)
1119        }
1120    }
1121}
1122
1123impl sum_tree::Item for SyntaxLayer {
1124    type Summary = SyntaxLayerSummary;
1125
1126    fn summary(&self) -> Self::Summary {
1127        SyntaxLayerSummary {
1128            min_depth: self.depth,
1129            max_depth: self.depth,
1130            range: self.range.clone(),
1131            last_layer_range: self.range.clone(),
1132        }
1133    }
1134}
1135
1136impl std::fmt::Debug for SyntaxLayer {
1137    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1138        f.debug_struct("SyntaxLayer")
1139            .field("depth", &self.depth)
1140            .field("range", &self.range)
1141            .field("tree", &self.tree)
1142            .finish()
1143    }
1144}
1145
1146impl<'a> tree_sitter::TextProvider<'a> for TextProvider<'a> {
1147    type I = ByteChunks<'a>;
1148
1149    fn text(&mut self, node: tree_sitter::Node) -> Self::I {
1150        ByteChunks(self.0.chunks_in_range(node.byte_range()))
1151    }
1152}
1153
1154impl<'a> Iterator for ByteChunks<'a> {
1155    type Item = &'a [u8];
1156
1157    fn next(&mut self) -> Option<Self::Item> {
1158        self.0.next().map(str::as_bytes)
1159    }
1160}
1161
1162impl QueryCursorHandle {
1163    pub(crate) fn new() -> Self {
1164        let mut cursor = QUERY_CURSORS.lock().pop().unwrap_or_else(QueryCursor::new);
1165        cursor.set_match_limit(64);
1166        QueryCursorHandle(Some(cursor))
1167    }
1168}
1169
1170impl Deref for QueryCursorHandle {
1171    type Target = QueryCursor;
1172
1173    fn deref(&self) -> &Self::Target {
1174        self.0.as_ref().unwrap()
1175    }
1176}
1177
1178impl DerefMut for QueryCursorHandle {
1179    fn deref_mut(&mut self) -> &mut Self::Target {
1180        self.0.as_mut().unwrap()
1181    }
1182}
1183
1184impl Drop for QueryCursorHandle {
1185    fn drop(&mut self) {
1186        let mut cursor = self.0.take().unwrap();
1187        cursor.set_byte_range(0..usize::MAX);
1188        cursor.set_point_range(Point::zero().to_ts_point()..Point::MAX.to_ts_point());
1189        QUERY_CURSORS.lock().push(cursor)
1190    }
1191}
1192
1193pub(crate) trait ToTreeSitterPoint {
1194    fn to_ts_point(self) -> tree_sitter::Point;
1195    fn from_ts_point(point: tree_sitter::Point) -> Self;
1196}
1197
1198impl ToTreeSitterPoint for Point {
1199    fn to_ts_point(self) -> tree_sitter::Point {
1200        tree_sitter::Point::new(self.row as usize, self.column as usize)
1201    }
1202
1203    fn from_ts_point(point: tree_sitter::Point) -> Self {
1204        Point::new(point.row as u32, point.column as u32)
1205    }
1206}
1207
1208#[cfg(test)]
1209mod tests {
1210    use super::*;
1211    use crate::LanguageConfig;
1212    use text::{Buffer, Point};
1213    use unindent::Unindent as _;
1214    use util::test::marked_text_ranges;
1215
1216    #[gpui::test]
1217    fn test_syntax_map_layers_for_range() {
1218        let registry = Arc::new(LanguageRegistry::test());
1219        let language = Arc::new(rust_lang());
1220        registry.add(language.clone());
1221
1222        let mut buffer = Buffer::new(
1223            0,
1224            0,
1225            r#"
1226                fn a() {
1227                    assert_eq!(
1228                        b(vec![C {}]),
1229                        vec![d.e],
1230                    );
1231                    println!("{}", f(|_| true));
1232                }
1233            "#
1234            .unindent(),
1235        );
1236
1237        let mut syntax_map = SyntaxMap::new();
1238        syntax_map.set_language_registry(registry.clone());
1239        syntax_map.reparse(language.clone(), &buffer);
1240
1241        assert_layers_for_range(
1242            &syntax_map,
1243            &buffer,
1244            Point::new(2, 0)..Point::new(2, 0),
1245            &[
1246                "...(function_item ... (block (expression_statement (macro_invocation...",
1247                "...(tuple_expression (call_expression ... arguments: (arguments (macro_invocation...",
1248            ],
1249        );
1250        assert_layers_for_range(
1251            &syntax_map,
1252            &buffer,
1253            Point::new(2, 14)..Point::new(2, 16),
1254            &[
1255                "...(function_item ...",
1256                "...(tuple_expression (call_expression ... arguments: (arguments (macro_invocation...",
1257                "...(array_expression (struct_expression ...",
1258            ],
1259        );
1260        assert_layers_for_range(
1261            &syntax_map,
1262            &buffer,
1263            Point::new(3, 14)..Point::new(3, 16),
1264            &[
1265                "...(function_item ...",
1266                "...(tuple_expression (call_expression ... arguments: (arguments (macro_invocation...",
1267                "...(array_expression (field_expression ...",
1268            ],
1269        );
1270        assert_layers_for_range(
1271            &syntax_map,
1272            &buffer,
1273            Point::new(5, 12)..Point::new(5, 16),
1274            &[
1275                "...(function_item ...",
1276                "...(call_expression ... (arguments (closure_expression ...",
1277            ],
1278        );
1279
1280        // Replace a vec! macro invocation with a plain slice, removing a syntactic layer.
1281        let macro_name_range = range_for_text(&buffer, "vec!");
1282        buffer.edit([(macro_name_range, "&")]);
1283        syntax_map.interpolate(&buffer);
1284        syntax_map.reparse(language.clone(), &buffer);
1285
1286        assert_layers_for_range(
1287            &syntax_map,
1288            &buffer,
1289            Point::new(2, 14)..Point::new(2, 16),
1290            &[
1291                "...(function_item ...",
1292                "...(tuple_expression (call_expression ... arguments: (arguments (reference_expression value: (array_expression...",
1293            ],
1294        );
1295
1296        // Put the vec! macro back, adding back the syntactic layer.
1297        buffer.undo();
1298        syntax_map.interpolate(&buffer);
1299        syntax_map.reparse(language.clone(), &buffer);
1300
1301        assert_layers_for_range(
1302            &syntax_map,
1303            &buffer,
1304            Point::new(2, 14)..Point::new(2, 16),
1305            &[
1306                "...(function_item ...",
1307                "...(tuple_expression (call_expression ... arguments: (arguments (macro_invocation...",
1308                "...(array_expression (struct_expression ...",
1309            ],
1310        );
1311    }
1312
1313    #[gpui::test]
1314    fn test_typing_multiple_new_injections() {
1315        let (buffer, syntax_map) = test_edit_sequence(&[
1316            "fn a() { dbg }",
1317            "fn a() { dbg«!» }",
1318            "fn a() { dbg!«()» }",
1319            "fn a() { dbg!(«b») }",
1320            "fn a() { dbg!(b«.») }",
1321            "fn a() { dbg!(b.«c») }",
1322            "fn a() { dbg!(b.c«()») }",
1323            "fn a() { dbg!(b.c(«vec»)) }",
1324            "fn a() { dbg!(b.c(vec«!»)) }",
1325            "fn a() { dbg!(b.c(vec!«[]»)) }",
1326            "fn a() { dbg!(b.c(vec![«d»])) }",
1327            "fn a() { dbg!(b.c(vec![d«.»])) }",
1328            "fn a() { dbg!(b.c(vec![d.«e»])) }",
1329        ]);
1330
1331        assert_capture_ranges(
1332            &syntax_map,
1333            &buffer,
1334            &["field"],
1335            "fn a() { dbg!(b.«c»(vec![d.«e»])) }",
1336        );
1337    }
1338
1339    #[gpui::test]
1340    fn test_pasting_new_injection_line_between_others() {
1341        let (buffer, syntax_map) = test_edit_sequence(&[
1342            "
1343                fn a() {
1344                    b!(B {});
1345                    c!(C {});
1346                    d!(D {});
1347                    e!(E {});
1348                    f!(F {});
1349                    g!(G {});
1350                }
1351            ",
1352            "
1353                fn a() {
1354                    b!(B {});
1355                    c!(C {});
1356                    d!(D {});
1357                «    h!(H {});
1358                »    e!(E {});
1359                    f!(F {});
1360                    g!(G {});
1361                }
1362            ",
1363        ]);
1364
1365        assert_capture_ranges(
1366            &syntax_map,
1367            &buffer,
1368            &["struct"],
1369            "
1370            fn a() {
1371                b!(«B {}»);
1372                c!(«C {}»);
1373                d!(«D {}»);
1374                h!(«H {}»);
1375                e!(«E {}»);
1376                f!(«F {}»);
1377                g!(«G {}»);
1378            }
1379            ",
1380        );
1381    }
1382
1383    #[gpui::test]
1384    fn test_joining_injections_with_child_injections() {
1385        let (buffer, syntax_map) = test_edit_sequence(&[
1386            "
1387                fn a() {
1388                    b!(
1389                        c![one.two.three],
1390                        d![four.five.six],
1391                    );
1392                    e!(
1393                        f![seven.eight],
1394                    );
1395                }
1396            ",
1397            "
1398                fn a() {
1399                    b!(
1400                        c![one.two.three],
1401                        d![four.five.six],
1402                    ˇ    f![seven.eight],
1403                    );
1404                }
1405            ",
1406        ]);
1407
1408        assert_capture_ranges(
1409            &syntax_map,
1410            &buffer,
1411            &["field"],
1412            "
1413            fn a() {
1414                b!(
1415                    c![one.«two».«three»],
1416                    d![four.«five».«six»],
1417                    f![seven.«eight»],
1418                );
1419            }
1420            ",
1421        );
1422    }
1423
1424    #[gpui::test]
1425    fn test_editing_edges_of_injection() {
1426        test_edit_sequence(&[
1427            "
1428                fn a() {
1429                    b!(c!())
1430                }
1431            ",
1432            "
1433                fn a() {
1434                    «d»!(c!())
1435                }
1436            ",
1437            "
1438                fn a() {
1439                    «e»d!(c!())
1440                }
1441            ",
1442            "
1443                fn a() {
1444                    ed!«[»c!()«]»
1445                }
1446            ",
1447        ]);
1448    }
1449
1450    #[gpui::test]
1451    fn test_edits_preceding_and_intersecting_injection() {
1452        test_edit_sequence(&[
1453            //
1454            "const aaaaaaaaaaaa: B = c!(d(e.f));",
1455            "const aˇa: B = c!(d(eˇ));",
1456        ]);
1457    }
1458
1459    #[gpui::test]
1460    fn test_non_local_changes_create_injections() {
1461        test_edit_sequence(&[
1462            "
1463                // a! {
1464                    static B: C = d;
1465                // }
1466            ",
1467            "
1468                ˇa! {
1469                    static B: C = d;
1470                ˇ}
1471            ",
1472        ]);
1473    }
1474
1475    #[gpui::test]
1476    fn test_creating_many_injections_in_one_edit() {
1477        test_edit_sequence(&[
1478            "
1479                fn a() {
1480                    one(Two::three(3));
1481                    four(Five::six(6));
1482                    seven(Eight::nine(9));
1483                }
1484            ",
1485            "
1486                fn a() {
1487                    one«!»(Two::three(3));
1488                    four«!»(Five::six(6));
1489                    seven«!»(Eight::nine(9));
1490                }
1491            ",
1492            "
1493                fn a() {
1494                    one!(Two::three«!»(3));
1495                    four!(Five::six«!»(6));
1496                    seven!(Eight::nine«!»(9));
1497                }
1498            ",
1499        ]);
1500    }
1501
1502    #[gpui::test]
1503    fn test_editing_across_injection_boundary() {
1504        test_edit_sequence(&[
1505            "
1506                fn one() {
1507                    two();
1508                    three!(
1509                        three.four,
1510                        five.six,
1511                    );
1512                }
1513            ",
1514            "
1515                fn one() {
1516                    two();
1517                    th«irty_five![»
1518                        three.four,
1519                        five.six,
1520                    «   seven.eight,
1521                    ];»
1522                }
1523            ",
1524        ]);
1525    }
1526
1527    fn test_edit_sequence(steps: &[&str]) -> (Buffer, SyntaxMap) {
1528        let registry = Arc::new(LanguageRegistry::test());
1529        let language = Arc::new(rust_lang());
1530        registry.add(language.clone());
1531        let mut buffer = Buffer::new(0, 0, Default::default());
1532
1533        let mut mutated_syntax_map = SyntaxMap::new();
1534        mutated_syntax_map.set_language_registry(registry.clone());
1535        mutated_syntax_map.reparse(language.clone(), &buffer);
1536
1537        for (i, marked_string) in steps.into_iter().enumerate() {
1538            edit_buffer(&mut buffer, &marked_string.unindent());
1539
1540            // Reparse the syntax map
1541            mutated_syntax_map.interpolate(&buffer);
1542            mutated_syntax_map.reparse(language.clone(), &buffer);
1543
1544            // Create a second syntax map from scratch
1545            let mut reference_syntax_map = SyntaxMap::new();
1546            reference_syntax_map.set_language_registry(registry.clone());
1547            reference_syntax_map.reparse(language.clone(), &buffer);
1548
1549            // Compare the mutated syntax map to the new syntax map
1550            let mutated_layers = mutated_syntax_map.layers(&buffer);
1551            let reference_layers = reference_syntax_map.layers(&buffer);
1552            assert_eq!(
1553                mutated_layers.len(),
1554                reference_layers.len(),
1555                "wrong number of layers at step {i}"
1556            );
1557            for (edited_layer, reference_layer) in
1558                mutated_layers.into_iter().zip(reference_layers.into_iter())
1559            {
1560                assert_eq!(
1561                    edited_layer.2.to_sexp(),
1562                    reference_layer.2.to_sexp(),
1563                    "different layer at step {i}"
1564                );
1565                assert_eq!(
1566                    edited_layer.2.range(),
1567                    reference_layer.2.range(),
1568                    "different layer at step {i}"
1569                );
1570            }
1571        }
1572
1573        (buffer, mutated_syntax_map)
1574    }
1575
1576    fn rust_lang() -> Language {
1577        Language::new(
1578            LanguageConfig {
1579                name: "Rust".into(),
1580                path_suffixes: vec!["rs".to_string()],
1581                ..Default::default()
1582            },
1583            Some(tree_sitter_rust::language()),
1584        )
1585        .with_highlights_query(
1586            r#"
1587                (field_identifier) @field
1588                (struct_expression) @struct
1589            "#,
1590        )
1591        .unwrap()
1592        .with_injection_query(
1593            r#"
1594                (macro_invocation
1595                    (token_tree) @content
1596                    (#set! "language" "rust"))
1597            "#,
1598        )
1599        .unwrap()
1600    }
1601
1602    fn range_for_text(buffer: &Buffer, text: &str) -> Range<usize> {
1603        let start = buffer.as_rope().to_string().find(text).unwrap();
1604        start..start + text.len()
1605    }
1606
1607    fn assert_layers_for_range(
1608        syntax_map: &SyntaxMap,
1609        buffer: &BufferSnapshot,
1610        range: Range<Point>,
1611        expected_layers: &[&str],
1612    ) {
1613        let layers = syntax_map.layers_for_range(range, &buffer);
1614        assert_eq!(
1615            layers.len(),
1616            expected_layers.len(),
1617            "wrong number of layers"
1618        );
1619        for (i, ((_, _, node), expected_s_exp)) in
1620            layers.iter().zip(expected_layers.iter()).enumerate()
1621        {
1622            let actual_s_exp = node.to_sexp();
1623            assert!(
1624                string_contains_sequence(
1625                    &actual_s_exp,
1626                    &expected_s_exp.split("...").collect::<Vec<_>>()
1627                ),
1628                "layer {i}:\n\nexpected: {expected_s_exp}\nactual:   {actual_s_exp}",
1629            );
1630        }
1631    }
1632
1633    fn assert_capture_ranges(
1634        syntax_map: &SyntaxMap,
1635        buffer: &BufferSnapshot,
1636        highlight_query_capture_names: &[&str],
1637        marked_string: &str,
1638    ) {
1639        let mut actual_ranges = Vec::<Range<usize>>::new();
1640        let captures = syntax_map.captures(0..buffer.len(), buffer, |grammar| {
1641            grammar.highlights_query.as_ref()
1642        });
1643        let queries = captures
1644            .grammars()
1645            .iter()
1646            .map(|grammar| grammar.highlights_query.as_ref().unwrap())
1647            .collect::<Vec<_>>();
1648        for capture in captures {
1649            let name = &queries[capture.grammar_index].capture_names()[capture.index as usize];
1650            if highlight_query_capture_names.contains(&name.as_str()) {
1651                actual_ranges.push(capture.node.byte_range());
1652            }
1653        }
1654
1655        let (text, expected_ranges) = marked_text_ranges(&marked_string.unindent(), false);
1656        assert_eq!(text, buffer.text());
1657        assert_eq!(actual_ranges, expected_ranges);
1658    }
1659
1660    fn edit_buffer(buffer: &mut Buffer, marked_string: &str) {
1661        let old_text = buffer.text();
1662        let (new_text, mut ranges) = marked_text_ranges(marked_string, false);
1663        if ranges.is_empty() {
1664            ranges.push(0..new_text.len());
1665        }
1666
1667        assert_eq!(
1668            old_text[..ranges[0].start],
1669            new_text[..ranges[0].start],
1670            "invalid edit"
1671        );
1672
1673        let mut delta = 0;
1674        let mut edits = Vec::new();
1675        let mut ranges = ranges.into_iter().peekable();
1676
1677        while let Some(inserted_range) = ranges.next() {
1678            let new_start = inserted_range.start;
1679            let old_start = (new_start as isize - delta) as usize;
1680
1681            let following_text = if let Some(next_range) = ranges.peek() {
1682                &new_text[inserted_range.end..next_range.start]
1683            } else {
1684                &new_text[inserted_range.end..]
1685            };
1686
1687            let inserted_len = inserted_range.len();
1688            let deleted_len = old_text[old_start..]
1689                .find(following_text)
1690                .expect("invalid edit");
1691
1692            let old_range = old_start..old_start + deleted_len;
1693            edits.push((old_range, new_text[inserted_range].to_string()));
1694            delta += inserted_len as isize - deleted_len as isize;
1695        }
1696
1697        assert_eq!(
1698            old_text.len() as isize + delta,
1699            new_text.len() as isize,
1700            "invalid edit"
1701        );
1702
1703        buffer.edit(edits);
1704    }
1705
1706    pub fn string_contains_sequence(text: &str, parts: &[&str]) -> bool {
1707        let mut last_part_end = 0;
1708        for part in parts {
1709            if let Some(start_ix) = text[last_part_end..].find(part) {
1710                last_part_end = start_ix + part.len();
1711            } else {
1712                return false;
1713            }
1714        }
1715        true
1716    }
1717}