Merge pull request #19570 from ChayimFriedman2/fix-store-panic

fix: Fix an incorrect `ExpressionStore` that was passed
This commit is contained in:
Chayim Refael Friedman 2025-04-10 21:46:18 +00:00 committed by GitHub
commit 96925d5105
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 6 deletions

View File

@ -39,21 +39,21 @@ impl HirDisplay for Function {
// Write container (trait or impl) // Write container (trait or impl)
let container_params = match container { let container_params = match container {
Some(AssocItemContainer::Trait(trait_)) => { Some(AssocItemContainer::Trait(trait_)) => {
let params = f.db.generic_params(trait_.id.into()); let (params, params_store) = f.db.generic_params_and_store(trait_.id.into());
if f.show_container_bounds() && !params.is_empty() { if f.show_container_bounds() && !params.is_empty() {
write_trait_header(&trait_, f)?; write_trait_header(&trait_, f)?;
f.write_char('\n')?; f.write_char('\n')?;
has_disaplayable_predicates(&params).then_some(params) has_disaplayable_predicates(&params).then_some((params, params_store))
} else { } else {
None None
} }
} }
Some(AssocItemContainer::Impl(impl_)) => { Some(AssocItemContainer::Impl(impl_)) => {
let params = f.db.generic_params(impl_.id.into()); let (params, params_store) = f.db.generic_params_and_store(impl_.id.into());
if f.show_container_bounds() && !params.is_empty() { if f.show_container_bounds() && !params.is_empty() {
write_impl_header(&impl_, f)?; write_impl_header(&impl_, f)?;
f.write_char('\n')?; f.write_char('\n')?;
has_disaplayable_predicates(&params).then_some(params) has_disaplayable_predicates(&params).then_some((params, params_store))
} else { } else {
None None
} }
@ -169,7 +169,7 @@ impl HirDisplay for Function {
// Write where clauses // Write where clauses
let has_written_where = write_where_clause(GenericDefId::FunctionId(self.id), f)?; let has_written_where = write_where_clause(GenericDefId::FunctionId(self.id), f)?;
if let Some(container_params) = container_params { if let Some((container_params, container_params_store)) = container_params {
if !has_written_where { if !has_written_where {
f.write_str("\nwhere")?; f.write_str("\nwhere")?;
} }
@ -178,7 +178,7 @@ impl HirDisplay for Function {
AssocItemContainer::Impl(_) => "impl", AssocItemContainer::Impl(_) => "impl",
}; };
write!(f, "\n // Bounds from {container_name}:",)?; write!(f, "\n // Bounds from {container_name}:",)?;
write_where_predicates(&container_params, &data.store, f)?; write_where_predicates(&container_params, &container_params_store, f)?;
} }
Ok(()) Ok(())
} }

View File

@ -10724,3 +10724,41 @@ impl PublicFlags for NoteDialects {
"#]], "#]],
); );
} }
#[test]
fn bounds_from_container_do_not_panic() {
check(
r#"
//- minicore: copy
struct Foo<T>(T);
impl<T: Copy> Foo<T> {
fn foo<U: Copy>(&self, _u: U) {}
}
fn bar(v: &Foo<i32>) {
v.$0foo(1u32);
}
"#,
expect![[r#"
*foo*
```rust
ra_test_fixture::Foo
```
```rust
impl<T> Foo<T>
fn foo<U>(&self, _u: U)
where
U: Copy,
// Bounds from impl:
T: Copy,
```
---
`T` = `i32`, `U` = `u32`
"#]],
);
}