Skip to main content

ct_regex_internal/codegen/create_type/
classes.rs

1use regex_syntax::ast::{
2    Ast, ClassAscii, ClassAsciiKind, ClassBracketed, ClassPerl, ClassPerlKind, ClassSet,
3    ClassSetBinaryOp, ClassSetItem,
4};
5
6pub(crate) fn simplify_classes(ast: &mut Ast) {
7    let replacement = match ast {
8        Ast::ClassPerl(class) =>      replace_perl_class(class),
9        Ast::ClassBracketed(class) => return replace_in_class(&mut class.kind),
10        Ast::Repetition(rep) =>       return simplify_classes(&mut rep.ast),
11        Ast::Group(group) =>          return simplify_classes(&mut group.ast),
12        Ast::Alternation(alt) =>      return alt.asts.iter_mut().for_each(simplify_classes),
13        Ast::Concat(cat) =>           return cat.asts.iter_mut().for_each(simplify_classes),
14        _ => return,
15    };
16    *ast = Ast::ClassBracketed(Box::new(ClassBracketed {
17        span: *ast.span(),
18        negated: false,
19        kind: ClassSet::Item(ClassSetItem::Ascii(replacement)),
20    }));
21}
22
23pub(crate) fn replace_in_class(class: &mut ClassSet) {
24    match class {
25        ClassSet::BinaryOp(ClassSetBinaryOp { lhs, rhs, .. }) => {
26            replace_in_class(lhs);
27            replace_in_class(rhs);
28        },
29        ClassSet::Item(item) => replace_in_class_set_item(item),
30    }
31}
32
33pub(crate) fn replace_in_class_set_item(item: &mut ClassSetItem) {
34    let replacement = match item {
35        ClassSetItem::Perl(class) =>      replace_perl_class(class),
36        ClassSetItem::Bracketed(class) => return replace_in_class(&mut class.kind),
37        ClassSetItem::Union(class) => {
38            return class.items.iter_mut().for_each(replace_in_class_set_item);
39        },
40        _ => return,
41    };
42    *item = ClassSetItem::Ascii(replacement);
43}
44
45pub(crate) fn replace_perl_class(class: &mut ClassPerl) -> ClassAscii {
46    ClassAscii {
47        span: class.span,
48        negated: class.negated,
49        kind: match class.kind {
50            ClassPerlKind::Digit => ClassAsciiKind::Digit,
51            ClassPerlKind::Space => ClassAsciiKind::Space,
52            ClassPerlKind::Word => ClassAsciiKind::Word,
53        },
54    }
55}