]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_ast_passes/src/show_span.rs
Auto merge of #107840 - matthiaskrgr:rollup-e6v7x0a, r=matthiaskrgr
[rust.git] / compiler / rustc_ast_passes / src / 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 as 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
59 pub fn run(span_diagnostic: &rustc_errors::Handler, mode: &str, krate: &ast::Crate) {
60     let Ok(mode) = mode.parse() else {
61         return;
62     };
63     let mut v = ShowSpanVisitor { span_diagnostic, mode };
64     visit::walk_crate(&mut v, krate);
65 }