33use std:: sync:: Arc ;
44
55use cov_mark:: hit;
6- use syntax:: SmolStr ;
76use tracing:: debug;
87
98use chalk_ir:: { cast:: Cast , fold:: shift:: Shift , CanonicalVarKinds } ;
@@ -12,7 +11,7 @@ use chalk_solve::rust_ir::{self, OpaqueTyDatumBound, WellKnownTrait};
1211use base_db:: CrateId ;
1312use hir_def:: {
1413 expr:: Movability ,
15- lang_item:: { lang_attr, LangItemTarget } ,
14+ lang_item:: { lang_attr, LangItem , LangItemTarget } ,
1615 AssocItemId , GenericDefId , HasModule , ItemContainerId , Lookup , ModuleId , TypeAliasId ,
1716} ;
1817use hir_expand:: name:: name;
@@ -182,9 +181,9 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
182181 & self ,
183182 well_known_trait : rust_ir:: WellKnownTrait ,
184183 ) -> 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) ;
186185 let trait_ = match self . db . lang_item ( self . krate , lang_attr. into ( ) ) {
187- Some ( LangItemTarget :: TraitId ( trait_) ) => trait_,
186+ Some ( LangItemTarget :: Trait ( trait_) ) => trait_,
188187 _ => return None ,
189188 } ;
190189 Some ( to_chalk_trait_id ( trait_) )
@@ -216,7 +215,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
216215 crate :: ImplTraitId :: AsyncBlockTypeImplTrait ( ..) => {
217216 if let Some ( ( future_trait, future_output) ) = self
218217 . db
219- . lang_item ( self . krate , SmolStr :: new_inline ( "future_trait" ) )
218+ . lang_item ( self . krate , LangItem :: Future )
220219 . and_then ( |item| item. as_trait ( ) )
221220 . and_then ( |trait_| {
222221 let alias =
@@ -246,7 +245,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
246245 binder. push ( crate :: wrap_empty_binders ( impl_bound) ) ;
247246 let sized_trait = self
248247 . db
249- . lang_item ( self . krate , SmolStr :: new_inline ( "sized" ) )
248+ . lang_item ( self . krate , LangItem :: Sized )
250249 . and_then ( |item| item. as_trait ( ) ) ;
251250 if let Some ( sized_trait_) = sized_trait {
252251 let sized_bound = WhereClause :: Implemented ( TraitRef {
@@ -493,7 +492,7 @@ pub(crate) fn associated_ty_data_query(
493492
494493 if !ctx. unsized_types . borrow ( ) . contains ( & self_ty) {
495494 let sized_trait = db
496- . lang_item ( resolver. krate ( ) , SmolStr :: new_inline ( "sized" ) )
495+ . lang_item ( resolver. krate ( ) , LangItem :: Sized )
497496 . and_then ( |lang_item| lang_item. as_trait ( ) . map ( to_chalk_trait_id) ) ;
498497 let sized_bound = sized_trait. into_iter ( ) . map ( |sized_trait| {
499498 let trait_bound =
@@ -541,8 +540,8 @@ pub(crate) fn trait_datum_query(
541540 let where_clauses = convert_where_clauses ( db, trait_. into ( ) , & bound_vars) ;
542541 let associated_ty_ids = trait_data. associated_types ( ) . map ( to_assoc_type_id) . collect ( ) ;
543542 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) ? ) ) ;
546545 let trait_datum = TraitDatum {
547546 id : trait_id,
548547 binders : make_binders ( db, & generic_params, trait_datum_bound) ,
@@ -553,42 +552,42 @@ pub(crate) fn trait_datum_query(
553552 Arc :: new ( trait_datum)
554553}
555554
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 ,
572571 _ => return None ,
573572 } )
574573}
575574
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 ,
592591 }
593592}
594593
0 commit comments