]> git.proxmox.com Git - rustc.git/blob - src/librustc_ast_passes/show_span.rs
New upstream version 1.44.1+dfsg1
[rustc.git] / src / librustc_ast_passes / show_span.rs
1 //! Span debugger
2 //!
3 //! This module shows spans for all expressions in the crate
4 //! to help with compiler debugging.
5
6 use std::str::FromStr;
7
8 use rustc_ast::ast;
9 use rustc_ast::visit;
10 use rustc_ast::visit::Visitor;
11
12 enum Mode {
13 Expression,
14 Pattern,
15 Type,
16 }
17
18 impl FromStr for Mode {
19 type Err = ();
20 fn from_str(s: &str) -> Result<Mode, ()> {
21 let mode = match s {
22 "expr" => Mode::Expression,
23 "pat" => Mode::Pattern,
24 "ty" => Mode::Type,
25 _ => return Err(()),
26 };
27 Ok(mode)
28 }
29 }
30
31 struct ShowSpanVisitor<'a> {
32 span_diagnostic: &'a rustc_errors::Handler,
33 mode: Mode,
34 }
35
36 impl<'a> Visitor<'a> for ShowSpanVisitor<'a> {
37 fn visit_expr(&mut self, e: &'a ast::Expr) {
38 if let Mode::Expression = self.mode {
39 self.span_diagnostic.span_warn(e.span, "expression");
40 }
41 visit::walk_expr(self, e);
42 }
43
44 fn visit_pat(&mut self, p: &'a ast::Pat) {
45 if let Mode::Pattern = self.mode {
46 self.span_diagnostic.span_warn(p.span, "pattern");
47 }
48 visit::walk_pat(self, p);
49 }
50
51 fn visit_ty(&mut self, t: &'a ast::Ty) {
52 if let Mode::Type = self.mode {
53 self.span_diagnostic.span_warn(t.span, "type");
54 }
55 visit::walk_ty(self, t);
56 }
57
58 fn visit_mac(&mut self, mac: &'a ast::MacCall) {
59 visit::walk_mac(self, mac);
60 }
61 }
62
63 pub fn run(span_diagnostic: &rustc_errors::Handler, mode: &str, krate: &ast::Crate) {
64 let mode = match mode.parse().ok() {
65 Some(mode) => mode,
66 None => return,
67 };
68 let mut v = ShowSpanVisitor { span_diagnostic, mode };
69 visit::walk_crate(&mut v, krate);
70 }