1use locals::Locals;
2use ropey::RopeSlice;
3
4use slab::Slab;
5
6use std::fmt;
7use std::hash::{Hash, Hasher};
8use std::time::Duration;
9use tree_sitter::{IncompatibleGrammarError, Node, Tree};
10
11pub use crate::config::{read_query, LanguageConfig, LanguageLoader};
12pub use crate::injections_query::{InjectionLanguageMarker, InjectionsQuery};
13use crate::parse::LayerUpdateFlags;
14pub use crate::query_iter::{CapturedMatch, QueryMatchIter, QueryMatchIterEvent};
15pub use crate::tree_cursor::TreeCursor;
16pub use tree_sitter;
17mod config;
21pub mod highlighter;
22mod injections_query;
23mod parse;
24#[cfg(all(test, feature = "fixtures"))]
25mod tests;
26#[cfg(feature = "fixtures")]
28pub mod fixtures;
29pub mod locals;
30pub mod query_iter;
31pub mod text_object;
32mod tree_cursor;
33
34#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
37pub struct Layer(u32);
38
39impl Layer {
40 fn idx(self) -> usize {
41 self.0 as usize
42 }
43}
44
45#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
46pub struct Language(pub u32);
47
48impl Language {
49 pub fn new(idx: u32) -> Language {
50 Language(idx)
51 }
52
53 pub fn idx(self) -> usize {
54 self.0 as usize
55 }
56}
57
58#[derive(Debug, Clone)]
86pub struct Syntax {
87 layers: Slab<LayerData>,
88 root: Layer,
89}
90
91impl Syntax {
92 pub fn new(
93 source: RopeSlice,
94 language: Language,
95 timeout: Duration,
96 loader: &impl LanguageLoader,
97 ) -> Result<Self, Error> {
98 let root_layer = LayerData {
99 parse_tree: None,
100 language,
101 flags: LayerUpdateFlags::default(),
102 ranges: vec![tree_sitter::Range::new(
103 tree_sitter::Point::ZERO,
104 tree_sitter::Point::MAX,
105 0,
106 u32::MAX,
107 )],
108 injections: Vec::new(),
109 parent: None,
110 locals: Locals::default(),
111 };
112 let mut layers = Slab::with_capacity(32);
113 let root = layers.insert(root_layer);
114 let mut syntax = Self {
115 root: Layer(root as u32),
116 layers,
117 };
118
119 syntax.update(source, timeout, &[], loader).map(|_| syntax)
120 }
121
122 pub fn layer(&self, layer: Layer) -> &LayerData {
123 &self.layers[layer.idx()]
124 }
125
126 fn layer_mut(&mut self, layer: Layer) -> &mut LayerData {
127 &mut self.layers[layer.idx()]
128 }
129
130 pub fn root(&self) -> Layer {
131 self.root
132 }
133
134 pub fn tree(&self) -> &Tree {
135 self.layer(self.root)
136 .tree()
137 .expect("`Syntax::new` would err if the root layer's tree could not be parsed")
138 }
139
140 #[inline]
141 pub fn tree_for_byte_range(&self, start: u32, end: u32) -> &Tree {
142 self.layer_and_tree_for_byte_range(start, end).1
143 }
144
145 pub(crate) fn layer_and_tree_for_byte_range(&self, start: u32, end: u32) -> (Layer, &Tree) {
147 let mut layer = self.layer_for_byte_range(start, end);
148 loop {
149 if let Some(tree) = self.layer(layer).tree() {
152 return (layer, tree);
153 }
154 if let Some(parent) = self.layer(layer).parent {
155 layer = parent;
156 }
157 }
158 }
159
160 #[inline]
161 pub fn named_descendant_for_byte_range(&self, start: u32, end: u32) -> Option<Node<'_>> {
162 self.tree_for_byte_range(start, end)
163 .root_node()
164 .named_descendant_for_byte_range(start, end)
165 }
166
167 #[inline]
168 pub fn descendant_for_byte_range(&self, start: u32, end: u32) -> Option<Node<'_>> {
169 self.tree_for_byte_range(start, end)
170 .root_node()
171 .descendant_for_byte_range(start, end)
172 }
173
174 pub fn layer_for_byte_range(&self, start: u32, end: u32) -> Layer {
176 self.layers_for_byte_range(start, end)
177 .last()
178 .expect("always includes the root layer")
179 }
180
181 pub fn layers_for_byte_range(&self, start: u32, end: u32) -> impl Iterator<Item = Layer> + '_ {
186 let mut parent_injection_layer = self.root;
187
188 std::iter::once(self.root).chain(std::iter::from_fn(move || {
189 let layer = &self.layers[parent_injection_layer.idx()];
190
191 let injection_at_start = layer.injection_at_byte_idx(start)?;
192 let injection_at_end = layer.injection_at_byte_idx(end)?;
193
194 (injection_at_start.layer == injection_at_end.layer).then(|| {
195 parent_injection_layer = injection_at_start.layer;
196
197 injection_at_start.layer
198 })
199 }))
200 }
201
202 pub fn walk(&self) -> TreeCursor<'_> {
203 TreeCursor::new(self)
204 }
205}
206
207#[derive(Debug, Clone)]
208pub struct Injection {
209 pub range: Range,
210 pub layer: Layer,
211 matched_node_range: Range,
212}
213
214#[derive(Debug, Clone)]
215pub struct LayerData {
216 pub language: Language,
217 parse_tree: Option<Tree>,
218 ranges: Vec<tree_sitter::Range>,
219 injections: Vec<Injection>,
223 flags: LayerUpdateFlags,
225 parent: Option<Layer>,
226 locals: Locals,
227}
228
229impl PartialEq for LayerData {
234 fn eq(&self, other: &Self) -> bool {
235 self.parent == other.parent
236 && self.language == other.language
237 && self.ranges == other.ranges
238 }
239}
240
241impl Hash for LayerData {
244 fn hash<H: Hasher>(&self, state: &mut H) {
245 self.parent.hash(state);
246 self.language.hash(state);
247 self.ranges.hash(state);
248 }
249}
250
251impl LayerData {
252 pub fn tree(&self) -> Option<&Tree> {
257 self.parse_tree.as_ref()
258 }
259
260 pub fn injection_at_byte_idx(&self, idx: u32) -> Option<&Injection> {
263 self.injections_at_byte_idx(idx)
264 .next()
265 .filter(|injection| injection.range.start <= idx)
266 }
267
268 pub fn injections_at_byte_idx(&self, idx: u32) -> impl Iterator<Item = &Injection> {
272 let i = self
273 .injections
274 .partition_point(|range| range.range.end <= idx);
275 self.injections[i..].iter()
276 }
277}
278
279#[derive(Debug, PartialEq, Eq)]
281pub enum Error {
282 Timeout,
283 ExceededMaximumSize,
284 InvalidRanges,
285 Unknown,
286 NoRootConfig,
287 IncompatibleGrammar(Language, IncompatibleGrammarError),
288}
289
290impl fmt::Display for Error {
291 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
292 match self {
293 Self::Timeout => f.write_str("configured timeout was exceeded"),
294 Self::ExceededMaximumSize => f.write_str("input text exceeds the maximum allowed size"),
295 Self::InvalidRanges => f.write_str("invalid ranges"),
296 Self::Unknown => f.write_str("an unknown error occurred"),
297 Self::NoRootConfig => f.write_str(
298 "`LanguageLoader::get_config` for the root layer language returned `None`",
299 ),
300 Self::IncompatibleGrammar(language, IncompatibleGrammarError { abi_version }) => {
301 write!(
302 f,
303 "failed to load grammar for language {language:?} with ABI version {abi_version}"
304 )
305 }
306 }
307 }
308}
309
310pub const TREE_SITTER_MATCH_LIMIT: u32 = 256;
329
330type Range = std::ops::Range<u32>;
333
334#[cfg(test)]
335mod unit_tests {
336 use super::{Injection, Language, Layer, LayerData};
337 use crate::locals::Locals;
338 use crate::parse::LayerUpdateFlags;
339
340 fn make_injection(start: u32, end: u32) -> Injection {
341 Injection {
342 range: start..end,
343 layer: Layer(0),
344 matched_node_range: start..end,
345 }
346 }
347
348 fn layer_with_injections(injections: Vec<Injection>) -> LayerData {
349 LayerData {
350 language: Language(0),
351 parse_tree: None,
352 ranges: vec![],
353 injections,
354 flags: LayerUpdateFlags::default(),
355 parent: None,
356 locals: Locals::default(),
357 }
358 }
359
360 #[test]
361 fn injection_at_byte_idx_exclusive_end() {
362 let layer = layer_with_injections(vec![make_injection(5, 10)]);
363 assert!(layer.injection_at_byte_idx(9).is_some());
365 assert!(layer.injection_at_byte_idx(10).is_none());
367 }
368
369 #[test]
370 fn injection_at_byte_idx_adjacent() {
371 let layer = layer_with_injections(vec![make_injection(0, 10), make_injection(10, 20)]);
373 let inj = layer.injection_at_byte_idx(10).unwrap();
374 assert_eq!(inj.range, 10..20);
375 }
376}