Ensure injection layer is recomputed when language changes

Co-Authored-By: Max Brunsfeld <max@zed.dev>
This commit is contained in:
Antonio Scandurra 2023-01-23 19:02:06 +01:00
parent 79cf6fb8b6
commit 8dabdd1baa

View file

@ -5,7 +5,7 @@ use parking_lot::Mutex;
use std::{ use std::{
borrow::Cow, borrow::Cow,
cell::RefCell, cell::RefCell,
cmp::{Ordering, Reverse}, cmp::{self, Ordering, Reverse},
collections::BinaryHeap, collections::BinaryHeap,
ops::{Deref, DerefMut, Range}, ops::{Deref, DerefMut, Range},
sync::Arc, sync::Arc,
@ -1004,15 +1004,21 @@ fn get_injections(
prev_match = Some((mat.pattern_index, content_range.clone())); prev_match = Some((mat.pattern_index, content_range.clone()));
let combined = config.patterns[mat.pattern_index].combined; let combined = config.patterns[mat.pattern_index].combined;
let language_name = config.patterns[mat.pattern_index]
.language let mut language_name = None;
.as_ref() let mut step_range = content_range.clone();
.map(|s| Cow::Borrowed(s.as_ref())) if let Some(name) = config.patterns[mat.pattern_index].language.as_ref() {
.or_else(|| { language_name = Some(Cow::Borrowed(name.as_ref()))
let ix = config.language_capture_ix?; } else if let Some(language_node) = config
let node = mat.nodes_for_capture_index(ix).next()?; .language_capture_ix
Some(Cow::Owned(text.text_for_range(node.byte_range()).collect())) .and_then(|ix| mat.nodes_for_capture_index(ix).next())
}); {
step_range.start = cmp::min(content_range.start, language_node.start_byte());
step_range.end = cmp::max(content_range.end, language_node.end_byte());
language_name = Some(Cow::Owned(
text.text_for_range(language_node.byte_range()).collect(),
))
};
if let Some(language_name) = language_name { if let Some(language_name) = language_name {
let language = language_registry let language = language_registry
@ -1020,8 +1026,8 @@ fn get_injections(
.or_else(|| language_registry.language_for_extension(&language_name)); .or_else(|| language_registry.language_for_extension(&language_name));
if let Some(language) = language { if let Some(language) = language {
result = true; result = true;
let range = text.anchor_before(content_range.start) let range =
..text.anchor_after(content_range.end); text.anchor_before(step_range.start)..text.anchor_after(step_range.end);
if combined { if combined {
combined_injection_ranges combined_injection_ranges
.get_mut(&language.clone()) .get_mut(&language.clone())