Move rustc-specific entrypoint to the rustc
module
This commit is contained in:
parent
42103d69b7
commit
bab8ede761
@ -391,8 +391,12 @@ fn analyze_patterns(
|
|||||||
) -> Result<UsefulnessReport<'p, 'tcx>, ErrorGuaranteed> {
|
) -> Result<UsefulnessReport<'p, 'tcx>, ErrorGuaranteed> {
|
||||||
let pattern_complexity_limit =
|
let pattern_complexity_limit =
|
||||||
get_limit_size(cx.tcx.hir().krate_attrs(), cx.tcx.sess, sym::pattern_complexity);
|
get_limit_size(cx.tcx.hir().krate_attrs(), cx.tcx.sess, sym::pattern_complexity);
|
||||||
let report =
|
let report = rustc_pattern_analysis::rustc::analyze_match(
|
||||||
rustc_pattern_analysis::analyze_match(&cx, &arms, scrut_ty, pattern_complexity_limit)
|
&cx,
|
||||||
|
&arms,
|
||||||
|
scrut_ty,
|
||||||
|
pattern_complexity_limit,
|
||||||
|
)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
self.error = Err(err);
|
self.error = Err(err);
|
||||||
err
|
err
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
//! Analysis of patterns, notably match exhaustiveness checking.
|
//! Analysis of patterns, notably match exhaustiveness checking. The main entrypoint for this crate
|
||||||
|
//! is [`usefulness::compute_match_usefulness`]. For rustc-specific types and entrypoints, see the
|
||||||
|
//! [`rustc`] module.
|
||||||
|
|
||||||
// tidy-alphabetical-start
|
// tidy-alphabetical-start
|
||||||
#![allow(rustc::diagnostic_outside_of_impl)]
|
#![allow(rustc::diagnostic_outside_of_impl)]
|
||||||
@ -23,14 +25,8 @@
|
|||||||
|
|
||||||
pub use rustc_index::{Idx, IndexVec}; // re-exported to avoid rustc_index version issues
|
pub use rustc_index::{Idx, IndexVec}; // re-exported to avoid rustc_index version issues
|
||||||
|
|
||||||
#[cfg(feature = "rustc")]
|
|
||||||
use rustc_middle::ty::Ty;
|
|
||||||
#[cfg(feature = "rustc")]
|
|
||||||
use rustc_span::ErrorGuaranteed;
|
|
||||||
|
|
||||||
use crate::constructor::{Constructor, ConstructorSet, IntRange};
|
use crate::constructor::{Constructor, ConstructorSet, IntRange};
|
||||||
use crate::pat::DeconstructedPat;
|
use crate::pat::DeconstructedPat;
|
||||||
use crate::pat_column::PatternColumn;
|
|
||||||
|
|
||||||
pub trait Captures<'a> {}
|
pub trait Captures<'a> {}
|
||||||
impl<'a, T: ?Sized> Captures<'a> for T {}
|
impl<'a, T: ?Sized> Captures<'a> for T {}
|
||||||
@ -128,30 +124,3 @@ fn clone(&self) -> Self {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'p, Cx: PatCx> Copy for MatchArm<'p, Cx> {}
|
impl<'p, Cx: PatCx> Copy for MatchArm<'p, Cx> {}
|
||||||
|
|
||||||
/// The entrypoint for this crate. Computes whether a match is exhaustive and which of its arms are
|
|
||||||
/// useful, and runs some lints.
|
|
||||||
#[cfg(feature = "rustc")]
|
|
||||||
pub fn analyze_match<'p, 'tcx>(
|
|
||||||
tycx: &rustc::RustcPatCtxt<'p, 'tcx>,
|
|
||||||
arms: &[rustc::MatchArm<'p, 'tcx>],
|
|
||||||
scrut_ty: Ty<'tcx>,
|
|
||||||
pattern_complexity_limit: Option<usize>,
|
|
||||||
) -> Result<rustc::UsefulnessReport<'p, 'tcx>, ErrorGuaranteed> {
|
|
||||||
use lints::lint_nonexhaustive_missing_variants;
|
|
||||||
use usefulness::{compute_match_usefulness, PlaceValidity};
|
|
||||||
|
|
||||||
let scrut_ty = tycx.reveal_opaque_ty(scrut_ty);
|
|
||||||
let scrut_validity = PlaceValidity::from_bool(tycx.known_valid_scrutinee);
|
|
||||||
let report =
|
|
||||||
compute_match_usefulness(tycx, arms, scrut_ty, scrut_validity, pattern_complexity_limit)?;
|
|
||||||
|
|
||||||
// Run the non_exhaustive_omitted_patterns lint. Only run on refutable patterns to avoid hitting
|
|
||||||
// `if let`s. Only run if the match is exhaustive otherwise the error is redundant.
|
|
||||||
if tycx.refutable && report.non_exhaustiveness_witnesses.is_empty() {
|
|
||||||
let pat_column = PatternColumn::new(arms);
|
|
||||||
lint_nonexhaustive_missing_variants(tycx, arms, &pat_column, scrut_ty)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(report)
|
|
||||||
}
|
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
use crate::constructor::{
|
use crate::constructor::{
|
||||||
IntRange, MaybeInfiniteInt, OpaqueId, RangeEnd, Slice, SliceKind, VariantVisibility,
|
IntRange, MaybeInfiniteInt, OpaqueId, RangeEnd, Slice, SliceKind, VariantVisibility,
|
||||||
};
|
};
|
||||||
|
use crate::lints::lint_nonexhaustive_missing_variants;
|
||||||
|
use crate::pat_column::PatternColumn;
|
||||||
|
use crate::usefulness::{compute_match_usefulness, PlaceValidity};
|
||||||
use crate::{errors, Captures, PatCx, PrivateUninhabitedField};
|
use crate::{errors, Captures, PatCx, PrivateUninhabitedField};
|
||||||
|
|
||||||
use crate::constructor::Constructor::*;
|
use crate::constructor::Constructor::*;
|
||||||
@ -1058,3 +1061,26 @@ fn expand<'p, 'tcx>(pat: &'p Pat<'tcx>, vec: &mut Vec<&'p Pat<'tcx>>) {
|
|||||||
expand(pat, &mut pats);
|
expand(pat, &mut pats);
|
||||||
pats
|
pats
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The entrypoint for this crate. Computes whether a match is exhaustive and which of its arms are
|
||||||
|
/// useful, and runs some lints.
|
||||||
|
pub fn analyze_match<'p, 'tcx>(
|
||||||
|
tycx: &RustcPatCtxt<'p, 'tcx>,
|
||||||
|
arms: &[MatchArm<'p, 'tcx>],
|
||||||
|
scrut_ty: Ty<'tcx>,
|
||||||
|
pattern_complexity_limit: Option<usize>,
|
||||||
|
) -> Result<UsefulnessReport<'p, 'tcx>, ErrorGuaranteed> {
|
||||||
|
let scrut_ty = tycx.reveal_opaque_ty(scrut_ty);
|
||||||
|
let scrut_validity = PlaceValidity::from_bool(tycx.known_valid_scrutinee);
|
||||||
|
let report =
|
||||||
|
compute_match_usefulness(tycx, arms, scrut_ty, scrut_validity, pattern_complexity_limit)?;
|
||||||
|
|
||||||
|
// Run the non_exhaustive_omitted_patterns lint. Only run on refutable patterns to avoid hitting
|
||||||
|
// `if let`s. Only run if the match is exhaustive otherwise the error is redundant.
|
||||||
|
if tycx.refutable && report.non_exhaustiveness_witnesses.is_empty() {
|
||||||
|
let pat_column = PatternColumn::new(arms);
|
||||||
|
lint_nonexhaustive_missing_variants(tycx, arms, &pat_column, scrut_ty)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(report)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user