Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/traits.rs')
-rw-r--r--crates/hir-ty/src/traits.rs63
1 files changed, 30 insertions, 33 deletions
diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs
index 8cb7dbf60f..a5c195d408 100644
--- a/crates/hir-ty/src/traits.rs
+++ b/crates/hir-ty/src/traits.rs
@@ -3,14 +3,14 @@
use core::fmt;
use std::env::var;
-use chalk_ir::{fold::TypeFoldable, DebruijnIndex, GoalData};
+use chalk_ir::{DebruijnIndex, GoalData, fold::TypeFoldable};
use chalk_recursive::Cache;
-use chalk_solve::{logging_db::LoggingRustIrDatabase, rust_ir, Solver};
+use chalk_solve::{Solver, logging_db::LoggingRustIrDatabase, rust_ir};
-use base_db::CrateId;
+use base_db::Crate;
use hir_def::{
- lang_item::{LangItem, LangItemTarget},
BlockId, TraitId,
+ lang_item::{LangItem, LangItemTarget},
};
use hir_expand::name::Name;
use intern::sym;
@@ -19,9 +19,9 @@ use stdx::{never, panic_context};
use triomphe::Arc;
use crate::{
- db::HirDatabase, infer::unify::InferenceTable, utils::UnevaluatedConstEvaluatorFolder, AliasEq,
- AliasTy, Canonical, DomainGoal, Goal, Guidance, InEnvironment, Interner, ProjectionTy,
- ProjectionTyExt, Solution, TraitRefExt, Ty, TyKind, TypeFlags, WhereClause,
+ AliasEq, AliasTy, Canonical, DomainGoal, Goal, Guidance, InEnvironment, Interner, ProjectionTy,
+ ProjectionTyExt, Solution, TraitRefExt, Ty, TyKind, TypeFlags, WhereClause, db::HirDatabase,
+ infer::unify::InferenceTable, utils::UnevaluatedConstEvaluatorFolder,
};
/// This controls how much 'time' we give the Chalk solver before giving up.
@@ -30,7 +30,7 @@ const CHALK_SOLVER_FUEL: i32 = 1000;
#[derive(Debug, Copy, Clone)]
pub(crate) struct ChalkContext<'a> {
pub(crate) db: &'a dyn HirDatabase,
- pub(crate) krate: CrateId,
+ pub(crate) krate: Crate,
pub(crate) block: Option<BlockId>,
}
@@ -48,7 +48,7 @@ fn create_chalk_solver() -> chalk_recursive::RecursiveSolver<Interner> {
/// we assume that `T: Default`.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TraitEnvironment {
- pub krate: CrateId,
+ pub krate: Crate,
pub block: Option<BlockId>,
// FIXME make this a BTreeMap
traits_from_clauses: Box<[(Ty, TraitId)]>,
@@ -56,7 +56,7 @@ pub struct TraitEnvironment {
}
impl TraitEnvironment {
- pub fn empty(krate: CrateId) -> Arc<Self> {
+ pub fn empty(krate: Crate) -> Arc<Self> {
Arc::new(TraitEnvironment {
krate,
block: None,
@@ -66,7 +66,7 @@ impl TraitEnvironment {
}
pub fn new(
- krate: CrateId,
+ krate: Crate,
block: Option<BlockId>,
traits_from_clauses: Box<[(Ty, TraitId)]>,
env: chalk_ir::Environment<Interner>,
@@ -109,19 +109,20 @@ pub(crate) fn normalize_projection_query(
/// Solve a trait goal using Chalk.
pub(crate) fn trait_solve_query(
db: &dyn HirDatabase,
- krate: CrateId,
+ krate: Crate,
block: Option<BlockId>,
goal: Canonical<InEnvironment<Goal>>,
) -> Option<Solution> {
- let detail = match &goal.value.goal.data(Interner) {
- GoalData::DomainGoal(DomainGoal::Holds(WhereClause::Implemented(it))) => {
- db.trait_data(it.hir_trait_id()).name.display(db.upcast(), Edition::LATEST).to_string()
- }
+ let _p = tracing::info_span!("trait_solve_query", detail = ?match &goal.value.goal.data(Interner) {
+ GoalData::DomainGoal(DomainGoal::Holds(WhereClause::Implemented(it))) => db
+ .trait_signature(it.hir_trait_id())
+ .name
+ .display(db, Edition::LATEST)
+ .to_string(),
GoalData::DomainGoal(DomainGoal::Holds(WhereClause::AliasEq(_))) => "alias_eq".to_owned(),
_ => "??".to_owned(),
- };
- let _p = tracing::info_span!("trait_solve_query", ?detail).entered();
- tracing::info!("trait_solve_query({:?})", goal.value.goal);
+ })
+ .entered();
if let GoalData::DomainGoal(DomainGoal::Holds(WhereClause::AliasEq(AliasEq {
alias: AliasTy::Projection(projection_ty),
@@ -148,7 +149,7 @@ pub(crate) fn trait_solve_query(
fn solve(
db: &dyn HirDatabase,
- krate: CrateId,
+ krate: Crate,
block: Option<BlockId>,
goal: &chalk_ir::UCanonical<chalk_ir::InEnvironment<chalk_ir::Goal<Interner>>>,
) -> Option<chalk_solve::Solution<Interner>> {
@@ -160,7 +161,7 @@ fn solve(
let fuel = std::cell::Cell::new(CHALK_SOLVER_FUEL);
let should_continue = || {
- db.unwind_if_cancelled();
+ db.unwind_if_revision_cancelled();
let remaining = fuel.get();
fuel.set(remaining - 1);
if remaining == 0 {
@@ -190,11 +191,7 @@ fn solve(
// don't set the TLS for Chalk unless Chalk debugging is active, to make
// extra sure we only use it for debugging
- if is_chalk_debug() {
- crate::tls::set_current_program(db, solve)
- } else {
- solve()
- }
+ if is_chalk_debug() { crate::tls::set_current_program(db, solve) } else { solve() }
}
struct LoggingRustIrDatabaseLoggingOnDrop<'a>(LoggingRustIrDatabase<Interner, ChalkContext<'a>>);
@@ -285,16 +282,16 @@ impl FnTrait {
pub fn method_name(self) -> Name {
match self {
- FnTrait::FnOnce => Name::new_symbol_root(sym::call_once.clone()),
- FnTrait::FnMut => Name::new_symbol_root(sym::call_mut.clone()),
- FnTrait::Fn => Name::new_symbol_root(sym::call.clone()),
- FnTrait::AsyncFnOnce => Name::new_symbol_root(sym::async_call_once.clone()),
- FnTrait::AsyncFnMut => Name::new_symbol_root(sym::async_call_mut.clone()),
- FnTrait::AsyncFn => Name::new_symbol_root(sym::async_call.clone()),
+ FnTrait::FnOnce => Name::new_symbol_root(sym::call_once),
+ FnTrait::FnMut => Name::new_symbol_root(sym::call_mut),
+ FnTrait::Fn => Name::new_symbol_root(sym::call),
+ FnTrait::AsyncFnOnce => Name::new_symbol_root(sym::async_call_once),
+ FnTrait::AsyncFnMut => Name::new_symbol_root(sym::async_call_mut),
+ FnTrait::AsyncFn => Name::new_symbol_root(sym::async_call),
}
}
- pub fn get_id(self, db: &dyn HirDatabase, krate: CrateId) -> Option<TraitId> {
+ pub fn get_id(self, db: &dyn HirDatabase, krate: Crate) -> Option<TraitId> {
let target = db.lang_item(krate, self.lang_item())?;
match target {
LangItemTarget::Trait(t) => Some(t),