ast_grep_core/matcher/
text.rs

1use super::Matcher;
2use crate::meta_var::MetaVarEnv;
3use crate::{Doc, Language, Node};
4
5use bit_set::BitSet;
6use regex::{Error as RegexError, Regex};
7use thiserror::Error;
8
9use std::borrow::Cow;
10use std::marker::PhantomData;
11
12#[derive(Debug, Error)]
13pub enum RegexMatcherError {
14  #[error("Parsing text matcher fails.")]
15  Regex(#[from] RegexError),
16}
17
18#[derive(Clone)]
19pub struct RegexMatcher<L: Language> {
20  regex: Regex,
21  lang: PhantomData<L>,
22}
23
24impl<L: Language> RegexMatcher<L> {
25  pub fn try_new(text: &str) -> Result<Self, RegexMatcherError> {
26    Ok(RegexMatcher {
27      regex: Regex::new(text)?,
28      lang: PhantomData,
29    })
30  }
31}
32
33impl<L: Language> Matcher<L> for RegexMatcher<L> {
34  fn match_node_with_env<'tree, D: Doc<Lang = L>>(
35    &self,
36    node: Node<'tree, D>,
37    _env: &mut Cow<MetaVarEnv<'tree, D>>,
38  ) -> Option<Node<'tree, D>> {
39    self.regex.is_match(&node.text()).then_some(node)
40  }
41
42  fn potential_kinds(&self) -> Option<BitSet> {
43    None
44  }
45}