mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 06:11:35 +00:00
Handle cycles in generic_defaults more gracefully
This commit is contained in:
parent
184a0d7c1e
commit
b384cfcb81
2 changed files with 22 additions and 0 deletions
|
@ -70,6 +70,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
||||||
fn trait_environment(&self, def: GenericDefId) -> Arc<crate::TraitEnvironment>;
|
fn trait_environment(&self, def: GenericDefId) -> Arc<crate::TraitEnvironment>;
|
||||||
|
|
||||||
#[salsa::invoke(crate::lower::generic_defaults_query)]
|
#[salsa::invoke(crate::lower::generic_defaults_query)]
|
||||||
|
#[salsa::cycle(crate::lower::generic_defaults_recover)]
|
||||||
fn generic_defaults(&self, def: GenericDefId) -> Arc<[Binders<Ty>]>;
|
fn generic_defaults(&self, def: GenericDefId) -> Arc<[Binders<Ty>]>;
|
||||||
|
|
||||||
#[salsa::invoke(InherentImpls::inherent_impls_in_crate_query)]
|
#[salsa::invoke(InherentImpls::inherent_impls_in_crate_query)]
|
||||||
|
|
|
@ -1089,6 +1089,27 @@ pub(crate) fn generic_defaults_query(
|
||||||
defaults
|
defaults
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn generic_defaults_recover(
|
||||||
|
db: &dyn HirDatabase,
|
||||||
|
_cycle: &[String],
|
||||||
|
def: &GenericDefId,
|
||||||
|
) -> Arc<[Binders<Ty>]> {
|
||||||
|
let generic_params = generics(db.upcast(), *def);
|
||||||
|
|
||||||
|
// we still need one default per parameter
|
||||||
|
let defaults = generic_params
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(idx, _)| {
|
||||||
|
let ty = TyKind::Error.intern(&Interner);
|
||||||
|
|
||||||
|
crate::make_only_type_binders(idx, ty)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
defaults
|
||||||
|
}
|
||||||
|
|
||||||
fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
|
fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
|
||||||
let data = db.function_data(def);
|
let data = db.function_data(def);
|
||||||
let resolver = def.resolver(db.upcast());
|
let resolver = def.resolver(db.upcast());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue