Skip to content

Commit a370dc8

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 4b596bb commit a370dc8

File tree

17 files changed

+226
-154
lines changed

17 files changed

+226
-154
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>;
@@ -484,19 +485,31 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
484485
}
485486

486487
fn require_lang_item(self, lang_item: TraitSolverLangItem) -> DefId {
487-
self.require_lang_item(trait_lang_item_to_lang_item(lang_item), DUMMY_SP)
488+
self.require_lang_item(trait_lang_item_to_solver_lang_item(lang_item), DUMMY_SP)
489+
}
490+
491+
fn require_trait_lang_item(self, lang_item: TraitSolverTraitLangItem) -> DefId {
492+
self.require_lang_item(trait_lang_item_to_solver_trait_lang_item(lang_item), DUMMY_SP)
488493
}
489494

490495
fn is_lang_item(self, def_id: DefId, lang_item: TraitSolverLangItem) -> bool {
491-
self.is_lang_item(def_id, trait_lang_item_to_lang_item(lang_item))
496+
self.is_lang_item(def_id, trait_lang_item_to_solver_lang_item(lang_item))
497+
}
498+
499+
fn is_trait_lang_item(self, def_id: DefId, lang_item: TraitSolverTraitLangItem) -> bool {
500+
self.is_lang_item(def_id, trait_lang_item_to_solver_trait_lang_item(lang_item))
492501
}
493502

494503
fn is_default_trait(self, def_id: DefId) -> bool {
495504
self.is_default_trait(def_id)
496505
}
497506

498507
fn as_lang_item(self, def_id: DefId) -> Option<TraitSolverLangItem> {
499-
lang_item_to_trait_lang_item(self.lang_items().from_def_id(def_id)?)
508+
solver_lang_item_to_trait_lang_item(self.lang_items().from_def_id(def_id)?)
509+
}
510+
511+
fn as_trait_lang_item(self, def_id: DefId) -> Option<TraitSolverTraitLangItem> {
512+
solver_trait_lang_item_to_trait_lang_item(self.lang_items().from_def_id(def_id)?)
500513
}
501514

502515
fn associated_type_def_ids(self, def_id: DefId) -> impl IntoIterator<Item = DefId> {
@@ -727,57 +740,70 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
727740
}
728741

729742
macro_rules! bidirectional_lang_item_map {
730-
($($name:ident),+ $(,)?) => {
731-
fn trait_lang_item_to_lang_item(lang_item: TraitSolverLangItem) -> LangItem {
743+
(
744+
$solver_ty:ident, $to_solver:ident, $from_solver:ident;
745+
$($name:ident),+ $(,)?
746+
) => {
747+
fn $from_solver(lang_item: $solver_ty) -> LangItem {
732748
match lang_item {
733-
$(TraitSolverLangItem::$name => LangItem::$name,)+
749+
$($solver_ty::$name => LangItem::$name,)+
734750
}
735751
}
736752

737-
fn lang_item_to_trait_lang_item(lang_item: LangItem) -> Option<TraitSolverLangItem> {
753+
fn $to_solver(lang_item: LangItem) -> Option<$solver_ty> {
738754
Some(match lang_item {
739-
$(LangItem::$name => TraitSolverLangItem::$name,)+
755+
$(LangItem::$name => $solver_ty::$name,)+
740756
_ => return None,
741757
})
742758
}
743759
}
744760
}
745761

746762
bidirectional_lang_item_map! {
763+
TraitSolverLangItem, solver_lang_item_to_trait_lang_item, trait_lang_item_to_solver_lang_item;
764+
765+
// tidy-alphabetical-start
766+
AsyncFnKindUpvars,
767+
AsyncFnOnceOutput,
768+
CallOnceFuture,
769+
CallRefFuture,
770+
CoroutineReturn,
771+
CoroutineYield,
772+
DynMetadata,
773+
FutureOutput,
774+
Metadata,
775+
Option,
776+
Poll,
777+
// tidy-alphabetical-end
778+
}
779+
780+
bidirectional_lang_item_map! {
781+
TraitSolverTraitLangItem, solver_trait_lang_item_to_trait_lang_item, trait_lang_item_to_solver_trait_lang_item;
782+
747783
// tidy-alphabetical-start
748784
AsyncFn,
749785
AsyncFnKindHelper,
750-
AsyncFnKindUpvars,
751786
AsyncFnMut,
752787
AsyncFnOnce,
753788
AsyncFnOnceOutput,
754789
AsyncIterator,
755790
BikeshedGuaranteedNoDrop,
756-
CallOnceFuture,
757-
CallRefFuture,
758791
Clone,
759792
Copy,
760793
Coroutine,
761-
CoroutineReturn,
762-
CoroutineYield,
763794
Destruct,
764795
DiscriminantKind,
765796
Drop,
766-
DynMetadata,
767797
Fn,
768798
FnMut,
769799
FnOnce,
770800
FnPtrTrait,
771801
FusedIterator,
772802
Future,
773-
FutureOutput,
774803
Iterator,
775804
MetaSized,
776-
Metadata,
777-
Option,
778805
PointeeSized,
779806
PointeeTrait,
780-
Poll,
781807
Sized,
782808
TransmuteTrait,
783809
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_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
@@ -469,80 +469,82 @@ where
469469
} else if cx.trait_is_alias(trait_def_id) {
470470
G::consider_trait_alias_candidate(self, goal)
471471
} else {
472-
match cx.as_lang_item(trait_def_id) {
473-
Some(TraitSolverLangItem::Sized) => {
472+
match cx.as_trait_lang_item(trait_def_id) {
473+
Some(TraitSolverTraitLangItem::Sized) => {
474474
G::consider_builtin_sizedness_candidates(self, goal, SizedTraitKind::Sized)
475475
}
476-
Some(TraitSolverLangItem::MetaSized) => {
476+
Some(TraitSolverTraitLangItem::MetaSized) => {
477477
G::consider_builtin_sizedness_candidates(self, goal, SizedTraitKind::MetaSized)
478478
}
479-
Some(TraitSolverLangItem::PointeeSized) => {
479+
Some(TraitSolverTraitLangItem::PointeeSized) => {
480480
unreachable!("`PointeeSized` is removed during lowering");
481481
}
482-
Some(TraitSolverLangItem::Copy | TraitSolverLangItem::Clone) => {
482+
Some(TraitSolverTraitLangItem::Copy | TraitSolverTraitLangItem::Clone) => {
483483
G::consider_builtin_copy_clone_candidate(self, goal)
484484
}
485-
Some(TraitSolverLangItem::Fn) => {
485+
Some(TraitSolverTraitLangItem::Fn) => {
486486
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::Fn)
487487
}
488-
Some(TraitSolverLangItem::FnMut) => {
488+
Some(TraitSolverTraitLangItem::FnMut) => {
489489
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::FnMut)
490490
}
491-
Some(TraitSolverLangItem::FnOnce) => {
491+
Some(TraitSolverTraitLangItem::FnOnce) => {
492492
G::consider_builtin_fn_trait_candidates(self, goal, ty::ClosureKind::FnOnce)
493493
}
494-
Some(TraitSolverLangItem::AsyncFn) => {
494+
Some(TraitSolverTraitLangItem::AsyncFn) => {
495495
G::consider_builtin_async_fn_trait_candidates(self, goal, ty::ClosureKind::Fn)
496496
}
497-
Some(TraitSolverLangItem::AsyncFnMut) => {
497+
Some(TraitSolverTraitLangItem::AsyncFnMut) => {
498498
G::consider_builtin_async_fn_trait_candidates(
499499
self,
500500
goal,
501501
ty::ClosureKind::FnMut,
502502
)
503503
}
504-
Some(TraitSolverLangItem::AsyncFnOnce) => {
504+
Some(TraitSolverTraitLangItem::AsyncFnOnce) => {
505505
G::consider_builtin_async_fn_trait_candidates(
506506
self,
507507
goal,
508508
ty::ClosureKind::FnOnce,
509509
)
510510
}
511-
Some(TraitSolverLangItem::FnPtrTrait) => {
511+
Some(TraitSolverTraitLangItem::FnPtrTrait) => {
512512
G::consider_builtin_fn_ptr_trait_candidate(self, goal)
513513
}
514-
Some(TraitSolverLangItem::AsyncFnKindHelper) => {
514+
Some(TraitSolverTraitLangItem::AsyncFnKindHelper) => {
515515
G::consider_builtin_async_fn_kind_helper_candidate(self, goal)
516516
}
517-
Some(TraitSolverLangItem::Tuple) => G::consider_builtin_tuple_candidate(self, goal),
518-
Some(TraitSolverLangItem::PointeeTrait) => {
517+
Some(TraitSolverTraitLangItem::Tuple) => {
518+
G::consider_builtin_tuple_candidate(self, goal)
519+
}
520+
Some(TraitSolverTraitLangItem::PointeeTrait) => {
519521
G::consider_builtin_pointee_candidate(self, goal)
520522
}
521-
Some(TraitSolverLangItem::Future) => {
523+
Some(TraitSolverTraitLangItem::Future) => {
522524
G::consider_builtin_future_candidate(self, goal)
523525
}
524-
Some(TraitSolverLangItem::Iterator) => {
526+
Some(TraitSolverTraitLangItem::Iterator) => {
525527
G::consider_builtin_iterator_candidate(self, goal)
526528
}
527-
Some(TraitSolverLangItem::FusedIterator) => {
529+
Some(TraitSolverTraitLangItem::FusedIterator) => {
528530
G::consider_builtin_fused_iterator_candidate(self, goal)
529531
}
530-
Some(TraitSolverLangItem::AsyncIterator) => {
532+
Some(TraitSolverTraitLangItem::AsyncIterator) => {
531533
G::consider_builtin_async_iterator_candidate(self, goal)
532534
}
533-
Some(TraitSolverLangItem::Coroutine) => {
535+
Some(TraitSolverTraitLangItem::Coroutine) => {
534536
G::consider_builtin_coroutine_candidate(self, goal)
535537
}
536-
Some(TraitSolverLangItem::DiscriminantKind) => {
538+
Some(TraitSolverTraitLangItem::DiscriminantKind) => {
537539
G::consider_builtin_discriminant_kind_candidate(self, goal)
538540
}
539-
Some(TraitSolverLangItem::Destruct) => {
541+
Some(TraitSolverTraitLangItem::Destruct) => {
540542
G::consider_builtin_destruct_candidate(self, goal)
541543
}
542-
Some(TraitSolverLangItem::TransmuteTrait) => {
544+
Some(TraitSolverTraitLangItem::TransmuteTrait) => {
543545
G::consider_builtin_transmute_candidate(self, goal)
544546
}
545-
Some(TraitSolverLangItem::BikeshedGuaranteedNoDrop) => {
547+
Some(TraitSolverTraitLangItem::BikeshedGuaranteedNoDrop) => {
546548
G::consider_builtin_bikeshed_guaranteed_no_drop_candidate(self, goal)
547549
}
548550
_ => Err(NoSolution),
@@ -553,7 +555,7 @@ where
553555

554556
// There may be multiple unsize candidates for a trait with several supertraits:
555557
// `trait Foo: Bar<A> + Bar<B>` and `dyn Foo: Unsize<dyn Bar<_>>`
556-
if cx.is_lang_item(trait_def_id, TraitSolverLangItem::Unsize) {
558+
if cx.is_trait_lang_item(trait_def_id, TraitSolverTraitLangItem::Unsize) {
557559
candidates.extend(G::consider_structural_builtin_unsize_candidates(self, goal));
558560
}
559561
}

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::{
@@ -452,7 +452,7 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
452452
nested.push(
453453
ty::TraitRef::new(
454454
cx,
455-
cx.require_lang_item(TraitSolverLangItem::AsyncFnKindHelper),
455+
cx.require_trait_lang_item(TraitSolverTraitLangItem::AsyncFnKindHelper),
456456
[kind_ty, Ty::from_closure_kind(cx, goal_kind)],
457457
)
458458
.upcast(cx),
@@ -494,7 +494,7 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
494494
let args = args.as_closure();
495495
let bound_sig = args.sig();
496496
let sig = bound_sig.skip_binder();
497-
let future_trait_def_id = cx.require_lang_item(TraitSolverLangItem::Future);
497+
let future_trait_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Future);
498498
// `Closure`s only implement `AsyncFn*` when their return type
499499
// implements `Future`.
500500
let mut nested = vec![
@@ -512,7 +512,7 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
512512
}
513513
} else {
514514
let async_fn_kind_trait_def_id =
515-
cx.require_lang_item(TraitSolverLangItem::AsyncFnKindHelper);
515+
cx.require_trait_lang_item(TraitSolverTraitLangItem::AsyncFnKindHelper);
516516
// When we don't know the closure kind (and therefore also the closure's upvars,
517517
// which are computed at the same time), we must delay the computation of the
518518
// generator's upvars. We do this using the `AsyncFnKindHelper`, which as a trait
@@ -579,7 +579,7 @@ fn fn_item_to_async_callable<I: Interner>(
579579
bound_sig: ty::Binder<I, ty::FnSig<I>>,
580580
) -> Result<(ty::Binder<I, AsyncCallableRelevantTypes<I>>, Vec<I::Predicate>), NoSolution> {
581581
let sig = bound_sig.skip_binder();
582-
let future_trait_def_id = cx.require_lang_item(TraitSolverLangItem::Future);
582+
let future_trait_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Future);
583583
// `FnDef` and `FnPtr` only implement `AsyncFn*` when their
584584
// return type implements `Future`.
585585
let nested = vec![
@@ -730,7 +730,7 @@ pub(in crate::solve) fn const_conditions_for_destruct<I: Interner>(
730730
cx: I,
731731
self_ty: I::Ty,
732732
) -> Result<Vec<ty::TraitRef<I>>, NoSolution> {
733-
let destruct_def_id = cx.require_lang_item(TraitSolverLangItem::Destruct);
733+
let destruct_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Destruct);
734734

735735
match self_ty.kind() {
736736
// `ManuallyDrop` is trivially `[const] Destruct` as we do not run any drop glue on it.
@@ -749,7 +749,7 @@ pub(in crate::solve) fn const_conditions_for_destruct<I: Interner>(
749749
Some(AdtDestructorKind::NotConst) => return Err(NoSolution),
750750
// `Drop` impl exists, and it's const. Require `Ty: [const] Drop` to hold.
751751
Some(AdtDestructorKind::Const) => {
752-
let drop_def_id = cx.require_lang_item(TraitSolverLangItem::Drop);
752+
let drop_def_id = cx.require_trait_lang_item(TraitSolverTraitLangItem::Drop);
753753
let drop_trait_ref = ty::TraitRef::new(cx, drop_def_id, [self_ty]);
754754
const_conditions.push(drop_trait_ref);
755755
}
@@ -867,7 +867,7 @@ where
867867

868868
// FIXME(associated_const_equality): Also add associated consts to
869869
// the requirements here.
870-
for associated_type_def_id in cx.associated_type_def_ids(trait_ref.def_id) {
870+
for associated_type_def_id in cx.associated_type_def_ids(trait_ref.def_id.into()) {
871871
// associated types that require `Self: Sized` do not show up in the built-in
872872
// implementation of `Trait for dyn Trait`, and can be dropped here.
873873
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_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
@@ -129,7 +129,7 @@ where
129129
}
130130
}
131131

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

0 commit comments

Comments
 (0)