59 lines
1.4 KiB
Rust
59 lines
1.4 KiB
Rust
//! Inspect tree-sitter AST structure for Rust code
|
|
|
|
use tree_sitter::{Parser, Language};
|
|
|
|
fn print_tree(node: tree_sitter::Node, source: &str, indent: usize) {
|
|
let indent_str = " ".repeat(indent);
|
|
let node_text = &source[node.byte_range()];
|
|
let preview = if node_text.len() > 50 {
|
|
format!("{}...", &node_text[..50])
|
|
} else {
|
|
node_text.to_string()
|
|
};
|
|
|
|
println!(
|
|
"{}{} [{}:{}] '{}'",
|
|
indent_str,
|
|
node.kind(),
|
|
node.start_position().row + 1,
|
|
node.start_position().column + 1,
|
|
preview.replace('\n', "\\n")
|
|
);
|
|
|
|
let mut cursor = node.walk();
|
|
for child in node.children(&mut cursor) {
|
|
print_tree(child, source, indent + 1);
|
|
}
|
|
}
|
|
|
|
fn main() -> anyhow::Result<()> {
|
|
let source_code = r#"
|
|
pub async fn example_async() {
|
|
println!("Hello");
|
|
}
|
|
|
|
fn regular_function() {
|
|
println!("Regular");
|
|
}
|
|
|
|
pub async fn another_async(x: i32) -> Result<(), ()> {
|
|
Ok(())
|
|
}
|
|
"#;
|
|
|
|
println!("Source code:");
|
|
println!("{}", source_code);
|
|
println!("\n{}", "=".repeat(80));
|
|
println!("AST Structure:");
|
|
println!("{}\n", "=".repeat(80));
|
|
|
|
let mut parser = Parser::new();
|
|
let language: Language = tree_sitter_rust::language().into();
|
|
parser.set_language(&language)?;
|
|
|
|
let tree = parser.parse(source_code, None).unwrap();
|
|
print_tree(tree.root_node(), source_code, 0);
|
|
|
|
Ok(())
|
|
}
|