ast_grep_core/matcher/
text.rs1use 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}