@@ -9,8 +9,9 @@ use chalk_ir::{
9
9
} ;
10
10
11
11
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 ,
14
15
} ;
15
16
use ra_db:: {
16
17
salsa:: { InternId , InternKey } ,
@@ -26,6 +27,7 @@ use crate::{
26
27
utils:: generics,
27
28
ApplicationTy , DebruijnIndex , GenericPredicate , ProjectionTy , Substs , TraitRef , Ty , TypeCtor ,
28
29
} ;
30
+ use chalk_rust_ir:: WellKnownTrait ;
29
31
30
32
pub ( super ) mod tls;
31
33
@@ -1057,10 +1059,15 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
1057
1059
}
1058
1060
fn well_known_trait_id (
1059
1061
& self ,
1060
- _well_known_trait : chalk_rust_ir:: WellKnownTrait ,
1062
+ well_known_trait : chalk_rust_ir:: WellKnownTrait ,
1061
1063
) -> 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 ) )
1064
1071
}
1065
1072
1066
1073
fn program_clauses_for_env (
@@ -1162,7 +1169,8 @@ pub(crate) fn trait_datum_query(
1162
1169
let associated_ty_ids =
1163
1170
trait_data. associated_types ( ) . map ( |type_alias| type_alias. to_chalk ( db) ) . collect ( ) ;
1164
1171
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) ) ;
1166
1174
let trait_datum = TraitDatum {
1167
1175
id : trait_id,
1168
1176
binders : make_binders ( trait_datum_bound, bound_vars. len ( ) ) ,
@@ -1173,6 +1181,25 @@ pub(crate) fn trait_datum_query(
1173
1181
Arc :: new ( trait_datum)
1174
1182
}
1175
1183
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
+
1176
1203
pub ( crate ) fn struct_datum_query (
1177
1204
db : & dyn HirDatabase ,
1178
1205
krate : CrateId ,
0 commit comments