diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs b/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs index 04e2ded05a5..f1315f6c814 100644 --- a/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs +++ b/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs @@ -345,7 +345,9 @@ impl<'a> TyLoweringContext<'a> { } ImplTraitLoweringState::Param(counter) => { let idx = counter.get(); - counter.set(idx + 1); + // Count the number of `impl Trait` things that appear within our bounds. + // Since t hose have been emitted as implicit type args already. + counter.set(idx + count_impl_traits(type_ref) as u16); let kind = self .generics() .expect("param impl trait lowering must be in a generic def") @@ -367,7 +369,9 @@ impl<'a> TyLoweringContext<'a> { } ImplTraitLoweringState::Variable(counter) => { let idx = counter.get(); - counter.set(idx + 1); + // Count the number of `impl Trait` things that appear within our bounds. + // Since t hose have been emitted as implicit type args already. + counter.set(idx + count_impl_traits(type_ref) as u16); let ( _parent_params, self_params, @@ -1397,6 +1401,17 @@ pub fn associated_type_shorthand_candidates( named_associated_type_shorthand_candidates(db, def, res, None, |name, _, id| cb(name, id)) } +// FIXME: This does not handle macros! +fn count_impl_traits(type_ref: &TypeRef) -> usize { + let mut count = 0; + type_ref.walk(&mut |type_ref| { + if matches!(type_ref, TypeRef::ImplTrait(_)) { + count += 1; + } + }); + count +} + fn named_associated_type_shorthand_candidates( db: &dyn HirDatabase, // If the type parameter is defined in an impl and we're in a method, there diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs index f80d5394985..3aa94be755c 100644 --- a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs +++ b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs @@ -1980,7 +1980,7 @@ impl<#[cfg(feature = "a-feature")] A> Bar for (){} fn nested_anon_generics_and_where_bounds_17173() { check_types( r#" -//- minicore: sized +//- minicore: sized, fn pub trait Lookup { type Data; fn lookup(&self) -> Self::Data; @@ -1988,8 +1988,11 @@ pub trait Lookup { pub trait ItemTreeLoc { type Id; } -fn id_to_generics(id: impl Lookup>) +fn id_to_generics(id: impl Lookup>, //^^ impl Lookup> + enabled_params: impl Fn(), + //^^^^^^^^^^^^^^ impl Fn() + ) where (): Sized, {} diff --git a/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs b/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs index 79d6226debf..d5eac49ad3a 100644 --- a/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs +++ b/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs @@ -13,6 +13,17 @@ use crate::cli::flags; impl flags::Diagnostics { pub fn run(self) -> anyhow::Result<()> { + const STACK_SIZE: usize = 1024 * 1024 * 8; + + let handle = stdx::thread::Builder::new(stdx::thread::ThreadIntent::LatencySensitive) + .name("BIG_STACK_THREAD".into()) + .stack_size(STACK_SIZE) + .spawn(|| self.run_()) + .unwrap(); + + handle.join() + } + fn run_(self) -> anyhow::Result<()> { let cargo_config = CargoConfig { sysroot: Some(RustLibSource::Discover), ..Default::default() }; let with_proc_macro_server = if let Some(p) = &self.proc_macro_srv {