1
Fork 0

migrate: expect.rs

This commit is contained in:
Rejyr 2022-11-09 18:22:48 -05:00
parent 6ffecd2059
commit 3c1a1f3643
2 changed files with 41 additions and 30 deletions

View file

@ -1,8 +1,9 @@
use crate::builtin;
use rustc_errors::fluent;
use rustc_hir::HirId;
#![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)]
use crate::lints::Expectation;
use rustc_middle::ty::query::Providers;
use rustc_middle::{lint::LintExpectation, ty::TyCtxt};
use rustc_middle::ty::TyCtxt;
use rustc_session::lint::builtin::UNFULFILLED_LINT_EXPECTATIONS;
use rustc_session::lint::LintExpectationId;
use rustc_span::symbol::sym;
use rustc_span::Symbol;
@ -28,34 +29,15 @@ fn check_expectations(tcx: TyCtxt<'_>, tool_filter: Option<Symbol>) {
if !fulfilled_expectations.contains(&id)
&& tool_filter.map_or(true, |filter| expectation.lint_tool == Some(filter))
{
emit_unfulfilled_expectation_lint(tcx, *hir_id, expectation);
tcx.emit_spanned_lint(
UNFULFILLED_LINT_EXPECTATIONS,
*hir_id,
expectation.emission_span,
Expectation { expectation },
);
}
} else {
unreachable!("at this stage all `LintExpectationId`s are stable");
}
}
}
fn emit_unfulfilled_expectation_lint(
tcx: TyCtxt<'_>,
hir_id: HirId,
expectation: &LintExpectation,
) {
tcx.struct_span_lint_hir(
builtin::UNFULFILLED_LINT_EXPECTATIONS,
hir_id,
expectation.emission_span,
fluent::lint_expectation,
|lint| {
if let Some(rationale) = expectation.reason {
lint.note(rationale.as_str());
}
if expectation.is_unfulfilled_lint_expectations {
lint.note(fluent::note);
}
lint
},
);
}

View file

@ -3,7 +3,10 @@ use std::num::NonZeroU32;
use rustc_errors::{fluent, AddToDiagnostic, Applicability, DecorateLint, DiagnosticMessage};
use rustc_hir::def_id::DefId;
use rustc_macros::{LintDiagnostic, Subdiagnostic};
use rustc_middle::ty::{Predicate, Ty, TyCtxt};
use rustc_middle::{
lint::LintExpectation,
ty::{Predicate, Ty, TyCtxt},
};
use rustc_span::{edition::Edition, symbol::Ident, Span, Symbol};
use crate::{errors::OverruledAttributeSub, LateContext};
@ -304,6 +307,32 @@ pub struct EnumIntrinsicsMemVariant<'a> {
pub ty_param: Ty<'a>,
}
// expect.rs
pub struct Expectation<'a> {
pub expectation: &'a LintExpectation,
}
impl<'a> DecorateLint<'a, ()> for Expectation<'_> {
fn decorate_lint<'b>(
self,
diag: &'b mut rustc_errors::DiagnosticBuilder<'a, ()>,
) -> &'b mut rustc_errors::DiagnosticBuilder<'a, ()> {
if let Some(rationale) = self.expectation.reason {
diag.note(rationale.as_str());
}
if self.expectation.is_unfulfilled_lint_expectations {
diag.note(fluent::note);
}
diag
}
fn msg(&self) -> DiagnosticMessage {
fluent::lint_expectation
}
}
// internal.rs
#[derive(LintDiagnostic)]
#[diag(lint_default_hash_types)]