diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs index 41152d9022..95ce36390d 100644 --- a/crates/hir-ty/src/display.rs +++ b/crates/hir-ty/src/display.rs @@ -680,10 +680,7 @@ fn render_const_scalar( memory_map: &MemoryMap, ty: &Ty, ) -> Result<(), HirDisplayError> { - // FIXME: We need to get krate from the final callers of the hir display - // infrastructure and have it here as a field on `f`. - let trait_env = - TraitEnvironment::empty(*f.db.crate_graph().crates_in_topological_order().last().unwrap()); + let trait_env = TraitEnvironment::empty(f.krate()); let ty = normalize(f.db, trait_env.clone(), ty.clone()); match ty.kind(Interner) { TyKind::Scalar(s) => match s { diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs index 964b1d7eb7..6b470d921f 100644 --- a/crates/ide/src/hover/tests.rs +++ b/crates/ide/src/hover/tests.rs @@ -10950,8 +10950,12 @@ pub struct ManuallyDrop$0 { #[test] fn projection_const() { + // This uses two crates, which have *no* relation between them, to test another thing: + // `render_const_scalar()` used to just use the last crate for the trait env, which will + // fail in this scenario. check( r#" +//- /foo.rs crate:foo pub trait PublicFlags { type Internal; } @@ -10967,12 +10971,13 @@ pub struct InternalBitFlags; impl PublicFlags for NoteDialects { type Internal = InternalBitFlags; } +//- /bar.rs crate:bar "#, expect![[r#" *CLAP* ```rust - ra_test_fixture::NoteDialects + foo::NoteDialects ``` ```rust