migrate: traits.rs

This commit is contained in:
Rejyr 2022-09-05 11:52:08 -04:00
parent e5ae9d019c
commit a42afa0444
2 changed files with 41 additions and 16 deletions

View File

@ -1,11 +1,39 @@
use rustc_errors::{fluent, AddSubdiagnostic, Applicability, DecorateLint, EmissionGuarantee}; use rustc_errors::{fluent, AddSubdiagnostic, Applicability, DecorateLint, EmissionGuarantee};
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_macros::{LintDiagnostic, SessionSubdiagnostic}; use rustc_macros::{LintDiagnostic, SessionSubdiagnostic};
use rustc_middle::ty::Ty; use rustc_middle::ty::{Predicate, Ty, TyCtxt};
use rustc_span::{Span, Symbol}; use rustc_span::{Span, Symbol};
use crate::LateContext; use crate::LateContext;
pub struct DropTraitConstraintsDiag<'a> {
pub predicate: Predicate<'a>,
pub tcx: TyCtxt<'a>,
pub def_id: DefId,
}
impl<'a, G: EmissionGuarantee> DecorateLint<'_, G> for DropTraitConstraintsDiag<'a> {
fn decorate_lint(self, diag: rustc_errors::LintDiagnosticBuilder<'_, G>) {
let mut diag = diag.build(fluent::lint_drop_trait_constraints);
diag.set_arg("predicate", self.predicate);
diag.set_arg("needs_drop", self.tcx.def_path_str(self.def_id));
diag.emit();
}
}
pub struct DropGlue<'a> {
pub tcx: TyCtxt<'a>,
pub def_id: DefId,
}
impl<'a, G: EmissionGuarantee> DecorateLint<'_, G> for DropGlue<'a> {
fn decorate_lint(self, diag: rustc_errors::LintDiagnosticBuilder<'_, G>) {
let mut diag = diag.build(fluent::lint_drop_glue);
diag.set_arg("needs_drop", self.tcx.def_path_str(self.def_id));
diag.emit();
}
}
#[derive(LintDiagnostic)] #[derive(LintDiagnostic)]
#[diag(lint_range_endpoint_out_of_range)] #[diag(lint_range_endpoint_out_of_range)]
pub struct RangeEndpointOutOfRange<'a> { pub struct RangeEndpointOutOfRange<'a> {

View File

@ -1,7 +1,9 @@
#![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)]
use crate::lints::{DropGlue, DropTraitConstraintsDiag};
use crate::LateContext; use crate::LateContext;
use crate::LateLintPass; use crate::LateLintPass;
use crate::LintContext; use crate::LintContext;
use rustc_errors::fluent;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
@ -101,17 +103,13 @@ impl<'tcx> LateLintPass<'tcx> for DropTraitConstraints {
if trait_predicate.trait_ref.self_ty().is_impl_trait() { if trait_predicate.trait_ref.self_ty().is_impl_trait() {
continue; continue;
} }
let Some(needs_drop) = cx.tcx.get_diagnostic_item(sym::needs_drop) else { let Some(def_id) = cx.tcx.get_diagnostic_item(sym::needs_drop) else {
continue; return
}; };
cx.struct_span_lint( cx.emit_spanned_lint(
DROP_BOUNDS, DROP_BOUNDS,
span, span,
fluent::lint_drop_trait_constraints, DropTraitConstraintsDiag { predicate, tcx: cx.tcx, def_id },
|lint| {
lint.set_arg("predicate", predicate)
.set_arg("needs_drop", cx.tcx.def_path_str(needs_drop))
},
); );
} }
} }
@ -123,12 +121,11 @@ impl<'tcx> LateLintPass<'tcx> for DropTraitConstraints {
}; };
for bound in &bounds[..] { for bound in &bounds[..] {
let def_id = bound.trait_ref.trait_def_id(); let def_id = bound.trait_ref.trait_def_id();
if cx.tcx.lang_items().drop_trait() == def_id if cx.tcx.lang_items().drop_trait() == def_id {
&& let Some(needs_drop) = cx.tcx.get_diagnostic_item(sym::needs_drop) let Some(def_id) = cx.tcx.get_diagnostic_item(sym::needs_drop) else {
{ return
cx.struct_span_lint(DYN_DROP, bound.span, fluent::lint_drop_glue, |lint| { };
lint.set_arg("needs_drop", cx.tcx.def_path_str(needs_drop)) cx.emit_spanned_lint(DYN_DROP, bound.span, DropGlue { tcx: cx.tcx, def_id });
});
} }
} }
} }