regex_visitor/
regex_visitor.rs

1#![expect(clippy::print_stdout)]
2//! # Regular Expression AST Visitor Example
3//!
4//! This example demonstrates how to use the visitor pattern to traverse
5//! regular expression ASTs and inspect different node types.
6//!
7//! ## Usage
8//!
9//! ```bash
10//! cargo run -p oxc_regular_expression --example regex_visitor
11//! ```
12
13use oxc_allocator::Allocator;
14use oxc_regular_expression::{
15    LiteralParser, Options,
16    visit::{RegExpAstKind, Visit},
17};
18use oxc_span::GetSpan;
19
20/// A test visitor that logs entering and leaving AST nodes
21struct TestVisitor;
22
23impl Visit<'_> for TestVisitor {
24    fn enter_node(&mut self, kind: RegExpAstKind) {
25        println!("enter_node: {:?} {kind:?}", kind.span());
26    }
27
28    fn leave_node(&mut self, kind: RegExpAstKind) {
29        println!("leave_node: {:?} {kind:?}", kind.span());
30    }
31}
32
33/// Demonstrate regex AST traversal using the visitor pattern
34fn main() {
35    let source_text = r"(https?:\/\/github\.com\/(([^\s]+)\/([^\s]+))\/([^\s]+\/)?(issues|pull)\/([0-9]+))|(([^\s]+)\/([^\s]+))?#([1-9][0-9]*)($|[\s\:\;\-\(\=])";
36
37    let allocator = Allocator::default();
38    let parser = LiteralParser::new(&allocator, source_text, None, Options::default());
39    let pattern = parser.parse().unwrap();
40
41    // Visit the regex AST and log each node
42    let mut visitor = TestVisitor;
43    visitor.visit_pattern(&pattern);
44}