syntax_map.rs

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