ast_grep_core/matcher/
text.rs

1use super::Matcher;
2use crate::meta_var::MetaVarEnv;
3use crate::Doc;
4use crate::Node;
5
6use bit_set::BitSet;
7use regex::{Error as RegexError, Regex};
8use thiserror::Error;
9
10use std::borrow::Cow;
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 {
20  regex: Regex,
21}
22
23impl RegexMatcher {
24  pub fn try_new(text: &str) -> Result<Self, RegexMatcherError> {
25    Ok(RegexMatcher {
26      regex: Regex::new(text)?,
27    })
28  }
29}
30
31impl Matcher for RegexMatcher {
32  fn match_node_with_env<'tree, D: Doc>(
33    &self,
34    node: Node<'tree, D>,
35    _env: &mut Cow<MetaVarEnv<'tree, D>>,
36  ) -> Option<Node<'tree, D>> {
37    self.regex.is_match(&node.text()).then_some(node)
38  }
39
40  fn potential_kinds(&self) -> Option<BitSet> {
41    None
42  }
43}