Skip to content

Commit 9d377f8

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 2e2642e commit 9d377f8

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::search_graph::CandidateHeadUsages;
1212
use rustc_type_ir::solve::SizedTraitKind;
1313
use rustc_type_ir::{
@@ -54,7 +54,7 @@ where
5454

5555
fn with_replaced_self_ty(self, cx: I, self_ty: I::Ty) -> Self;
5656

57-
fn trait_def_id(self, cx: I) -> I::DefId;
57+
fn trait_def_id(self, cx: I) -> I::TraitId;
5858

5959
/// Consider a clause, which consists of a "assumption" and some "requirements",
6060
/// to satisfy a goal. If the requirements hold, then attempt to satisfy our
@@ -516,80 +516,82 @@ where
516516
} else if cx.trait_is_alias(trait_def_id) {
517517
G::consider_trait_alias_candidate(self, goal)
518518
} else {
519-
match cx.as_lang_item(trait_def_id) {
520-
Some(TraitSolverLangItem::Sized) => {
519+
match cx.as_trait_lang_item(trait_def_id) {
520+
Some(TraitSolverTraitLangItem::Sized) => {
521521
G::consider_builtin_sizedness_candidates(self, goal, SizedTraitKind::Sized)
522522
}
523-
Some(TraitSolverLangItem::MetaSized) => {
523+
Some(TraitSolverTraitLangItem::MetaSized) => {
524524
G::consider_builtin_sizedness_candidates(self, goal, SizedTraitKind::MetaSized)
525525
}
526-
Some(TraitSolverLangItem::PointeeSized) => {
526+
Some(TraitSolverTraitLangItem::PointeeSized) => {
527527
unreachable!("`PointeeSized` is removed during lowering");
528528
}
529-
Some(TraitSolverLangItem::Copy | TraitSolverLangItem::Clone) => {
529+
Some(TraitSolverTraitLangItem::Copy | TraitSolverTraitLangItem::Clone) => {
530530
G::consider_builtin_copy_clone_candidate(self, goal)
531531
}
532-
Some(TraitSolverLangItem::Fn) => {
532+
Some(TraitSolverTraitLangItem::Fn) => {
533533
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::Fn)
534534
}
535-
Some(TraitSolverLangItem::FnMut) => {
535+
Some(TraitSolverTraitLangItem::FnMut) => {
536536
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::FnMut)
537537
}
538-
Some(TraitSolverLangItem::FnOnce) => {
538+
Some(TraitSolverTraitLangItem::FnOnce) => {
539539
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::FnOnce)
540540
}
541-
Some(TraitSolverLangItem::AsyncFn) => {
541+
Some(TraitSolverTraitLangItem::AsyncFn) => {
542542
G::consider_builtin_async_fn_trait_candidates(self, goal, ty::ClosureKind::Fn)
543543
}
544-
Some(TraitSolverLangItem::AsyncFnMut) => {
544+
Some(TraitSolverTraitLangItem::AsyncFnMut) => {
545545
G::consider_builtin_async_fn_trait_candidates(
546546
self,
547547
goal,
548548
ty::ClosureKind::FnMut,
549549
)
550550
}
551-
Some(TraitSolverLangItem::AsyncFnOnce) => {
551+
Some(TraitSolverTraitLangItem::AsyncFnOnce) => {
552552
G::consider_builtin_async_fn_trait_candidates(
553553
self,
554554
goal,
555555
ty::ClosureKind::FnOnce,
556556
)
557557
}
558-
Some(TraitSolverLangItem::FnPtrTrait) => {
558+
Some(TraitSolverTraitLangItem::FnPtrTrait) => {
559559
G::consider_builtin_fn_ptr_trait_candidate(self, goal)
560560
}
561-
Some(TraitSolverLangItem::AsyncFnKindHelper) => {
561+
Some(TraitSolverTraitLangItem::AsyncFnKindHelper) => {
562562
G::consider_builtin_async_fn_kind_helper_candidate(self, goal)
563563
}
564-
Some(TraitSolverLangItem::Tuple) => G::consider_builtin_tuple_candidate(self, goal),
565-
Some(TraitSolverLangItem::PointeeTrait) => {
564+
Some(TraitSolverTraitLangItem::Tuple) => {
565+
G::consider_builtin_tuple_candidate(self, goal)
566+
}
567+
Some(TraitSolverTraitLangItem::PointeeTrait) => {
566568
G::consider_builtin_pointee_candidate(self, goal)
567569
}
568-
Some(TraitSolverLangItem::Future) => {
570+
Some(TraitSolverTraitLangItem::Future) => {
569571
G::consider_builtin_future_candidate(self, goal)
570572
}
571-
Some(TraitSolverLangItem::Iterator) => {
573+
Some(TraitSolverTraitLangItem::Iterator) => {
572574
G::consider_builtin_iterator_candidate(self, goal)
573575
}
574-
Some(TraitSolverLangItem::FusedIterator) => {
576+
Some(TraitSolverTraitLangItem::FusedIterator) => {
575577
G::consider_builtin_fused_iterator_candidate(self, goal)
576578
}
577-
Some(TraitSolverLangItem::AsyncIterator) => {
579+
Some(TraitSolverTraitLangItem::AsyncIterator) => {
578580
G::consider_builtin_async_iterator_candidate(self, goal)
579581
}
580-
Some(TraitSolverLangItem::Coroutine) => {
582+
Some(TraitSolverTraitLangItem::Coroutine) => {
581583
G::consider_builtin_coroutine_candidate(self, goal)
582584
}
583-
Some(TraitSolverLangItem::DiscriminantKind) => {
585+
Some(TraitSolverTraitLangItem::DiscriminantKind) => {
584586
G::consider_builtin_discriminant_kind_candidate(self, goal)
585587
}
586-
Some(TraitSolverLangItem::Destruct) => {
588+
Some(TraitSolverTraitLangItem::Destruct) => {
587589
G::consider_builtin_destruct_candidate(self, goal)
588590
}
589-
Some(TraitSolverLangItem::TransmuteTrait) => {
591+
Some(TraitSolverTraitLangItem::TransmuteTrait) => {
590592
G::consider_builtin_transmute_candidate(self, goal)
591593
}
592-
Some(TraitSolverLangItem::BikeshedGuaranteedNoDrop) => {
594+
Some(TraitSolverTraitLangItem::BikeshedGuaranteedNoDrop) => {
593595
G::consider_builtin_bikeshed_guaranteed_no_drop_candidate(self, goal)
594596
}
595597
_ => Err(NoSolution),
@@ -600,7 +602,7 @@ where
600602

601603
// There may be multiple unsize candidates for a trait with several supertraits:
602604
// `trait Foo: Bar<A> + Bar<B>` and `dyn Foo: Unsize<dyn Bar<_>>`
603-
if cx.is_lang_item(trait_def_id, TraitSolverLangItem::Unsize) {
605+
if cx.is_trait_lang_item(trait_def_id, TraitSolverTraitLangItem::Unsize) {
604606
candidates.extend(G::consider_structural_builtin_unsize_candidates(self, goal));
605607
}
606608
}

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)