Don't expose Usefulness
in the api
This commit is contained in:
parent
3a4c135a2f
commit
5547105f6b
2 changed files with 22 additions and 9 deletions
|
@ -1,6 +1,6 @@
|
||||||
use super::usefulness::Usefulness::*;
|
|
||||||
use super::usefulness::{
|
use super::usefulness::{
|
||||||
compute_match_usefulness, expand_pattern, MatchArm, MatchCheckCtxt, UsefulnessReport,
|
compute_match_usefulness, expand_pattern, MatchArm, MatchCheckCtxt, Reachability,
|
||||||
|
UsefulnessReport,
|
||||||
};
|
};
|
||||||
use super::{PatCtxt, PatKind, PatternError};
|
use super::{PatCtxt, PatKind, PatternError};
|
||||||
|
|
||||||
|
@ -398,10 +398,11 @@ fn report_arm_reachability<'p, 'tcx>(
|
||||||
report: &UsefulnessReport<'p, 'tcx>,
|
report: &UsefulnessReport<'p, 'tcx>,
|
||||||
source: hir::MatchSource,
|
source: hir::MatchSource,
|
||||||
) {
|
) {
|
||||||
|
use Reachability::*;
|
||||||
let mut catchall = None;
|
let mut catchall = None;
|
||||||
for (arm_index, (arm, is_useful)) in report.arm_usefulness.iter().enumerate() {
|
for (arm_index, (arm, is_useful)) in report.arm_usefulness.iter().enumerate() {
|
||||||
match is_useful {
|
match is_useful {
|
||||||
NotUseful => {
|
Unreachable => {
|
||||||
match source {
|
match source {
|
||||||
hir::MatchSource::WhileDesugar => bug!(),
|
hir::MatchSource::WhileDesugar => bug!(),
|
||||||
|
|
||||||
|
@ -430,9 +431,9 @@ fn report_arm_reachability<'p, 'tcx>(
|
||||||
hir::MatchSource::AwaitDesugar | hir::MatchSource::TryDesugar => {}
|
hir::MatchSource::AwaitDesugar | hir::MatchSource::TryDesugar => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Useful(unreachables) if unreachables.is_empty() => {}
|
Reachable(unreachables) if unreachables.is_empty() => {}
|
||||||
// The arm is reachable, but contains unreachable subpatterns (from or-patterns).
|
// The arm is reachable, but contains unreachable subpatterns (from or-patterns).
|
||||||
Useful(unreachables) => {
|
Reachable(unreachables) => {
|
||||||
let mut unreachables: Vec<_> = unreachables.iter().collect();
|
let mut unreachables: Vec<_> = unreachables.iter().collect();
|
||||||
// Emit lints in the order in which they occur in the file.
|
// Emit lints in the order in which they occur in the file.
|
||||||
unreachables.sort_unstable();
|
unreachables.sort_unstable();
|
||||||
|
@ -440,7 +441,6 @@ fn report_arm_reachability<'p, 'tcx>(
|
||||||
unreachable_pattern(cx.tcx, span, arm.hir_id, None);
|
unreachable_pattern(cx.tcx, span, arm.hir_id, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UsefulWithWitness(_) => bug!(),
|
|
||||||
}
|
}
|
||||||
if !arm.has_guard && catchall.is_none() && pat_is_catchall(arm.pat) {
|
if !arm.has_guard && catchall.is_none() && pat_is_catchall(arm.pat) {
|
||||||
catchall = Some(arm.pat.span);
|
catchall = Some(arm.pat.span);
|
||||||
|
|
|
@ -679,7 +679,7 @@ impl SpanSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
crate enum Usefulness<'tcx> {
|
enum Usefulness<'tcx> {
|
||||||
/// Pontentially carries a set of sub-branches that have been found to be unreachable. Used
|
/// Pontentially carries a set of sub-branches that have been found to be unreachable. Used
|
||||||
/// only in the presence of or-patterns, otherwise it stays empty.
|
/// only in the presence of or-patterns, otherwise it stays empty.
|
||||||
Useful(SpanSet),
|
Useful(SpanSet),
|
||||||
|
@ -1024,10 +1024,18 @@ crate struct MatchArm<'p, 'tcx> {
|
||||||
crate has_guard: bool,
|
crate has_guard: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
crate enum Reachability {
|
||||||
|
/// Potentially carries a set of sub-branches that have been found to be unreachable. Used only
|
||||||
|
/// in the presence of or-patterns, otherwise it stays empty.
|
||||||
|
Reachable(SpanSet),
|
||||||
|
Unreachable,
|
||||||
|
}
|
||||||
|
|
||||||
/// The output of checking a match for exhaustiveness and arm reachability.
|
/// The output of checking a match for exhaustiveness and arm reachability.
|
||||||
crate struct UsefulnessReport<'p, 'tcx> {
|
crate struct UsefulnessReport<'p, 'tcx> {
|
||||||
/// For each arm of the input, whether that arm is reachable after the arms above it.
|
/// For each arm of the input, whether that arm is reachable after the arms above it.
|
||||||
crate arm_usefulness: Vec<(MatchArm<'p, 'tcx>, Usefulness<'tcx>)>,
|
crate arm_usefulness: Vec<(MatchArm<'p, 'tcx>, Reachability)>,
|
||||||
/// If the match is exhaustive, this is empty. If not, this contains witnesses for the lack of
|
/// If the match is exhaustive, this is empty. If not, this contains witnesses for the lack of
|
||||||
/// exhaustiveness.
|
/// exhaustiveness.
|
||||||
crate non_exhaustiveness_witnesses: Vec<super::Pat<'tcx>>,
|
crate non_exhaustiveness_witnesses: Vec<super::Pat<'tcx>>,
|
||||||
|
@ -1055,7 +1063,12 @@ crate fn compute_match_usefulness<'p, 'tcx>(
|
||||||
if !arm.has_guard {
|
if !arm.has_guard {
|
||||||
matrix.push(v);
|
matrix.push(v);
|
||||||
}
|
}
|
||||||
(arm, usefulness)
|
let reachability = match usefulness {
|
||||||
|
Useful(spans) => Reachability::Reachable(spans),
|
||||||
|
NotUseful => Reachability::Unreachable,
|
||||||
|
UsefulWithWitness(..) => bug!(),
|
||||||
|
};
|
||||||
|
(arm, reachability)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue