From 698f8c2f01ea549d77d7dc3338a12e04c11057b9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:02:58 +0200 Subject: Adding upstream version 1.64.0+dfsg1. Signed-off-by: Daniel Baumann --- compiler/rustc_ast_passes/src/show_span.rs | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 compiler/rustc_ast_passes/src/show_span.rs (limited to 'compiler/rustc_ast_passes/src/show_span.rs') diff --git a/compiler/rustc_ast_passes/src/show_span.rs b/compiler/rustc_ast_passes/src/show_span.rs new file mode 100644 index 000000000..27637e311 --- /dev/null +++ b/compiler/rustc_ast_passes/src/show_span.rs @@ -0,0 +1,65 @@ +//! Span debugger +//! +//! This module shows spans for all expressions in the crate +//! to help with compiler debugging. + +use std::str::FromStr; + +use rustc_ast as ast; +use rustc_ast::visit; +use rustc_ast::visit::Visitor; + +enum Mode { + Expression, + Pattern, + Type, +} + +impl FromStr for Mode { + type Err = (); + fn from_str(s: &str) -> Result { + let mode = match s { + "expr" => Mode::Expression, + "pat" => Mode::Pattern, + "ty" => Mode::Type, + _ => return Err(()), + }; + Ok(mode) + } +} + +struct ShowSpanVisitor<'a> { + span_diagnostic: &'a rustc_errors::Handler, + mode: Mode, +} + +impl<'a> Visitor<'a> for ShowSpanVisitor<'a> { + fn visit_expr(&mut self, e: &'a ast::Expr) { + if let Mode::Expression = self.mode { + self.span_diagnostic.span_warn(e.span, "expression"); + } + visit::walk_expr(self, e); + } + + fn visit_pat(&mut self, p: &'a ast::Pat) { + if let Mode::Pattern = self.mode { + self.span_diagnostic.span_warn(p.span, "pattern"); + } + visit::walk_pat(self, p); + } + + fn visit_ty(&mut self, t: &'a ast::Ty) { + if let Mode::Type = self.mode { + self.span_diagnostic.span_warn(t.span, "type"); + } + visit::walk_ty(self, t); + } +} + +pub fn run(span_diagnostic: &rustc_errors::Handler, mode: &str, krate: &ast::Crate) { + let Ok(mode) = mode.parse() else { + return; + }; + let mut v = ShowSpanVisitor { span_diagnostic, mode }; + visit::walk_crate(&mut v, krate); +} -- cgit v1.2.3