Skip to content

Commit 02c2bea

Browse files
committed
Provide Chalk well-known traits
1 parent e81c76a commit 02c2bea

File tree

2 files changed

+41
-10
lines changed

2 files changed

+41
-10
lines changed

crates/ra_hir_def/src/lang_item.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ pub struct LangItems {
7373
}
7474

7575
impl LangItems {
76-
pub fn target<'a>(&'a self, item: &str) -> Option<&'a LangItemTarget> {
77-
self.items.get(item)
76+
pub fn target(&self, item: &str) -> Option<LangItemTarget> {
77+
self.items.get(item).copied()
7878
}
7979

8080
/// Salsa query. This will look for lang items in a specific crate.
@@ -163,9 +163,13 @@ impl LangItems {
163163
) where
164164
T: Into<AttrDefId> + Copy,
165165
{
166-
let attrs = db.attrs(item.into());
167-
if let Some(lang_item_name) = attrs.by_key("lang").string_value() {
166+
if let Some(lang_item_name) = lang_attr(db, item) {
168167
self.items.entry(lang_item_name.clone()).or_insert_with(|| constructor(item));
169168
}
170169
}
171170
}
171+
172+
pub fn lang_attr(db: &dyn DefDatabase, item: impl Into<AttrDefId> + Copy) -> Option<SmolStr> {
173+
let attrs = db.attrs(item.into());
174+
attrs.by_key("lang").string_value().cloned()
175+
}

crates/ra_hir_ty/src/traits/chalk.rs

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ use chalk_ir::{
99
};
1010

1111
use hir_def::{
12-
type_ref::Mutability, AssocContainerId, AssocItemId, GenericDefId, HasModule, Lookup,
13-
TypeAliasId,
12+
lang_item::{lang_attr, LangItemTarget},
13+
type_ref::Mutability,
14+
AssocContainerId, AssocItemId, GenericDefId, HasModule, Lookup, TypeAliasId,
1415
};
1516
use ra_db::{
1617
salsa::{InternId, InternKey},
@@ -26,6 +27,7 @@ use crate::{
2627
utils::generics,
2728
ApplicationTy, DebruijnIndex, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor,
2829
};
30+
use chalk_rust_ir::WellKnownTrait;
2931

3032
pub(super) mod tls;
3133

@@ -1057,10 +1059,15 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
10571059
}
10581060
fn well_known_trait_id(
10591061
&self,
1060-
_well_known_trait: chalk_rust_ir::WellKnownTrait,
1062+
well_known_trait: chalk_rust_ir::WellKnownTrait,
10611063
) -> Option<chalk_ir::TraitId<Interner>> {
1062-
// FIXME tell Chalk about well-known traits (here and in trait_datum)
1063-
None
1064+
let lang_attr = lang_attr_from_well_known_trait(well_known_trait);
1065+
let lang_items = self.db.crate_lang_items(self.krate);
1066+
let trait_ = match lang_items.target(lang_attr) {
1067+
Some(LangItemTarget::TraitId(trait_)) => trait_,
1068+
_ => return None,
1069+
};
1070+
Some(trait_.to_chalk(self.db))
10641071
}
10651072

10661073
fn program_clauses_for_env(
@@ -1162,7 +1169,8 @@ pub(crate) fn trait_datum_query(
11621169
let associated_ty_ids =
11631170
trait_data.associated_types().map(|type_alias| type_alias.to_chalk(db)).collect();
11641171
let trait_datum_bound = chalk_rust_ir::TraitDatumBound { where_clauses };
1165-
let well_known = None; // FIXME set this (depending on lang items)
1172+
let well_known =
1173+
lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name));
11661174
let trait_datum = TraitDatum {
11671175
id: trait_id,
11681176
binders: make_binders(trait_datum_bound, bound_vars.len()),
@@ -1173,6 +1181,25 @@ pub(crate) fn trait_datum_query(
11731181
Arc::new(trait_datum)
11741182
}
11751183

1184+
fn well_known_trait_from_lang_attr(name: &str) -> Option<WellKnownTrait> {
1185+
Some(match name {
1186+
"sized" => WellKnownTrait::SizedTrait,
1187+
"copy" => WellKnownTrait::CopyTrait,
1188+
"clone" => WellKnownTrait::CloneTrait,
1189+
"drop" => WellKnownTrait::DropTrait,
1190+
_ => return None,
1191+
})
1192+
}
1193+
1194+
fn lang_attr_from_well_known_trait(attr: WellKnownTrait) -> &'static str {
1195+
match attr {
1196+
WellKnownTrait::SizedTrait => "sized",
1197+
WellKnownTrait::CopyTrait => "copy",
1198+
WellKnownTrait::CloneTrait => "clone",
1199+
WellKnownTrait::DropTrait => "drop",
1200+
}
1201+
}
1202+
11761203
pub(crate) fn struct_datum_query(
11771204
db: &dyn HirDatabase,
11781205
krate: CrateId,

0 commit comments

Comments
 (0)