ct_regex_internal/codegen/create_type/
classes.rs1use 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}