improve diagnosts for GATs
This commit is contained in:
parent
fe62c6e295
commit
e4d9bc66f6
113 changed files with 1625 additions and 890 deletions
|
@ -49,6 +49,20 @@ pub enum Region {
|
|||
Free(DefId, /* lifetime decl */ DefId),
|
||||
}
|
||||
|
||||
/// This is used in diagnostics to improve suggestions for missing generic arguments.
|
||||
/// It gives information on the type of lifetimes that are in scope for a particular `PathSegment`,
|
||||
/// so that we can e.g. suggest elided-lifetimes-in-paths of the form <'_, '_> e.g.
|
||||
#[derive(Clone, PartialEq, Eq, Hash, TyEncodable, TyDecodable, Debug, HashStable)]
|
||||
pub enum LifetimeScopeForPath {
|
||||
// Contains all lifetime names that are in scope and could possibly be used in generics
|
||||
// arguments of path.
|
||||
NonElided(Vec<String>),
|
||||
|
||||
// Information that allows us to suggest args of the form `<'_>` in case
|
||||
// no generic arguments were provided for a path.
|
||||
Elided,
|
||||
}
|
||||
|
||||
/// A set containing, at most, one known element.
|
||||
/// If two distinct values are inserted into a set, then it
|
||||
/// becomes `Many`, which can be used to detect ambiguities.
|
||||
|
|
|
@ -1301,6 +1301,10 @@ rustc_queries! {
|
|||
desc { "looking up late bound vars" }
|
||||
}
|
||||
|
||||
query lifetime_scope_map(_: LocalDefId) -> Option<FxHashMap<ItemLocalId, LifetimeScopeForPath>> {
|
||||
desc { "finds the lifetime scope for an HirId of a PathSegment" }
|
||||
}
|
||||
|
||||
query visibility(def_id: DefId) -> ty::Visibility {
|
||||
eval_always
|
||||
desc { |tcx| "computing visibility of `{}`", tcx.def_path_str(def_id) }
|
||||
|
|
|
@ -9,7 +9,7 @@ use crate::infer::canonical::{Canonical, CanonicalVarInfo, CanonicalVarInfos};
|
|||
use crate::lint::{struct_lint_level, LintDiagnosticBuilder, LintLevelSource};
|
||||
use crate::middle;
|
||||
use crate::middle::cstore::{CrateStoreDyn, EncodedMetadata};
|
||||
use crate::middle::resolve_lifetime::{self, ObjectLifetimeDefault};
|
||||
use crate::middle::resolve_lifetime::{self, LifetimeScopeForPath, ObjectLifetimeDefault};
|
||||
use crate::middle::stability;
|
||||
use crate::mir::interpret::{self, Allocation, ConstValue, Scalar};
|
||||
use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted};
|
||||
|
@ -2686,6 +2686,10 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
.iter(),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn lifetime_scope(self, id: HirId) -> Option<LifetimeScopeForPath> {
|
||||
self.lifetime_scope_map(id.owner).and_then(|mut map| map.remove(&id.local_id))
|
||||
}
|
||||
}
|
||||
|
||||
impl TyCtxtAt<'tcx> {
|
||||
|
|
|
@ -9,7 +9,9 @@ use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel};
|
|||
use crate::middle::lib_features::LibFeatures;
|
||||
use crate::middle::privacy::AccessLevels;
|
||||
use crate::middle::region;
|
||||
use crate::middle::resolve_lifetime::{ObjectLifetimeDefault, Region, ResolveLifetimes};
|
||||
use crate::middle::resolve_lifetime::{
|
||||
LifetimeScopeForPath, ObjectLifetimeDefault, Region, ResolveLifetimes,
|
||||
};
|
||||
use crate::middle::stability::{self, DeprecationEntry};
|
||||
use crate::mir;
|
||||
use crate::mir::interpret::GlobalId;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue