use crate::matcher::PatternBuilder;
use crate::meta_var::{extract_meta_var, MetaVariable};
use crate::{Pattern, PatternError};
use std::borrow::Cow;
use std::path::Path;
pub trait Language: Clone + 'static {
fn pre_process_pattern<'q>(&self, query: &'q str) -> Cow<'q, str> {
Cow::Borrowed(query)
}
#[inline]
fn meta_var_char(&self) -> char {
'$'
}
#[inline]
fn expando_char(&self) -> char {
self.meta_var_char()
}
fn extract_meta_var(&self, source: &str) -> Option<MetaVariable> {
extract_meta_var(source, self.expando_char())
}
fn from_path<P: AsRef<Path>>(_path: P) -> Option<Self> {
None
}
fn kind_to_id(&self, kind: &str) -> u16;
fn field_to_id(&self, field: &str) -> Option<u16>;
fn build_pattern(&self, builder: &PatternBuilder) -> Result<Pattern, PatternError>;
}
#[cfg(test)]
pub use test::*;
#[cfg(test)]
mod test {
use super::*;
use crate::tree_sitter::{LanguageExt, StrDoc, TSLanguage};
#[derive(Clone)]
pub struct Tsx;
impl Language for Tsx {
fn kind_to_id(&self, kind: &str) -> u16 {
let ts_lang: TSLanguage = tree_sitter_typescript::LANGUAGE_TSX.into();
ts_lang.id_for_node_kind(kind, true)
}
fn field_to_id(&self, field: &str) -> Option<u16> {
self
.get_ts_language()
.field_id_for_name(field)
.map(|f| f.get())
}
fn build_pattern(&self, builder: &PatternBuilder) -> Result<Pattern, PatternError> {
builder.build(|src| StrDoc::try_new(src, self.clone()))
}
}
impl LanguageExt for Tsx {
fn get_ts_language(&self) -> TSLanguage {
tree_sitter_typescript::LANGUAGE_TSX.into()
}
}
}