Skip to content

Commit b352490

Browse files
Update decorate_builtin_lint to use Diagnostic instead of LintDiagnostic
1 parent 36ad6ff commit b352490

File tree

9 files changed

+303
-206
lines changed

9 files changed

+303
-206
lines changed

compiler/rustc_hir_analysis/src/lib.rs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -149,20 +149,30 @@ pub fn provide(providers: &mut Providers) {
149149
}
150150

151151
fn emit_delayed_lint(lint: &DelayedLint, tcx: TyCtxt<'_>) {
152+
struct DiagEmitter<'tcx> {
153+
hir_id: rustc_hir::HirId,
154+
tcx: TyCtxt<'tcx>,
155+
span: Span,
156+
}
157+
158+
impl rustc_lint::EmitDiag for DiagEmitter<'_> {
159+
fn emit(
160+
&self,
161+
lint: &'static rustc_lint::Lint,
162+
diag: impl for<'a> rustc_errors::Diagnostic<'a, ()>,
163+
) {
164+
self.tcx.emit_node_span_lint(lint, self.hir_id, self.span, diag);
165+
}
166+
}
167+
152168
match lint {
153169
DelayedLint::AttributeParsing(attribute_lint) => {
154-
tcx.node_span_lint(
170+
rustc_lint::decorate_attribute_lint(
171+
&DiagEmitter { hir_id: attribute_lint.id, tcx, span: attribute_lint.span },
172+
tcx.sess,
173+
Some(tcx),
174+
&attribute_lint.kind,
155175
attribute_lint.lint_id.lint,
156-
attribute_lint.id,
157-
attribute_lint.span,
158-
|diag| {
159-
rustc_lint::decorate_attribute_lint(
160-
tcx.sess,
161-
Some(tcx),
162-
&attribute_lint.kind,
163-
diag,
164-
);
165-
},
166176
);
167177
}
168178
}

compiler/rustc_lint/src/early.rs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
use rustc_ast::visit::{self as ast_visit, Visitor, walk_list};
88
use rustc_ast::{self as ast, AttrVec, HasAttrs};
99
use rustc_data_structures::stack::ensure_sufficient_stack;
10-
use rustc_errors::{BufferedEarlyLint, DecorateDiagCompat, LintBuffer};
10+
use rustc_errors::{BufferedEarlyLint, DecorateDiagCompat, Diagnostic, LintBuffer, MultiSpan};
1111
use rustc_feature::Features;
1212
use rustc_middle::ty::{RegisteredTools, TyCtxt};
1313
use rustc_session::Session;
1414
use rustc_session::lint::LintPass;
1515
use rustc_span::{Ident, Span};
1616
use tracing::debug;
1717

18+
use crate::Lint;
1819
use crate::context::{EarlyContext, LintContext, LintStore};
1920
use crate::passes::{EarlyLintPass, EarlyLintPassObject};
2021

@@ -32,16 +33,40 @@ pub struct EarlyContextAndPass<'ecx, 'tcx, T: EarlyLintPass> {
3233
pass: T,
3334
}
3435

36+
pub trait EmitDiag {
37+
fn emit(&self, lint: &'static Lint, diag: impl for<'a> Diagnostic<'a, ()>);
38+
}
39+
40+
struct DiagEmitter<'a, 'b> {
41+
ctx: &'a EarlyContext<'b>,
42+
span: Option<MultiSpan>,
43+
}
44+
45+
impl EmitDiag for DiagEmitter<'_, '_> {
46+
fn emit(&self, lint: &'static Lint, diag: impl for<'a> Diagnostic<'a, ()>) {
47+
self.ctx.opt_span_diag_lint(lint, self.span.clone(), diag);
48+
}
49+
}
50+
3551
impl<'ecx, 'tcx, T: EarlyLintPass> EarlyContextAndPass<'ecx, 'tcx, T> {
3652
fn check_id(&mut self, id: ast::NodeId) {
3753
for early_lint in self.context.buffered.take(id) {
3854
let BufferedEarlyLint { span, node_id: _, lint_id, diagnostic } = early_lint;
39-
self.context.opt_span_diag_lint(lint_id.lint, span, |diag| match diagnostic {
55+
match diagnostic {
4056
DecorateDiagCompat::Builtin(b) => {
41-
diagnostics::decorate_builtin_lint(self.context.sess(), self.tcx, b, diag);
57+
diagnostics::decorate_builtin_lint(
58+
&DiagEmitter { ctx: &self.context, span },
59+
self.context.sess(),
60+
self.tcx,
61+
b,
62+
lint_id.lint,
63+
);
4264
}
43-
DecorateDiagCompat::Dynamic(d) => d.decorate_lint_box(diag),
44-
});
65+
DecorateDiagCompat::Dynamic(d) => {
66+
self.context
67+
.opt_span_lint(lint_id.lint, span, |diag| d.decorate_lint_box(diag));
68+
}
69+
}
4570
}
4671
}
4772

0 commit comments

Comments
 (0)