Start work on a SyntaxMap data structure

This commit is contained in:
Max Brunsfeld 2022-08-05 14:58:45 -07:00
parent 6e67448420
commit f6a817a0f3
7 changed files with 476 additions and 4 deletions

View file

@ -3,6 +3,7 @@ mod diagnostic_set;
mod highlight_map;
mod outline;
pub mod proto;
mod syntax_map;
#[cfg(test)]
mod tests;
@ -290,9 +291,17 @@ pub struct Grammar {
pub(crate) brackets_query: Option<Query>,
pub(crate) indents_query: Option<Query>,
pub(crate) outline_query: Option<Query>,
pub(crate) injection_config: Option<InjectionConfig>,
pub(crate) highlight_map: Mutex<HighlightMap>,
}
struct InjectionConfig {
query: Query,
content_capture_ix: u32,
language_capture_ix: Option<u32>,
languages_by_pattern_ix: Vec<Option<Box<str>>>,
}
#[derive(Clone)]
pub enum LanguageServerBinaryStatus {
CheckingForUpdate,
@ -571,6 +580,7 @@ impl Language {
brackets_query: None,
indents_query: None,
outline_query: None,
injection_config: None,
ts_language,
highlight_map: Default::default(),
})
@ -610,6 +620,40 @@ impl Language {
Ok(self)
}
pub fn with_injection_query(mut self, source: &str) -> Result<Self> {
let grammar = self.grammar_mut();
let query = Query::new(grammar.ts_language, source)?;
let mut language_capture_ix = None;
let mut content_capture_ix = None;
for (ix, name) in query.capture_names().iter().enumerate() {
*match name.as_str() {
"language" => &mut language_capture_ix,
"content" => &mut content_capture_ix,
_ => continue,
} = Some(ix as u32);
}
let languages_by_pattern_ix = (0..query.pattern_count())
.map(|ix| {
query.property_settings(ix).iter().find_map(|setting| {
if setting.key.as_ref() == "language" {
return setting.value.clone();
} else {
None
}
})
})
.collect();
if let Some(content_capture_ix) = content_capture_ix {
grammar.injection_config = Some(InjectionConfig {
query,
language_capture_ix,
content_capture_ix,
languages_by_pattern_ix,
});
}
Ok(self)
}
fn grammar_mut(&mut self) -> &mut Grammar {
Arc::get_mut(self.grammar.as_mut().unwrap()).unwrap()
}