Skip to content

Commit e854390

Browse files
Switch next solver to use a specific associated type for trait def id
The compiler just puts `DefId` in there, but rust-analyzer uses different types for each kind of item.
1 parent 3672a55 commit e854390

File tree

18 files changed

+227
-155
lines changed

18 files changed

+227
-155
lines changed

compiler/rustc_middle/src/ty/context.rs

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ use rustc_session::{Limit, Session};
5252
use rustc_span::def_id::{CRATE_DEF_ID, DefPathHash, StableCrateId};
5353
use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym};
5454
use rustc_type_ir::TyKind::*;
55-
use rustc_type_ir::lang_items::TraitSolverLangItem;
55+
use rustc_type_ir::lang_items::{TraitSolverLangItem, TraitSolverTraitLangItem};
5656
pub use rustc_type_ir::lift::Lift;
5757
use rustc_type_ir::{
5858
CollectAndApply, Interner, TypeFlags, TypeFoldable, WithCachedTypeInfo, elaborate, search_graph,
@@ -93,6 +93,7 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
9393

9494
type DefId = DefId;
9595
type LocalDefId = LocalDefId;
96+
type TraitId = DefId;
9697
type Span = Span;
9798

9899
type GenericArgs = ty::GenericArgsRef<'tcx>;
@@ -481,19 +482,31 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
481482
}
482483

483484
fn require_lang_item(self, lang_item: TraitSolverLangItem) -> DefId {
484-
self.require_lang_item(trait_lang_item_to_lang_item(lang_item), DUMMY_SP)
485+
self.require_lang_item(trait_lang_item_to_solver_lang_item(lang_item), DUMMY_SP)
486+
}
487+
488+
fn require_trait_lang_item(self, lang_item: TraitSolverTraitLangItem) -> DefId {
489+
self.require_lang_item(trait_lang_item_to_solver_trait_lang_item(lang_item), DUMMY_SP)
485490
}
486491

487492
fn is_lang_item(self, def_id: DefId, lang_item: TraitSolverLangItem) -> bool {
488-
self.is_lang_item(def_id, trait_lang_item_to_lang_item(lang_item))
493+
self.is_lang_item(def_id, trait_lang_item_to_solver_lang_item(lang_item))
494+
}
495+
496+
fn is_trait_lang_item(self, def_id: DefId, lang_item: TraitSolverTraitLangItem) -> bool {
497+
self.is_lang_item(def_id, trait_lang_item_to_solver_trait_lang_item(lang_item))
489498
}
490499

491500
fn is_default_trait(self, def_id: DefId) -> bool {
492501
self.is_default_trait(def_id)
493502
}
494503

495504
fn as_lang_item(self, def_id: DefId) -> Option<TraitSolverLangItem> {
496-
lang_item_to_trait_lang_item(self.lang_items().from_def_id(def_id)?)
505+
solver_lang_item_to_trait_lang_item(self.lang_items().from_def_id(def_id)?)
506+
}
507+
508+
fn as_trait_lang_item(self, def_id: DefId) -> Option<TraitSolverTraitLangItem> {
509+
solver_trait_lang_item_to_trait_lang_item(self.lang_items().from_def_id(def_id)?)
497510
}
498511

499512
fn associated_type_def_ids(self, def_id: DefId) -> impl IntoIterator<Item = DefId> {
@@ -724,57 +737,70 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
724737
}
725738

726739
macro_rules! bidirectional_lang_item_map {
727-
($($name:ident),+ $(,)?) => {
728-
fn trait_lang_item_to_lang_item(lang_item: TraitSolverLangItem) -> LangItem {
740+
(
741+
$solver_ty:ident, $to_solver:ident, $from_solver:ident;
742+
$($name:ident),+ $(,)?
743+
) => {
744+
fn $from_solver(lang_item: $solver_ty) -> LangItem {
729745
match lang_item {
730-
$(TraitSolverLangItem::$name => LangItem::$name,)+
746+
$($solver_ty::$name => LangItem::$name,)+
731747
}
732748
}
733749

734-
fn lang_item_to_trait_lang_item(lang_item: LangItem) -> Option<TraitSolverLangItem> {
750+
fn $to_solver(lang_item: LangItem) -> Option<$solver_ty> {
735751
Some(match lang_item {
736-
$(LangItem::$name => TraitSolverLangItem::$name,)+
752+
$(LangItem::$name => $solver_ty::$name,)+
737753
_ => return None,
738754
})
739755
}
740756
}
741757
}
742758

743759
bidirectional_lang_item_map! {
760+
TraitSolverLangItem, solver_lang_item_to_trait_lang_item, trait_lang_item_to_solver_lang_item;
761+
762+
// tidy-alphabetical-start
763+
AsyncFnKindUpvars,
764+
AsyncFnOnceOutput,
765+
CallOnceFuture,
766+
CallRefFuture,
767+
CoroutineReturn,
768+
CoroutineYield,
769+
DynMetadata,
770+
FutureOutput,
771+
Metadata,
772+
Option,
773+
Poll,
774+
// tidy-alphabetical-end
775+
}
776+
777+
bidirectional_lang_item_map! {
778+
TraitSolverTraitLangItem, solver_trait_lang_item_to_trait_lang_item, trait_lang_item_to_solver_trait_lang_item;
779+
744780
// tidy-alphabetical-start
745781
AsyncFn,
746782
AsyncFnKindHelper,
747-
AsyncFnKindUpvars,
748783
AsyncFnMut,
749784
AsyncFnOnce,
750785
AsyncFnOnceOutput,
751786
AsyncIterator,
752787
BikeshedGuaranteedNoDrop,
753-
CallOnceFuture,
754-
CallRefFuture,
755788
Clone,
756789
Copy,
757790
Coroutine,
758-
CoroutineReturn,
759-
CoroutineYield,
760791
Destruct,
761792
DiscriminantKind,
762793
Drop,
763-
DynMetadata,
764794
Fn,
765795
FnMut,
766796
FnOnce,
767797
FnPtrTrait,
768798
FusedIterator,
769799
Future,
770-
FutureOutput,
771800
Iterator,
772801
MetaSized,
773-
Metadata,
774-
Option,
775802
PointeeSized,
776803
PointeeTrait,
777-
Poll,
778804
Sized,
779805
TransmuteTrait,
780806
Tuple,

compiler/rustc_next_trait_solver/src/coherence.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ where
295295
ControlFlow::Break(OrphanCheckEarlyExit::UncoveredTyParam(ty))
296296
}
297297

298-
fn def_id_is_local(&mut self, def_id: I::DefId) -> bool {
298+
fn def_id_is_local(&mut self, def_id: impl DefId<I>) -> bool {
299299
match self.in_crate {
300300
InCrate::Local { .. } => def_id.is_local(),
301301
InCrate::Remote => false,

compiler/rustc_next_trait_solver/src/solve/assembly/mod.rs

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::ops::ControlFlow;
77

88
use derive_where::derive_where;
99
use rustc_type_ir::inherent::*;
10-
use rustc_type_ir::lang_items::TraitSolverLangItem;
10+
use rustc_type_ir::lang_items::TraitSolverTraitLangItem;
1111
use rustc_type_ir::solve::SizedTraitKind;
1212
use rustc_type_ir::{
1313
self as ty, Interner, TypeFlags, TypeFoldable, TypeSuperVisitable, TypeVisitable,
@@ -52,7 +52,7 @@ where
5252

5353
fn with_replaced_self_ty(self, cx: I, self_ty: I::Ty) -> Self;
5454

55-
fn trait_def_id(self, cx: I) -> I::DefId;
55+
fn trait_def_id(self, cx: I) -> I::TraitId;
5656

5757
/// Consider a clause, which consists of a "assumption" and some "requirements",
5858
/// to satisfy a goal. If the requirements hold, then attempt to satisfy our
@@ -490,80 +490,82 @@ where
490490
} else if cx.trait_is_alias(trait_def_id) {
491491
G::consider_trait_alias_candidate(self, goal)
492492
} else {
493-
match cx.as_lang_item(trait_def_id) {
494-
Some(TraitSolverLangItem::Sized) => {
493+
match cx.as_trait_lang_item(trait_def_id) {
494+
Some(TraitSolverTraitLangItem::Sized) => {
495495
G::consider_builtin_sizedness_candidates(self, goal, SizedTraitKind::Sized)
496496
}
497-
Some(TraitSolverLangItem::MetaSized) => {
497+
Some(TraitSolverTraitLangItem::MetaSized) => {
498498
G::consider_builtin_sizedness_candidates(self, goal, SizedTraitKind::MetaSized)
499499
}
500-
Some(TraitSolverLangItem::PointeeSized) => {
500+
Some(TraitSolverTraitLangItem::PointeeSized) => {
501501
unreachable!("`PointeeSized` is removed during lowering");
502502
}
503-
Some(TraitSolverLangItem::Copy | TraitSolverLangItem::Clone) => {
503+
Some(TraitSolverTraitLangItem::Copy | TraitSolverTraitLangItem::Clone) => {
504504
G::consider_builtin_copy_clone_candidate(self, goal)
505505
}
506-
Some(TraitSolverLangItem::Fn) => {
506+
Some(TraitSolverTraitLangItem::Fn) => {
507507
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::Fn)
508508
}
509-
Some(TraitSolverLangItem::FnMut) => {
509+
Some(TraitSolverTraitLangItem::FnMut) => {
510510
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::FnMut)
511511
}
512-
Some(TraitSolverLangItem::FnOnce) => {
512+
Some(TraitSolverTraitLangItem::FnOnce) => {
513513
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::FnOnce)
514514
}
515-
Some(TraitSolverLangItem::AsyncFn) => {
515+
Some(TraitSolverTraitLangItem::AsyncFn) => {
516516
G::consider_builtin_async_fn_trait_candidates(self, goal, ty::ClosureKind::Fn)
517517
}
518-
Some(TraitSolverLangItem::AsyncFnMut) => {
518+
Some(TraitSolverTraitLangItem::AsyncFnMut) => {
519519
G::consider_builtin_async_fn_trait_candidates(
520520
self,
521521
goal,
522522
ty::ClosureKind::FnMut,
523523
)
524524
}
525-
Some(TraitSolverLangItem::AsyncFnOnce) => {
525+
Some(TraitSolverTraitLangItem::AsyncFnOnce) => {
526526
G::consider_builtin_async_fn_trait_candidates(
527527
self,
528528
goal,
529529
ty::ClosureKind::FnOnce,
530530
)
531531
}
532-
Some(TraitSolverLangItem::FnPtrTrait) => {
532+
Some(TraitSolverTraitLangItem::FnPtrTrait) => {
533533
G::consider_builtin_fn_ptr_trait_candidate(self, goal)
534534
}
535-
Some(TraitSolverLangItem::AsyncFnKindHelper) => {
535+
Some(TraitSolverTraitLangItem::AsyncFnKindHelper) => {
536536
G::consider_builtin_async_fn_kind_helper_candidate(self, goal)
537537
}
538-
Some(TraitSolverLangItem::Tuple) => G::consider_builtin_tuple_candidate(self, goal),
539-
Some(TraitSolverLangItem::PointeeTrait) => {
538+
Some(TraitSolverTraitLangItem::Tuple) => {
539+
G::consider_builtin_tuple_candidate(self, goal)
540+
}
541+
Some(TraitSolverTraitLangItem::PointeeTrait) => {
540542
G::consider_builtin_pointee_candidate(self, goal)
541543
}
542-
Some(TraitSolverLangItem::Future) => {
544+
Some(TraitSolverTraitLangItem::Future) => {
543545
G::consider_builtin_future_candidate(self, goal)
544546
}
545-
Some(TraitSolverLangItem::Iterator) => {
547+
Some(TraitSolverTraitLangItem::Iterator) => {
546548
G::consider_builtin_iterator_candidate(self, goal)
547549
}
548-
Some(TraitSolverLangItem::FusedIterator) => {
550+
Some(TraitSolverTraitLangItem::FusedIterator) => {
549551
G::consider_builtin_fused_iterator_candidate(self, goal)
550552
}
551-
Some(TraitSolverLangItem::AsyncIterator) => {
553+
Some(TraitSolverTraitLangItem::AsyncIterator) => {
552554
G::consider_builtin_async_iterator_candidate(self, goal)
553555
}
554-
Some(TraitSolverLangItem::Coroutine) => {
556+
Some(TraitSolverTraitLangItem::Coroutine) => {
555557
G::consider_builtin_coroutine_candidate(self, goal)
556558
}
557-
Some(TraitSolverLangItem::DiscriminantKind) => {
559+
Some(TraitSolverTraitLangItem::DiscriminantKind) => {
558560
G::consider_builtin_discriminant_kind_candidate(self, goal)
559561
}
560-
Some(TraitSolverLangItem::Destruct) => {
562+
Some(TraitSolverTraitLangItem::Destruct) => {
561563
G::consider_builtin_destruct_candidate(self, goal)
562564
}
563-
Some(TraitSolverLangItem::TransmuteTrait) => {
565+
Some(TraitSolverTraitLangItem::TransmuteTrait) => {
564566
G::consider_builtin_transmute_candidate(self, goal)
565567
}
566-
Some(TraitSolverLangItem::BikeshedGuaranteedNoDrop) => {
568+
Some(TraitSolverTraitLangItem::BikeshedGuaranteedNoDrop) => {
567569
G::consider_builtin_bikeshed_guaranteed_no_drop_candidate(self, goal)
568570
}
569571
_ => Err(NoSolution),
@@ -574,7 +576,7 @@ where
574576

575577
// There may be multiple unsize candidates for a trait with several supertraits:
576578
// `trait Foo: Bar<A> + Bar<B>` and `dyn Foo: Unsize<dyn Bar<_>>`
577-
if cx.is_lang_item(trait_def_id, TraitSolverLangItem::Unsize) {
579+
if cx.is_trait_lang_item(trait_def_id, TraitSolverTraitLangItem::Unsize) {
578580
candidates.extend(G::consider_structural_builtin_unsize_candidates(self, goal));
579581
}
580582
}

compiler/rustc_next_trait_solver/src/solve/assembly/structural_traits.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use derive_where::derive_where;
55
use rustc_type_ir::data_structures::HashMap;
66
use rustc_type_ir::inherent::*;
7-
use rustc_type_ir::lang_items::TraitSolverLangItem;
7+
use rustc_type_ir::lang_items::{TraitSolverLangItem, TraitSolverTraitLangItem};
88
use rustc_type_ir::solve::SizedTraitKind;
99
use rustc_type_ir::solve::inspect::ProbeKind;
1010
use rustc_type_ir::{
@@ -466,7 +466,7 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
466466
nested.push(
467467
ty::TraitRef::new(
468468
cx,
469-
cx.require_lang_item(TraitSolverLangItem::AsyncFnKindHelper),
469+
cx.require_trait_lang_item(TraitSolverTraitLangItem::AsyncFnKindHelper),
470470
[kind_ty, Ty::from_closure_kind(cx, goal_kind)],
471471
)
472472
.upcast(cx),
@@ -508,7 +508,7 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
508508
let args = args.as_closure();
509509
let bound_sig = args.sig();
510510
let sig = bound_sig.skip_binder();
511-
let future_trait_def_id = cx.require_lang_item(TraitSolverLangItem::Future);
511+
let future_trait_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Future);
512512
// `Closure`s only implement `AsyncFn*` when their return type
513513
// implements `Future`.
514514
let mut nested = vec![
@@ -526,7 +526,7 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
526526
}
527527
} else {
528528
let async_fn_kind_trait_def_id =
529-
cx.require_lang_item(TraitSolverLangItem::AsyncFnKindHelper);
529+
cx.require_trait_lang_item(TraitSolverTraitLangItem::AsyncFnKindHelper);
530530
// When we don't know the closure kind (and therefore also the closure's upvars,
531531
// which are computed at the same time), we must delay the computation of the
532532
// generator's upvars. We do this using the `AsyncFnKindHelper`, which as a trait
@@ -593,7 +593,7 @@ fn fn_item_to_async_callable<I: Interner>(
593593
bound_sig: ty::Binder<I, ty::FnSig<I>>,
594594
) -> Result<(ty::Binder<I, AsyncCallableRelevantTypes<I>>, Vec<I::Predicate>), NoSolution> {
595595
let sig = bound_sig.skip_binder();
596-
let future_trait_def_id = cx.require_lang_item(TraitSolverLangItem::Future);
596+
let future_trait_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Future);
597597
// `FnDef` and `FnPtr` only implement `AsyncFn*` when their
598598
// return type implements `Future`.
599599
let nested = vec![
@@ -744,7 +744,7 @@ pub(in crate::solve) fn const_conditions_for_destruct<I: Interner>(
744744
cx: I,
745745
self_ty: I::Ty,
746746
) -> Result<Vec<ty::TraitRef<I>>, NoSolution> {
747-
let destruct_def_id = cx.require_lang_item(TraitSolverLangItem::Destruct);
747+
let destruct_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Destruct);
748748

749749
match self_ty.kind() {
750750
// `ManuallyDrop` is trivially `[const] Destruct` as we do not run any drop glue on it.
@@ -763,7 +763,7 @@ pub(in crate::solve) fn const_conditions_for_destruct<I: Interner>(
763763
Some(AdtDestructorKind::NotConst) => return Err(NoSolution),
764764
// `Drop` impl exists, and it's const. Require `Ty: [const] Drop` to hold.
765765
Some(AdtDestructorKind::Const) => {
766-
let drop_def_id = cx.require_lang_item(TraitSolverLangItem::Drop);
766+
let drop_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Drop);
767767
let drop_trait_ref = ty::TraitRef::new(cx, drop_def_id, [self_ty]);
768768
const_conditions.push(drop_trait_ref);
769769
}
@@ -881,7 +881,7 @@ where
881881

882882
// FIXME(associated_const_equality): Also add associated consts to
883883
// the requirements here.
884-
for associated_type_def_id in cx.associated_type_def_ids(trait_ref.def_id) {
884+
for associated_type_def_id in cx.associated_type_def_ids(trait_ref.def_id.into()) {
885885
// associated types that require `Self: Sized` do not show up in the built-in
886886
// implementation of `Trait for dyn Trait`, and can be dropped here.
887887
if cx.generics_require_sized_self(associated_type_def_id) {

compiler/rustc_next_trait_solver/src/solve/effect_goals.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
use rustc_type_ir::fast_reject::DeepRejectCtxt;
55
use rustc_type_ir::inherent::*;
6-
use rustc_type_ir::lang_items::TraitSolverLangItem;
6+
use rustc_type_ir::lang_items::TraitSolverTraitLangItem;
77
use rustc_type_ir::solve::SizedTraitKind;
88
use rustc_type_ir::solve::inspect::ProbeKind;
99
use rustc_type_ir::{self as ty, Interner, elaborate};
@@ -33,7 +33,7 @@ where
3333
self.with_replaced_self_ty(cx, self_ty)
3434
}
3535

36-
fn trait_def_id(self, _: I) -> I::DefId {
36+
fn trait_def_id(self, _: I) -> I::TraitId {
3737
self.def_id()
3838
}
3939

@@ -233,7 +233,11 @@ where
233233
// A built-in `Fn` impl only holds if the output is sized.
234234
// (FIXME: technically we only need to check this if the type is a fn ptr...)
235235
let output_is_sized_pred = inputs_and_output.map_bound(|(_, output)| {
236-
ty::TraitRef::new(cx, cx.require_lang_item(TraitSolverLangItem::Sized), [output])
236+
ty::TraitRef::new(
237+
cx,
238+
cx.require_trait_lang_item(TraitSolverTraitLangItem::Sized),
239+
[output],
240+
)
237241
});
238242
let requirements = cx
239243
.const_conditions(def_id)

compiler/rustc_next_trait_solver/src/solve/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ where
130130
}
131131
}
132132

133-
fn compute_dyn_compatible_goal(&mut self, trait_def_id: I::DefId) -> QueryResult<I> {
133+
fn compute_dyn_compatible_goal(&mut self, trait_def_id: I::TraitId) -> QueryResult<I> {
134134
if self.cx().trait_is_dyn_compatible(trait_def_id) {
135135
self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
136136
} else {

0 commit comments

Comments
 (0)