Skip to content

Commit

Permalink
Fix impl trait params not being counted properly
Browse files Browse the repository at this point in the history
  • Loading branch information
Veykril committed May 2, 2024
1 parent 8241d8a commit c97ac34
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
19 changes: 17 additions & 2 deletions crates/hir-ty/src/lower.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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,
Expand Down Expand Up @@ -1397,6 +1401,17 @@ pub fn associated_type_shorthand_candidates<R>(
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<R>(
db: &dyn HirDatabase,
// If the type parameter is defined in an impl and we're in a method, there
Expand Down
7 changes: 5 additions & 2 deletions crates/hir-ty/src/tests/regression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1980,16 +1980,19 @@ 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;
}
pub trait ItemTreeLoc {
type Id;
}
fn id_to_generics(id: impl Lookup<Data = impl ItemTreeLoc<Id = ()>>)
fn id_to_generics(id: impl Lookup<Data = impl ItemTreeLoc<Id = ()>>,
//^^ impl Lookup<Data = impl ItemTreeLoc<Id = ()>>
enabled_params: impl Fn(),
//^^^^^^^^^^^^^^ impl Fn()
)
where
(): Sized,
{}
Expand Down
11 changes: 11 additions & 0 deletions crates/rust-analyzer/src/cli/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit c97ac34

Please sign in to comment.