WIP: Start on SyntaxMapSnapshot::unknown_injection_languages
This commit is contained in:
parent
14c72cac58
commit
f3509824e8
1 changed files with 49 additions and 1 deletions
|
@ -7,6 +7,7 @@ use std::{
|
||||||
cell::RefCell,
|
cell::RefCell,
|
||||||
cmp::{self, Ordering, Reverse},
|
cmp::{self, Ordering, Reverse},
|
||||||
collections::BinaryHeap,
|
collections::BinaryHeap,
|
||||||
|
iter,
|
||||||
ops::{Deref, DerefMut, Range},
|
ops::{Deref, DerefMut, Range},
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
};
|
};
|
||||||
|
@ -133,6 +134,7 @@ struct SyntaxLayerSummary {
|
||||||
range: Range<Anchor>,
|
range: Range<Anchor>,
|
||||||
last_layer_range: Range<Anchor>,
|
last_layer_range: Range<Anchor>,
|
||||||
last_layer_language: Option<usize>,
|
last_layer_language: Option<usize>,
|
||||||
|
contains_pending_layer: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
@ -642,7 +644,7 @@ impl SyntaxSnapshot {
|
||||||
});
|
});
|
||||||
|
|
||||||
cursor.next(buffer);
|
cursor.next(buffer);
|
||||||
std::iter::from_fn(move || {
|
iter::from_fn(move || {
|
||||||
while let Some(layer) = cursor.item() {
|
while let Some(layer) = cursor.item() {
|
||||||
if let SyntaxLayerContent::Parsed { tree, language } = &layer.content {
|
if let SyntaxLayerContent::Parsed { tree, language } = &layer.content {
|
||||||
let info = SyntaxLayerInfo {
|
let info = SyntaxLayerInfo {
|
||||||
|
@ -662,6 +664,27 @@ impl SyntaxSnapshot {
|
||||||
None
|
None
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn unknown_injection_languages<'a>(
|
||||||
|
&'a self,
|
||||||
|
buffer: &'a BufferSnapshot,
|
||||||
|
) -> impl 'a + Iterator<Item = &Arc<str>> {
|
||||||
|
let mut cursor = self
|
||||||
|
.layers
|
||||||
|
.filter::<_, ()>(|summary| summary.contains_pending_layer);
|
||||||
|
cursor.next(buffer);
|
||||||
|
iter::from_fn(move || {
|
||||||
|
while let Some(layer) = cursor.item() {
|
||||||
|
if let SyntaxLayerContent::Pending { language_name } = &layer.content {
|
||||||
|
cursor.next(buffer);
|
||||||
|
return Some(language_name);
|
||||||
|
} else {
|
||||||
|
cursor.next(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> SyntaxMapCaptures<'a> {
|
impl<'a> SyntaxMapCaptures<'a> {
|
||||||
|
@ -1356,6 +1379,7 @@ impl Default for SyntaxLayerSummary {
|
||||||
range: Anchor::MAX..Anchor::MIN,
|
range: Anchor::MAX..Anchor::MIN,
|
||||||
last_layer_range: Anchor::MIN..Anchor::MAX,
|
last_layer_range: Anchor::MIN..Anchor::MAX,
|
||||||
last_layer_language: None,
|
last_layer_language: None,
|
||||||
|
contains_pending_layer: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1377,6 +1401,7 @@ impl sum_tree::Summary for SyntaxLayerSummary {
|
||||||
}
|
}
|
||||||
self.last_layer_range = other.last_layer_range.clone();
|
self.last_layer_range = other.last_layer_range.clone();
|
||||||
self.last_layer_language = other.last_layer_language;
|
self.last_layer_language = other.last_layer_language;
|
||||||
|
self.contains_pending_layer |= other.contains_pending_layer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1427,6 +1452,7 @@ impl sum_tree::Item for SyntaxLayer {
|
||||||
range: self.range.clone(),
|
range: self.range.clone(),
|
||||||
last_layer_range: self.range.clone(),
|
last_layer_range: self.range.clone(),
|
||||||
last_layer_language: self.content.language_id(),
|
last_layer_language: self.content.language_id(),
|
||||||
|
contains_pending_layer: matches!(self.content, SyntaxLayerContent::Pending { .. }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1715,6 +1741,28 @@ mod tests {
|
||||||
"...(call method: (identifier) arguments: (argument_list (call method: (identifier) arguments: (argument_list) block: (block)...",
|
"...(call method: (identifier) arguments: (argument_list (call method: (identifier) arguments: (argument_list) block: (block)...",
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Replace Ruby with a language that hasn't been loaded yet.
|
||||||
|
let macro_name_range = range_for_text(&buffer, "ruby");
|
||||||
|
buffer.edit([(macro_name_range, "erb")]);
|
||||||
|
syntax_map.interpolate(&buffer);
|
||||||
|
syntax_map.reparse(markdown.clone(), &buffer);
|
||||||
|
assert_layers_for_range(
|
||||||
|
&syntax_map,
|
||||||
|
&buffer,
|
||||||
|
Point::new(3, 0)..Point::new(3, 0),
|
||||||
|
&[
|
||||||
|
"...(fenced_code_block (fenced_code_block_delimiter) (info_string (language)) (code_fence_content) (fenced_code_block_delimiter..."
|
||||||
|
],
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
syntax_map
|
||||||
|
.unknown_injection_languages(&buffer)
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
vec![&Arc::from("erb")]
|
||||||
|
);
|
||||||
|
|
||||||
|
registry.add(Arc::new(erb_lang()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue