]> git.proxmox.com Git - rustc.git/blob - src/libsyntax/show_span.rs
New upstream version 1.34.2+dfsg1
[rustc.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 crate::ast;
9 use crate::visit;
10 use crate::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 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::Mac) {
59 visit::walk_mac(self, mac);
60 }
61 }
62
63 pub fn run(span_diagnostic: &errors::Handler,
64 mode: &str,
65 krate: &ast::Crate) {
66 let mode = match mode.parse().ok() {
67 Some(mode) => mode,
68 None => return
69 };
70 let mut v = ShowSpanVisitor {
71 span_diagnostic,
72 mode,
73 };
74 visit::walk_crate(&mut v, krate);
75 }