use std::ops::Range;
use crate::Error;
pub use crate::query::{Argument, Metadata, Pattern, Predicate, Property, Query};
pub trait Backend {
type Language;
type Query;
type Tree;
fn compile(
&mut self,
language: &Self::Language,
source: &str,
) -> Result<Query<Self::Query>, Error>;
fn parse(
&mut self,
language: &Self::Language,
source: &str,
ranges: &[Range<usize>],
) -> Result<Self::Tree, Error>;
fn parse_incremental(
&mut self,
language: &Self::Language,
source: &str,
ranges: &[Range<usize>],
_previous: Option<Self::Tree>,
_edit: Option<&crate::document::Edit>,
) -> Result<Self::Tree, Error> {
self.parse(language, source, ranges)
}
fn prepare_source(&mut self, _source: &str) -> Result<(), Error> {
Ok(())
}
fn parse_prepared(
&mut self,
language: &Self::Language,
source: &str,
ranges: &[Range<usize>],
previous: Option<Self::Tree>,
edit: Option<&crate::document::Edit>,
) -> Result<Self::Tree, Error> {
self.parse_incremental(language, source, ranges, previous, edit)
}
fn matches(
&mut self,
query: &Query<Self::Query>,
tree: &Self::Tree,
source: &str,
) -> Result<Vec<Match>, Error>;
}
#[derive(Clone)]
pub struct Match {
pub pattern: usize,
pub captures: Vec<Capture>,
}
#[derive(Clone)]
pub struct Capture {
pub index: u32,
pub node: Node,
}
#[derive(Clone)]
pub struct Node {
pub id: usize,
pub parent: Option<usize>,
pub range: Range<usize>,
pub children: Vec<Child>,
pub ancestors: Vec<String>,
pub depth: usize,
}
#[derive(Clone)]
pub struct Child {
pub range: Range<usize>,
pub named: bool,
}