]> git.lizzy.rs Git - rust.git/blob - src/libsyntax/show_span.rs
Rollup merge of #57042 - pnkfelix:issue-57038-sidestep-ice-in-fieldplacement-count...
[rust.git] / src / libsyntax / 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 ast;
9 use errors;
10 use visit;
11 use visit::Visitor;
12
13 enum Mode {
14     Expression,
15     Pattern,
16     Type,
17 }
18
19 impl FromStr for Mode {
20     type Err = ();
21     fn from_str(s: &str) -> Result<Mode, ()> {
22         let mode = match s {
23             "expr" => Mode::Expression,
24             "pat" => Mode::Pattern,
25             "ty" => Mode::Type,
26             _ => return Err(())
27         };
28         Ok(mode)
29     }
30 }
31
32 struct ShowSpanVisitor<'a> {
33     span_diagnostic: &'a errors::Handler,
34     mode: Mode,
35 }
36
37 impl<'a> Visitor<'a> for ShowSpanVisitor<'a> {
38     fn visit_expr(&mut self, e: &'a ast::Expr) {
39         if let Mode::Expression = self.mode {
40             self.span_diagnostic.span_warn(e.span, "expression");
41         }
42         visit::walk_expr(self, e);
43     }
44
45     fn visit_pat(&mut self, p: &'a ast::Pat) {
46         if let Mode::Pattern = self.mode {
47             self.span_diagnostic.span_warn(p.span, "pattern");
48         }
49         visit::walk_pat(self, p);
50     }
51
52     fn visit_ty(&mut self, t: &'a ast::Ty) {
53         if let Mode::Type = self.mode {
54             self.span_diagnostic.span_warn(t.span, "type");
55         }
56         visit::walk_ty(self, t);
57     }
58
59     fn visit_mac(&mut self, mac: &'a ast::Mac) {
60         visit::walk_mac(self, mac);
61     }
62 }
63
64 pub fn run(span_diagnostic: &errors::Handler,
65            mode: &str,
66            krate: &ast::Crate) {
67     let mode = match mode.parse().ok() {
68         Some(mode) => mode,
69         None => return
70     };
71     let mut v = ShowSpanVisitor {
72         span_diagnostic,
73         mode,
74     };
75     visit::walk_crate(&mut v, krate);
76 }