mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Provide Chalk well-known traits
This commit is contained in:
parent
e81c76a95a
commit
02c2beaa8c
2 changed files with 41 additions and 10 deletions
|
@ -73,8 +73,8 @@ pub struct LangItems {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LangItems {
|
impl LangItems {
|
||||||
pub fn target<'a>(&'a self, item: &str) -> Option<&'a LangItemTarget> {
|
pub fn target(&self, item: &str) -> Option<LangItemTarget> {
|
||||||
self.items.get(item)
|
self.items.get(item).copied()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Salsa query. This will look for lang items in a specific crate.
|
/// Salsa query. This will look for lang items in a specific crate.
|
||||||
|
@ -163,9 +163,13 @@ impl LangItems {
|
||||||
) where
|
) where
|
||||||
T: Into<AttrDefId> + Copy,
|
T: Into<AttrDefId> + Copy,
|
||||||
{
|
{
|
||||||
let attrs = db.attrs(item.into());
|
if let Some(lang_item_name) = lang_attr(db, item) {
|
||||||
if let Some(lang_item_name) = attrs.by_key("lang").string_value() {
|
|
||||||
self.items.entry(lang_item_name.clone()).or_insert_with(|| constructor(item));
|
self.items.entry(lang_item_name.clone()).or_insert_with(|| constructor(item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn lang_attr(db: &dyn DefDatabase, item: impl Into<AttrDefId> + Copy) -> Option<SmolStr> {
|
||||||
|
let attrs = db.attrs(item.into());
|
||||||
|
attrs.by_key("lang").string_value().cloned()
|
||||||
|
}
|
||||||
|
|
|
@ -9,8 +9,9 @@ use chalk_ir::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
type_ref::Mutability, AssocContainerId, AssocItemId, GenericDefId, HasModule, Lookup,
|
lang_item::{lang_attr, LangItemTarget},
|
||||||
TypeAliasId,
|
type_ref::Mutability,
|
||||||
|
AssocContainerId, AssocItemId, GenericDefId, HasModule, Lookup, TypeAliasId,
|
||||||
};
|
};
|
||||||
use ra_db::{
|
use ra_db::{
|
||||||
salsa::{InternId, InternKey},
|
salsa::{InternId, InternKey},
|
||||||
|
@ -26,6 +27,7 @@ use crate::{
|
||||||
utils::generics,
|
utils::generics,
|
||||||
ApplicationTy, DebruijnIndex, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor,
|
ApplicationTy, DebruijnIndex, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor,
|
||||||
};
|
};
|
||||||
|
use chalk_rust_ir::WellKnownTrait;
|
||||||
|
|
||||||
pub(super) mod tls;
|
pub(super) mod tls;
|
||||||
|
|
||||||
|
@ -1057,10 +1059,15 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
|
||||||
}
|
}
|
||||||
fn well_known_trait_id(
|
fn well_known_trait_id(
|
||||||
&self,
|
&self,
|
||||||
_well_known_trait: chalk_rust_ir::WellKnownTrait,
|
well_known_trait: chalk_rust_ir::WellKnownTrait,
|
||||||
) -> Option<chalk_ir::TraitId<Interner>> {
|
) -> Option<chalk_ir::TraitId<Interner>> {
|
||||||
// FIXME tell Chalk about well-known traits (here and in trait_datum)
|
let lang_attr = lang_attr_from_well_known_trait(well_known_trait);
|
||||||
None
|
let lang_items = self.db.crate_lang_items(self.krate);
|
||||||
|
let trait_ = match lang_items.target(lang_attr) {
|
||||||
|
Some(LangItemTarget::TraitId(trait_)) => trait_,
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
Some(trait_.to_chalk(self.db))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn program_clauses_for_env(
|
fn program_clauses_for_env(
|
||||||
|
@ -1162,7 +1169,8 @@ pub(crate) fn trait_datum_query(
|
||||||
let associated_ty_ids =
|
let associated_ty_ids =
|
||||||
trait_data.associated_types().map(|type_alias| type_alias.to_chalk(db)).collect();
|
trait_data.associated_types().map(|type_alias| type_alias.to_chalk(db)).collect();
|
||||||
let trait_datum_bound = chalk_rust_ir::TraitDatumBound { where_clauses };
|
let trait_datum_bound = chalk_rust_ir::TraitDatumBound { where_clauses };
|
||||||
let well_known = None; // FIXME set this (depending on lang items)
|
let well_known =
|
||||||
|
lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name));
|
||||||
let trait_datum = TraitDatum {
|
let trait_datum = TraitDatum {
|
||||||
id: trait_id,
|
id: trait_id,
|
||||||
binders: make_binders(trait_datum_bound, bound_vars.len()),
|
binders: make_binders(trait_datum_bound, bound_vars.len()),
|
||||||
|
@ -1173,6 +1181,25 @@ pub(crate) fn trait_datum_query(
|
||||||
Arc::new(trait_datum)
|
Arc::new(trait_datum)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn well_known_trait_from_lang_attr(name: &str) -> Option<WellKnownTrait> {
|
||||||
|
Some(match name {
|
||||||
|
"sized" => WellKnownTrait::SizedTrait,
|
||||||
|
"copy" => WellKnownTrait::CopyTrait,
|
||||||
|
"clone" => WellKnownTrait::CloneTrait,
|
||||||
|
"drop" => WellKnownTrait::DropTrait,
|
||||||
|
_ => return None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn lang_attr_from_well_known_trait(attr: WellKnownTrait) -> &'static str {
|
||||||
|
match attr {
|
||||||
|
WellKnownTrait::SizedTrait => "sized",
|
||||||
|
WellKnownTrait::CopyTrait => "copy",
|
||||||
|
WellKnownTrait::CloneTrait => "clone",
|
||||||
|
WellKnownTrait::DropTrait => "drop",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn struct_datum_query(
|
pub(crate) fn struct_datum_query(
|
||||||
db: &dyn HirDatabase,
|
db: &dyn HirDatabase,
|
||||||
krate: CrateId,
|
krate: CrateId,
|
||||||
|
|
Loading…
Reference in a new issue