Make `Span` optional in `BufferedEarlyLint`

This commit is contained in:
Urgau 2024-06-22 12:38:10 +02:00
parent 6a2cd0d50c
commit eedb32dd12
5 changed files with 31 additions and 7 deletions

View File

@ -555,7 +555,7 @@ fn make_format_args(
}; };
let arg_name = args.explicit_args()[index].kind.ident().unwrap(); let arg_name = args.explicit_args()[index].kind.ident().unwrap();
ecx.buffered_early_lint.push(BufferedEarlyLint { ecx.buffered_early_lint.push(BufferedEarlyLint {
span: arg_name.span.into(), span: Some(arg_name.span.into()),
node_id: rustc_ast::CRATE_NODE_ID, node_id: rustc_ast::CRATE_NODE_ID,
lint_id: LintId::of(NAMED_ARGUMENTS_USED_POSITIONALLY), lint_id: LintId::of(NAMED_ARGUMENTS_USED_POSITIONALLY),
diagnostic: BuiltinLintDiag::NamedArgumentUsedPositionally { diagnostic: BuiltinLintDiag::NamedArgumentUsedPositionally {

View File

@ -533,7 +533,7 @@ pub struct EarlyContext<'a> {
} }
impl EarlyContext<'_> { impl EarlyContext<'_> {
/// Emit a lint at the appropriate level, with an optional associated span and an existing /// Emit a lint at the appropriate level, with an associated span and an existing
/// diagnostic. /// diagnostic.
/// ///
/// [`lint_level`]: rustc_middle::lint::lint_level#decorate-signature /// [`lint_level`]: rustc_middle::lint::lint_level#decorate-signature
@ -544,7 +544,21 @@ impl EarlyContext<'_> {
span: MultiSpan, span: MultiSpan,
diagnostic: BuiltinLintDiag, diagnostic: BuiltinLintDiag,
) { ) {
self.opt_span_lint(lint, Some(span), |diag| { self.opt_span_lint_with_diagnostics(lint, Some(span), diagnostic);
}
/// Emit a lint at the appropriate level, with an optional associated span and an existing
/// diagnostic.
///
/// [`lint_level`]: rustc_middle::lint::lint_level#decorate-signature
#[rustc_lint_diagnostics]
pub fn opt_span_lint_with_diagnostics(
&self,
lint: &'static Lint,
span: Option<MultiSpan>,
diagnostic: BuiltinLintDiag,
) {
self.opt_span_lint(lint, span, |diag| {
diagnostics::decorate_lint(self.sess(), diagnostic, diag); diagnostics::decorate_lint(self.sess(), diagnostic, diag);
}); });
} }

View File

@ -47,7 +47,7 @@ impl<'a, T: EarlyLintPass> EarlyContextAndPass<'a, T> {
fn inlined_check_id(&mut self, id: ast::NodeId) { fn inlined_check_id(&mut self, id: ast::NodeId) {
for early_lint in self.context.buffered.take(id) { for early_lint in self.context.buffered.take(id) {
let BufferedEarlyLint { span, node_id: _, lint_id, diagnostic } = early_lint; let BufferedEarlyLint { span, node_id: _, lint_id, diagnostic } = early_lint;
self.context.span_lint_with_diagnostics(lint_id.lint, span, diagnostic); self.context.opt_span_lint_with_diagnostics(lint_id.lint, span, diagnostic);
} }
} }

View File

@ -753,7 +753,7 @@ pub enum BuiltinLintDiag {
#[derive(Debug)] #[derive(Debug)]
pub struct BufferedEarlyLint { pub struct BufferedEarlyLint {
/// The span of code that we are linting on. /// The span of code that we are linting on.
pub span: MultiSpan, pub span: Option<MultiSpan>,
/// The `NodeId` of the AST node that generated the lint. /// The `NodeId` of the AST node that generated the lint.
pub node_id: NodeId, pub node_id: NodeId,
@ -791,7 +791,7 @@ impl LintBuffer {
self.add_early_lint(BufferedEarlyLint { self.add_early_lint(BufferedEarlyLint {
lint_id: LintId::of(lint), lint_id: LintId::of(lint),
node_id, node_id,
span: span.into(), span: Some(span.into()),
diagnostic, diagnostic,
}); });
} }

View File

@ -306,10 +306,20 @@ impl ParseSess {
span: impl Into<MultiSpan>, span: impl Into<MultiSpan>,
node_id: NodeId, node_id: NodeId,
diagnostic: BuiltinLintDiag, diagnostic: BuiltinLintDiag,
) {
self.opt_span_buffer_lint(lint, Some(span.into()), node_id, diagnostic)
}
pub fn opt_span_buffer_lint(
&self,
lint: &'static Lint,
span: Option<MultiSpan>,
node_id: NodeId,
diagnostic: BuiltinLintDiag,
) { ) {
self.buffered_lints.with_lock(|buffered_lints| { self.buffered_lints.with_lock(|buffered_lints| {
buffered_lints.push(BufferedEarlyLint { buffered_lints.push(BufferedEarlyLint {
span: span.into(), span,
node_id, node_id,
lint_id: LintId::of(lint), lint_id: LintId::of(lint),
diagnostic, diagnostic,