Skip to content

Commit da7693b

Browse files
authored
Merge pull request #21104 from Veykril/veykril/push-plqyyxsxvtyr
minor: Use `const_eval_static` query for statics
2 parents d597ef1 + e375181 commit da7693b

File tree

17 files changed

+171
-155
lines changed

17 files changed

+171
-155
lines changed

crates/base-db/src/input.rs

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,61 @@ pub struct Crate {
460460
pub env: Env,
461461
}
462462

463+
impl Crate {
464+
/// Returns an iterator over all transitive dependencies of the given crate,
465+
/// including the crate itself.
466+
///
467+
/// **Warning**: do not use this query in `hir-*` crates! It kills incrementality across crate metadata modifications.
468+
pub fn transitive_deps(self, db: &dyn salsa::Database) -> Box<[Crate]> {
469+
// There is a bit of duplication here and in `CrateGraphBuilder` in the same method, but it's not terrible
470+
// and removing that is a bit difficult.
471+
let mut worklist = vec![self];
472+
let mut deps_seen = FxHashSet::default();
473+
let mut deps = Vec::new();
474+
475+
while let Some(krate) = worklist.pop() {
476+
if !deps_seen.insert(krate) {
477+
continue;
478+
}
479+
deps.push(krate);
480+
481+
worklist.extend(krate.data(db).dependencies.iter().map(|dep| dep.crate_id));
482+
}
483+
deps.into_boxed_slice()
484+
}
485+
486+
/// Returns all transitive reverse dependencies of the given crate,
487+
/// including the crate itself.
488+
///
489+
/// **Warning**: do not use this query in `hir-*` crates! It kills incrementality across crate metadata modifications.
490+
pub fn transitive_rev_deps(self, db: &dyn RootQueryDb) -> Box<[Crate]> {
491+
let mut worklist = vec![self];
492+
let mut rev_deps = FxHashSet::default();
493+
rev_deps.insert(self);
494+
495+
let mut inverted_graph = FxHashMap::<_, Vec<_>>::default();
496+
db.all_crates().iter().for_each(|&krate| {
497+
krate
498+
.data(db)
499+
.dependencies
500+
.iter()
501+
.for_each(|dep| inverted_graph.entry(dep.crate_id).or_default().push(krate))
502+
});
503+
504+
while let Some(krate) = worklist.pop() {
505+
if let Some(crate_rev_deps) = inverted_graph.get(&krate) {
506+
crate_rev_deps
507+
.iter()
508+
.copied()
509+
.filter(|&rev_dep| rev_deps.insert(rev_dep))
510+
.for_each(|rev_dep| worklist.push(rev_dep));
511+
}
512+
}
513+
514+
rev_deps.into_iter().collect::<Box<_>>()
515+
}
516+
}
517+
463518
/// The mapping from [`UniqueCrateData`] to their [`Crate`] input.
464519
#[derive(Debug, Default)]
465520
pub struct CratesMap(DashMap<UniqueCrateData, Crate, BuildHasherDefault<FxHasher>>);
@@ -802,33 +857,6 @@ impl CrateGraphBuilder {
802857
}
803858
}
804859

805-
pub(crate) fn transitive_rev_deps(db: &dyn RootQueryDb, of: Crate) -> FxHashSet<Crate> {
806-
let mut worklist = vec![of];
807-
let mut rev_deps = FxHashSet::default();
808-
rev_deps.insert(of);
809-
810-
let mut inverted_graph = FxHashMap::<_, Vec<_>>::default();
811-
db.all_crates().iter().for_each(|&krate| {
812-
krate
813-
.data(db)
814-
.dependencies
815-
.iter()
816-
.for_each(|dep| inverted_graph.entry(dep.crate_id).or_default().push(krate))
817-
});
818-
819-
while let Some(krate) = worklist.pop() {
820-
if let Some(crate_rev_deps) = inverted_graph.get(&krate) {
821-
crate_rev_deps
822-
.iter()
823-
.copied()
824-
.filter(|&rev_dep| rev_deps.insert(rev_dep))
825-
.for_each(|rev_dep| worklist.push(rev_dep));
826-
}
827-
}
828-
829-
rev_deps
830-
}
831-
832860
impl BuiltCrateData {
833861
pub fn root_file_id(&self, db: &dyn salsa::Database) -> EditionedFileId {
834862
EditionedFileId::new(db, self.root_file_id, self.edition)

crates/base-db/src/lib.rs

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub use crate::{
2626
};
2727
use dashmap::{DashMap, mapref::entry::Entry};
2828
pub use query_group::{self};
29-
use rustc_hash::{FxHashSet, FxHasher};
29+
use rustc_hash::FxHasher;
3030
use salsa::{Durability, Setter};
3131
pub use semver::{BuildMetadata, Prerelease, Version, VersionReq};
3232
use span::Edition;
@@ -256,38 +256,6 @@ pub trait RootQueryDb: SourceDatabase + salsa::Database {
256256
/// **Warning**: do not use this query in `hir-*` crates! It kills incrementality across crate metadata modifications.
257257
#[salsa::input]
258258
fn all_crates(&self) -> Arc<Box<[Crate]>>;
259-
260-
/// Returns an iterator over all transitive dependencies of the given crate,
261-
/// including the crate itself.
262-
///
263-
/// **Warning**: do not use this query in `hir-*` crates! It kills incrementality across crate metadata modifications.
264-
#[salsa::transparent]
265-
fn transitive_deps(&self, crate_id: Crate) -> FxHashSet<Crate>;
266-
267-
/// Returns all transitive reverse dependencies of the given crate,
268-
/// including the crate itself.
269-
///
270-
/// **Warning**: do not use this query in `hir-*` crates! It kills incrementality across crate metadata modifications.
271-
#[salsa::invoke(input::transitive_rev_deps)]
272-
#[salsa::transparent]
273-
fn transitive_rev_deps(&self, of: Crate) -> FxHashSet<Crate>;
274-
}
275-
276-
fn transitive_deps(db: &dyn SourceDatabase, crate_id: Crate) -> FxHashSet<Crate> {
277-
// There is a bit of duplication here and in `CrateGraphBuilder` in the same method, but it's not terrible
278-
// and removing that is a bit difficult.
279-
let mut worklist = vec![crate_id];
280-
let mut deps = FxHashSet::default();
281-
282-
while let Some(krate) = worklist.pop() {
283-
if !deps.insert(krate) {
284-
continue;
285-
}
286-
287-
worklist.extend(krate.data(db).dependencies.iter().map(|dep| dep.crate_id));
288-
}
289-
290-
deps
291259
}
292260

293261
#[salsa_macros::db]

crates/hir-def/src/db.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,10 +273,9 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
273273

274274
// endregion:visibilities
275275

276-
#[salsa::invoke(crate::lang_item::notable_traits_in_deps)]
277-
fn notable_traits_in_deps(&self, krate: Crate) -> Arc<[Arc<[TraitId]>]>;
278276
#[salsa::invoke(crate::lang_item::crate_notable_traits)]
279-
fn crate_notable_traits(&self, krate: Crate) -> Option<Arc<[TraitId]>>;
277+
#[salsa::transparent]
278+
fn crate_notable_traits(&self, krate: Crate) -> Option<&[TraitId]>;
280279

281280
#[salsa::invoke(crate_supports_no_std)]
282281
fn crate_supports_no_std(&self, crate_id: Crate) -> bool;

crates/hir-def/src/lang_item.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use hir_expand::name::Name;
66
use intern::{Symbol, sym};
77
use rustc_hash::FxHashMap;
8-
use triomphe::Arc;
98

109
use crate::{
1110
AdtId, AssocItemId, AttrDefId, Crate, EnumId, EnumVariantId, FunctionId, ImplId, ModuleDefId,
@@ -223,16 +222,8 @@ pub(crate) fn lang_attr(db: &dyn DefDatabase, item: AttrDefId) -> Option<LangIte
223222
db.attrs(item).lang_item()
224223
}
225224

226-
pub(crate) fn notable_traits_in_deps(db: &dyn DefDatabase, krate: Crate) -> Arc<[Arc<[TraitId]>]> {
227-
let _p = tracing::info_span!("notable_traits_in_deps", ?krate).entered();
228-
Arc::from_iter(
229-
db.transitive_deps(krate).into_iter().filter_map(|krate| db.crate_notable_traits(krate)),
230-
)
231-
}
232-
233-
pub(crate) fn crate_notable_traits(db: &dyn DefDatabase, krate: Crate) -> Option<Arc<[TraitId]>> {
234-
let _p = tracing::info_span!("crate_notable_traits", ?krate).entered();
235-
225+
#[salsa::tracked(returns(as_deref))]
226+
pub(crate) fn crate_notable_traits(db: &dyn DefDatabase, krate: Crate) -> Option<Box<[TraitId]>> {
236227
let mut traits = Vec::new();
237228

238229
let crate_def_map = crate_def_map(db, krate);

crates/hir-ty/src/consteval.rs

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod tests;
55

66
use base_db::Crate;
77
use hir_def::{
8-
EnumVariantId, GeneralConstId, HasModule, StaticId,
8+
ConstId, EnumVariantId, StaticId,
99
expr_store::Body,
1010
hir::{Expr, ExprId},
1111
type_ref::LiteralConstRef,
@@ -139,16 +139,18 @@ pub fn try_const_usize<'db>(db: &'db dyn HirDatabase, c: Const<'db>) -> Option<u
139139
ConstKind::Infer(_) => None,
140140
ConstKind::Bound(_, _) => None,
141141
ConstKind::Placeholder(_) => None,
142-
ConstKind::Unevaluated(unevaluated_const) => {
143-
let c = match unevaluated_const.def {
144-
SolverDefId::ConstId(id) => GeneralConstId::ConstId(id),
145-
SolverDefId::StaticId(id) => GeneralConstId::StaticId(id),
146-
_ => unreachable!(),
147-
};
148-
let subst = unevaluated_const.args;
149-
let ec = db.const_eval(c, subst, None).ok()?;
150-
try_const_usize(db, ec)
151-
}
142+
ConstKind::Unevaluated(unevaluated_const) => match unevaluated_const.def {
143+
SolverDefId::ConstId(id) => {
144+
let subst = unevaluated_const.args;
145+
let ec = db.const_eval(id, subst, None).ok()?;
146+
try_const_usize(db, ec)
147+
}
148+
SolverDefId::StaticId(id) => {
149+
let ec = db.const_eval_static(id).ok()?;
150+
try_const_usize(db, ec)
151+
}
152+
_ => unreachable!(),
153+
},
152154
ConstKind::Value(val) => Some(u128::from_le_bytes(pad16(&val.value.inner().memory, false))),
153155
ConstKind::Error(_) => None,
154156
ConstKind::Expr(_) => None,
@@ -161,16 +163,18 @@ pub fn try_const_isize<'db>(db: &'db dyn HirDatabase, c: &Const<'db>) -> Option<
161163
ConstKind::Infer(_) => None,
162164
ConstKind::Bound(_, _) => None,
163165
ConstKind::Placeholder(_) => None,
164-
ConstKind::Unevaluated(unevaluated_const) => {
165-
let c = match unevaluated_const.def {
166-
SolverDefId::ConstId(id) => GeneralConstId::ConstId(id),
167-
SolverDefId::StaticId(id) => GeneralConstId::StaticId(id),
168-
_ => unreachable!(),
169-
};
170-
let subst = unevaluated_const.args;
171-
let ec = db.const_eval(c, subst, None).ok()?;
172-
try_const_isize(db, &ec)
173-
}
166+
ConstKind::Unevaluated(unevaluated_const) => match unevaluated_const.def {
167+
SolverDefId::ConstId(id) => {
168+
let subst = unevaluated_const.args;
169+
let ec = db.const_eval(id, subst, None).ok()?;
170+
try_const_isize(db, &ec)
171+
}
172+
SolverDefId::StaticId(id) => {
173+
let ec = db.const_eval_static(id).ok()?;
174+
try_const_isize(db, &ec)
175+
}
176+
_ => unreachable!(),
177+
},
174178
ConstKind::Value(val) => Some(i128::from_le_bytes(pad16(&val.value.inner().memory, true))),
175179
ConstKind::Error(_) => None,
176180
ConstKind::Expr(_) => None,
@@ -254,7 +258,7 @@ pub(crate) fn eval_to_const<'db>(expr: ExprId, ctx: &mut InferenceContext<'_, 'd
254258

255259
pub(crate) fn const_eval_cycle_result<'db>(
256260
_: &'db dyn HirDatabase,
257-
_: GeneralConstId,
261+
_: ConstId,
258262
_: GenericArgs<'db>,
259263
_: Option<Arc<TraitEnvironment<'db>>>,
260264
) -> Result<Const<'db>, ConstEvalError<'db>> {
@@ -277,19 +281,11 @@ pub(crate) fn const_eval_discriminant_cycle_result<'db>(
277281

278282
pub(crate) fn const_eval_query<'db>(
279283
db: &'db dyn HirDatabase,
280-
def: GeneralConstId,
284+
def: ConstId,
281285
subst: GenericArgs<'db>,
282286
trait_env: Option<Arc<TraitEnvironment<'db>>>,
283287
) -> Result<Const<'db>, ConstEvalError<'db>> {
284-
let body = match def {
285-
GeneralConstId::ConstId(c) => {
286-
db.monomorphized_mir_body(c.into(), subst, db.trait_environment(c.into()))?
287-
}
288-
GeneralConstId::StaticId(s) => {
289-
let krate = s.module(db).krate();
290-
db.monomorphized_mir_body(s.into(), subst, TraitEnvironment::empty(krate))?
291-
}
292-
};
288+
let body = db.monomorphized_mir_body(def.into(), subst, db.trait_environment(def.into()))?;
293289
let c = interpret_mir(db, body, false, trait_env)?.0?;
294290
Ok(c)
295291
}

crates/hir-ty/src/consteval/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fn eval_goal(db: &TestDB, file_id: EditionedFileId) -> Result<Const<'_>, ConstEv
142142
_ => None,
143143
})
144144
.expect("No const named GOAL found in the test");
145-
db.const_eval(const_id.into(), GenericArgs::new_from_iter(interner, []), None)
145+
db.const_eval(const_id, GenericArgs::new_from_iter(interner, []), None)
146146
}
147147

148148
#[test]

crates/hir-ty/src/db.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
44
use base_db::{Crate, target::TargetLoadError};
55
use hir_def::{
6-
AdtId, CallableDefId, ConstParamId, DefWithBodyId, EnumVariantId, FunctionId, GeneralConstId,
7-
GenericDefId, ImplId, LifetimeParamId, LocalFieldId, StaticId, TraitId, TypeAliasId,
8-
TypeOrConstParamId, VariantId, db::DefDatabase, hir::ExprId, layout::TargetDataLayout,
6+
AdtId, CallableDefId, ConstId, ConstParamId, DefWithBodyId, EnumVariantId, FunctionId,
7+
GenericDefId, ImplId, LifetimeParamId, LocalFieldId, StaticId, TraitId, TypeAliasId, VariantId,
8+
db::DefDatabase, hir::ExprId, layout::TargetDataLayout,
99
};
1010
use la_arena::ArenaMap;
1111
use salsa::plumbing::AsId;
@@ -29,6 +29,8 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
2929

3030
// region:mir
3131

32+
// FXME: Collapse `mir_body_for_closure` into `mir_body`
33+
// and `monomorphized_mir_body_for_closure` into `monomorphized_mir_body`
3234
#[salsa::invoke(crate::mir::mir_body_query)]
3335
#[salsa::cycle(cycle_result = crate::mir::mir_body_cycle_result)]
3436
fn mir_body<'db>(
@@ -70,7 +72,7 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
7072
#[salsa::cycle(cycle_result = crate::consteval::const_eval_cycle_result)]
7173
fn const_eval<'db>(
7274
&'db self,
73-
def: GeneralConstId,
75+
def: ConstId,
7476
subst: GenericArgs<'db>,
7577
trait_env: Option<Arc<TraitEnvironment<'db>>>,
7678
) -> Result<Const<'db>, ConstEvalError<'db>>;
@@ -232,13 +234,6 @@ fn hir_database_is_dyn_compatible() {
232234
fn _assert_dyn_compatible(_: &dyn HirDatabase) {}
233235
}
234236

235-
#[salsa_macros::interned(no_lifetime, debug, revisions = usize::MAX)]
236-
#[derive(PartialOrd, Ord)]
237-
pub struct InternedTypeOrConstParamId {
238-
/// This stores the param and its index.
239-
pub loc: (TypeOrConstParamId, u32),
240-
}
241-
242237
#[salsa_macros::interned(no_lifetime, debug, revisions = usize::MAX)]
243238
#[derive(PartialOrd, Ord)]
244239
pub struct InternedLifetimeParamId {

crates/hir-ty/src/drop.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ fn has_destructor(db: &dyn HirDatabase, adt: AdtId) -> bool {
2828
};
2929
let impls = match module.containing_block() {
3030
Some(block) => match TraitImpls::for_block(db, block) {
31-
Some(it) => it,
31+
Some(it) => &**it,
3232
None => return false,
3333
},
34-
None => &**TraitImpls::for_crate(db, module.krate()),
34+
None => TraitImpls::for_crate(db, module.krate()),
3535
};
3636
!impls.for_trait_and_self_ty(drop_trait, &SimplifiedType::Adt(adt.into())).is_empty()
3737
}

crates/hir-ty/src/method_resolution.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ impl TraitImpls {
687687

688688
#[salsa::tracked(returns(ref))]
689689
pub fn for_crate_and_deps(db: &dyn HirDatabase, krate: Crate) -> Box<[Arc<Self>]> {
690-
db.transitive_deps(krate).iter().map(|&dep| Self::for_crate(db, dep).clone()).collect()
690+
krate.transitive_deps(db).iter().map(|&dep| Self::for_crate(db, dep).clone()).collect()
691691
}
692692
}
693693

0 commit comments

Comments
 (0)