#![feature(rustc_private)]
extern crate rustc_ast;
extern crate rustc_span;
use rustc_ast::ast::{Item, VisibilityKind};
use rustc_ast::visit::{walk_crate, walk_item, Visitor};
use rustc_span::edition::Edition;
use rustc_tools::with_ast_parser;
use std::path::Path;
struct PublicItemVisitor;
impl<'ast> Visitor<'ast> for PublicItemVisitor {
fn visit_item(&mut self, i: &'ast Item) {
if matches!(i.vis.kind, VisibilityKind::Public) {
println!("=> [public] {} {}", i.kind.descr(), i.ident.name.as_str());
}
walk_item(self, i);
}
}
fn main() {
let p = match std::env::args().nth(1) {
Some(p) => p,
None => {
eprintln!("Missing file operand");
return;
}
};
let p = Path::new(&p);
println!("Running AST example on `{}`", p.display());
with_ast_parser(p, Edition::Edition2018, |sess, krate| {
println!(
"Listing all public items of crate (edition: {:?})",
sess.edition
);
walk_crate(&mut PublicItemVisitor, krate);
})
.unwrap();
}