@@ -9,8 +9,9 @@ use chalk_ir::{
99} ;
1010
1111use 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} ;
1516use 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
3032pub ( 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+
11761203pub ( crate ) fn struct_datum_query (
11771204 db : & dyn HirDatabase ,
11781205 krate : CrateId ,
0 commit comments