syntax_map.rs

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