3
3
use std:: sync:: Arc ;
4
4
5
5
use cov_mark:: hit;
6
- use syntax:: SmolStr ;
7
6
use tracing:: debug;
8
7
9
8
use chalk_ir:: { cast:: Cast , fold:: shift:: Shift , CanonicalVarKinds } ;
@@ -12,7 +11,7 @@ use chalk_solve::rust_ir::{self, OpaqueTyDatumBound, WellKnownTrait};
12
11
use base_db:: CrateId ;
13
12
use hir_def:: {
14
13
expr:: Movability ,
15
- lang_item:: { lang_attr, LangItemTarget } ,
14
+ lang_item:: { lang_attr, LangItem , LangItemTarget } ,
16
15
AssocItemId , GenericDefId , HasModule , ItemContainerId , Lookup , ModuleId , TypeAliasId ,
17
16
} ;
18
17
use hir_expand:: name:: name;
@@ -182,9 +181,9 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
182
181
& self ,
183
182
well_known_trait : rust_ir:: WellKnownTrait ,
184
183
) -> Option < chalk_ir:: TraitId < Interner > > {
185
- let lang_attr = lang_attr_from_well_known_trait ( well_known_trait) ;
184
+ let lang_attr = lang_item_from_well_known_trait ( well_known_trait) ;
186
185
let trait_ = match self . db . lang_item ( self . krate , lang_attr. into ( ) ) {
187
- Some ( LangItemTarget :: TraitId ( trait_) ) => trait_,
186
+ Some ( LangItemTarget :: Trait ( trait_) ) => trait_,
188
187
_ => return None ,
189
188
} ;
190
189
Some ( to_chalk_trait_id ( trait_) )
@@ -216,7 +215,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
216
215
crate :: ImplTraitId :: AsyncBlockTypeImplTrait ( ..) => {
217
216
if let Some ( ( future_trait, future_output) ) = self
218
217
. db
219
- . lang_item ( self . krate , SmolStr :: new_inline ( "future_trait" ) )
218
+ . lang_item ( self . krate , LangItem :: Future )
220
219
. and_then ( |item| item. as_trait ( ) )
221
220
. and_then ( |trait_| {
222
221
let alias =
@@ -246,7 +245,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
246
245
binder. push ( crate :: wrap_empty_binders ( impl_bound) ) ;
247
246
let sized_trait = self
248
247
. db
249
- . lang_item ( self . krate , SmolStr :: new_inline ( "sized" ) )
248
+ . lang_item ( self . krate , LangItem :: Sized )
250
249
. and_then ( |item| item. as_trait ( ) ) ;
251
250
if let Some ( sized_trait_) = sized_trait {
252
251
let sized_bound = WhereClause :: Implemented ( TraitRef {
@@ -493,7 +492,7 @@ pub(crate) fn associated_ty_data_query(
493
492
494
493
if !ctx. unsized_types . borrow ( ) . contains ( & self_ty) {
495
494
let sized_trait = db
496
- . lang_item ( resolver. krate ( ) , SmolStr :: new_inline ( "sized" ) )
495
+ . lang_item ( resolver. krate ( ) , LangItem :: Sized )
497
496
. and_then ( |lang_item| lang_item. as_trait ( ) . map ( to_chalk_trait_id) ) ;
498
497
let sized_bound = sized_trait. into_iter ( ) . map ( |sized_trait| {
499
498
let trait_bound =
@@ -541,8 +540,8 @@ pub(crate) fn trait_datum_query(
541
540
let where_clauses = convert_where_clauses ( db, trait_. into ( ) , & bound_vars) ;
542
541
let associated_ty_ids = trait_data. associated_types ( ) . map ( to_assoc_type_id) . collect ( ) ;
543
542
let trait_datum_bound = rust_ir:: TraitDatumBound { where_clauses } ;
544
- let well_known =
545
- lang_attr ( db . upcast ( ) , trait_ ) . and_then ( |name| well_known_trait_from_lang_attr ( & name) ) ;
543
+ let well_known = lang_attr ( db . upcast ( ) , trait_ )
544
+ . and_then ( |name| well_known_trait_from_lang_item ( LangItem :: from_str ( & name) ? ) ) ;
546
545
let trait_datum = TraitDatum {
547
546
id : trait_id,
548
547
binders : make_binders ( db, & generic_params, trait_datum_bound) ,
@@ -553,42 +552,42 @@ pub(crate) fn trait_datum_query(
553
552
Arc :: new ( trait_datum)
554
553
}
555
554
556
- fn well_known_trait_from_lang_attr ( name : & str ) -> Option < WellKnownTrait > {
557
- Some ( match name {
558
- "clone" => WellKnownTrait :: Clone ,
559
- "coerce_unsized" => WellKnownTrait :: CoerceUnsized ,
560
- "copy" => WellKnownTrait :: Copy ,
561
- "discriminant_kind" => WellKnownTrait :: DiscriminantKind ,
562
- "dispatch_from_dyn" => WellKnownTrait :: DispatchFromDyn ,
563
- "drop" => WellKnownTrait :: Drop ,
564
- "fn" => WellKnownTrait :: Fn ,
565
- "fn_mut" => WellKnownTrait :: FnMut ,
566
- "fn_once" => WellKnownTrait :: FnOnce ,
567
- "generator" => WellKnownTrait :: Generator ,
568
- "sized" => WellKnownTrait :: Sized ,
569
- "unpin" => WellKnownTrait :: Unpin ,
570
- "unsize" => WellKnownTrait :: Unsize ,
571
- "tuple_trait" => WellKnownTrait :: Tuple ,
555
+ fn well_known_trait_from_lang_item ( item : LangItem ) -> Option < WellKnownTrait > {
556
+ Some ( match item {
557
+ LangItem :: Clone => WellKnownTrait :: Clone ,
558
+ LangItem :: CoerceUnsized => WellKnownTrait :: CoerceUnsized ,
559
+ LangItem :: Copy => WellKnownTrait :: Copy ,
560
+ LangItem :: DiscriminantKind => WellKnownTrait :: DiscriminantKind ,
561
+ LangItem :: DispatchFromDyn => WellKnownTrait :: DispatchFromDyn ,
562
+ LangItem :: Drop => WellKnownTrait :: Drop ,
563
+ LangItem :: Fn => WellKnownTrait :: Fn ,
564
+ LangItem :: FnMut => WellKnownTrait :: FnMut ,
565
+ LangItem :: FnOnce => WellKnownTrait :: FnOnce ,
566
+ LangItem :: Generator => WellKnownTrait :: Generator ,
567
+ LangItem :: Sized => WellKnownTrait :: Sized ,
568
+ LangItem :: Unpin => WellKnownTrait :: Unpin ,
569
+ LangItem :: Unsize => WellKnownTrait :: Unsize ,
570
+ LangItem :: Tuple => WellKnownTrait :: Tuple ,
572
571
_ => return None ,
573
572
} )
574
573
}
575
574
576
- fn lang_attr_from_well_known_trait ( attr : WellKnownTrait ) -> & ' static str {
577
- match attr {
578
- WellKnownTrait :: Clone => "clone" ,
579
- WellKnownTrait :: CoerceUnsized => "coerce_unsized" ,
580
- WellKnownTrait :: Copy => "copy" ,
581
- WellKnownTrait :: DiscriminantKind => "discriminant_kind" ,
582
- WellKnownTrait :: DispatchFromDyn => "dispatch_from_dyn" ,
583
- WellKnownTrait :: Drop => "drop" ,
584
- WellKnownTrait :: Fn => "fn" ,
585
- WellKnownTrait :: FnMut => "fn_mut" ,
586
- WellKnownTrait :: FnOnce => "fn_once" ,
587
- WellKnownTrait :: Generator => "generator" ,
588
- WellKnownTrait :: Sized => "sized" ,
589
- WellKnownTrait :: Tuple => "tuple_trait" ,
590
- WellKnownTrait :: Unpin => "unpin" ,
591
- WellKnownTrait :: Unsize => "unsize" ,
575
+ fn lang_item_from_well_known_trait ( trait_ : WellKnownTrait ) -> LangItem {
576
+ match trait_ {
577
+ WellKnownTrait :: Clone => LangItem :: Clone ,
578
+ WellKnownTrait :: CoerceUnsized => LangItem :: CoerceUnsized ,
579
+ WellKnownTrait :: Copy => LangItem :: Copy ,
580
+ WellKnownTrait :: DiscriminantKind => LangItem :: DiscriminantKind ,
581
+ WellKnownTrait :: DispatchFromDyn => LangItem :: DispatchFromDyn ,
582
+ WellKnownTrait :: Drop => LangItem :: Drop ,
583
+ WellKnownTrait :: Fn => LangItem :: Fn ,
584
+ WellKnownTrait :: FnMut => LangItem :: FnMut ,
585
+ WellKnownTrait :: FnOnce => LangItem :: FnOnce ,
586
+ WellKnownTrait :: Generator => LangItem :: Generator ,
587
+ WellKnownTrait :: Sized => LangItem :: Sized ,
588
+ WellKnownTrait :: Tuple => LangItem :: Tuple ,
589
+ WellKnownTrait :: Unpin => LangItem :: Unpin ,
590
+ WellKnownTrait :: Unsize => LangItem :: Unsize ,
592
591
}
593
592
}
594
593
0 commit comments