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 @@ enum ArgRef<'a> {
};
let arg_name = args.explicit_args()[index].kind.ident().unwrap();
ecx.buffered_early_lint.push(BufferedEarlyLint {
span: arg_name.span.into(),
span: Some(arg_name.span.into()),
node_id: rustc_ast::CRATE_NODE_ID,
lint_id: LintId::of(NAMED_ARGUMENTS_USED_POSITIONALLY),
diagnostic: BuiltinLintDiag::NamedArgumentUsedPositionally {

View File

@ -533,7 +533,7 @@ pub struct EarlyContext<'a> {
}
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.
///
/// [`lint_level`]: rustc_middle::lint::lint_level#decorate-signature
@ -544,7 +544,21 @@ pub fn span_lint_with_diagnostics(
span: MultiSpan,
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);
});
}

View File

@ -47,7 +47,7 @@ impl<'a, T: EarlyLintPass> EarlyContextAndPass<'a, T> {
fn inlined_check_id(&mut self, id: ast::NodeId) {
for early_lint in self.context.buffered.take(id) {
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)]
pub struct BufferedEarlyLint {
/// 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.
pub node_id: NodeId,
@ -791,7 +791,7 @@ pub fn buffer_lint(
self.add_early_lint(BufferedEarlyLint {
lint_id: LintId::of(lint),
node_id,
span: span.into(),
span: Some(span.into()),
diagnostic,
});
}

View File

@ -306,10 +306,20 @@ pub fn buffer_lint(
span: impl Into<MultiSpan>,
node_id: NodeId,
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| {
buffered_lints.push(BufferedEarlyLint {
span: span.into(),
span,
node_id,
lint_id: LintId::of(lint),
diagnostic,