review comments: move code, fix indentation and change span
This commit is contained in:
parent
0118278cde
commit
669a4035ef
5 changed files with 78 additions and 70 deletions
|
@ -170,18 +170,14 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
|||
let cause = self.cause(traits::MiscObligation);
|
||||
let param_env = self.param_env;
|
||||
|
||||
if let Elaborate::All = elaborate {
|
||||
let trait_assoc_items = tcx.associated_items(trait_ref.def_id);
|
||||
|
||||
let predicates = obligations.iter()
|
||||
.map(|obligation| obligation.predicate.clone())
|
||||
.collect();
|
||||
let implied_obligations = traits::elaborate_predicates(tcx, predicates);
|
||||
let item_span: Option<Span> = self.item.map(|i| i.span);
|
||||
let item = &self.item;
|
||||
let implied_obligations = implied_obligations.map(|pred| {
|
||||
let mut cause = cause.clone();
|
||||
match &pred {
|
||||
let extend_cause_with_original_assoc_item_obligation = |
|
||||
cause: &mut traits::ObligationCause<'_>,
|
||||
pred: &ty::Predicate<'_>,
|
||||
trait_assoc_items: ty::AssocItemsIterator<'_>,
|
||||
| {
|
||||
let item_span = item.map(|i| tcx.sess.source_map().def_span(i.span));
|
||||
match pred {
|
||||
ty::Predicate::Projection(proj) => {
|
||||
if let Some(hir::ItemKind::Impl(.., impl_items)) = item.map(|i| &i.kind) {
|
||||
let trait_assoc_item = tcx.associated_item(proj.projection_def_id());
|
||||
|
@ -201,7 +197,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
|||
ty::Projection(ty::ProjectionTy { item_def_id, .. }),
|
||||
Some(hir::ItemKind::Impl(.., impl_items)),
|
||||
) = (&proj.skip_binder().self_ty().kind, item.map(|i| &i.kind)) {
|
||||
if let Some((impl_item, trait_assoc_item)) = trait_assoc_items.clone()
|
||||
if let Some((impl_item, trait_assoc_item)) = trait_assoc_items
|
||||
.filter(|i| i.def_id == *item_def_id)
|
||||
.next()
|
||||
.and_then(|trait_assoc_item| impl_items.iter()
|
||||
|
@ -219,6 +215,22 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
|
|||
}
|
||||
_ => {}
|
||||
}
|
||||
};
|
||||
|
||||
if let Elaborate::All = elaborate {
|
||||
let trait_assoc_items = tcx.associated_items(trait_ref.def_id);
|
||||
|
||||
let predicates = obligations.iter()
|
||||
.map(|obligation| obligation.predicate.clone())
|
||||
.collect();
|
||||
let implied_obligations = traits::elaborate_predicates(tcx, predicates);
|
||||
let implied_obligations = implied_obligations.map(|pred| {
|
||||
let mut cause = cause.clone();
|
||||
extend_cause_with_original_assoc_item_obligation(
|
||||
&mut cause,
|
||||
&pred,
|
||||
trait_assoc_items.clone(),
|
||||
);
|
||||
traits::Obligation::new(cause, param_env, pred)
|
||||
});
|
||||
self.out.extend(implied_obligations);
|
||||
|
|
|
@ -4,11 +4,10 @@ error[E0277]: the trait bound `bool: Bar` is not satisfied
|
|||
LL | type Assoc: Bar;
|
||||
| ----- associated type defined here
|
||||
...
|
||||
LL | / impl Foo for () {
|
||||
LL | | type Assoc = bool;
|
||||
| | ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool`
|
||||
LL | | }
|
||||
| |_- in this `impl` item
|
||||
LL | impl Foo for () {
|
||||
| --------------- in this `impl` item
|
||||
LL | type Assoc = bool;
|
||||
| ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
@ -4,12 +4,10 @@ error[E0271]: type mismatch resolving `<Foo2 as Bar2>::Ok == ()`
|
|||
LL | type Ok;
|
||||
| -- associated type defined here
|
||||
...
|
||||
LL | / impl Bar for Foo {
|
||||
LL | | type Ok = ();
|
||||
| | ^^^^^^^^^^^^^ expected u32, found ()
|
||||
LL | | type Sibling = Foo2;
|
||||
LL | | }
|
||||
| |_- in this `impl` item
|
||||
LL | impl Bar for Foo {
|
||||
| ---------------- in this `impl` item
|
||||
LL | type Ok = ();
|
||||
| ^^^^^^^^^^^^^ expected u32, found ()
|
||||
|
|
||||
= note: expected type `u32`
|
||||
found type `()`
|
||||
|
|
|
@ -4,12 +4,12 @@ error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
|||
LL | type Assoc: Partial<Self>;
|
||||
| ----- associated type defined here
|
||||
...
|
||||
LL | / impl<T> Complete for T {
|
||||
| | - help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | | type Assoc = T;
|
||||
| | ^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
LL | | }
|
||||
| |_- in this `impl` item
|
||||
LL | impl<T> Complete for T {
|
||||
| ---------------------- in this `impl` item
|
||||
| |
|
||||
| help: consider restricting this bound: `T: std::marker::Copy`
|
||||
LL | type Assoc = T;
|
||||
| ^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
|
||||
|
|
|
@ -12,11 +12,10 @@ error[E0275]: overflow evaluating the requirement `RootDatabase: SourceDatabase`
|
|||
LL | type Storage;
|
||||
| ------- associated type defined here
|
||||
...
|
||||
LL | / impl Database for RootDatabase {
|
||||
LL | | type Storage = SalsaStorage;
|
||||
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
LL | | }
|
||||
| |_- in this `impl` item
|
||||
LL | impl Database for RootDatabase {
|
||||
| ------------------------------ in this `impl` item
|
||||
LL | type Storage = SalsaStorage;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: required because of the requirements on the impl of `Query<RootDatabase>` for `ParseQuery`
|
||||
= note: required because it appears within the type `SalsaStorage`
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue