]> git.lizzy.rs Git - rust.git/commitdiff
Simplify the collecting of `? Trait` bounds in where clause
authorsurechen <surechen17@huawei.com>
Wed, 21 Jul 2021 03:35:06 +0000 (11:35 +0800)
committersurechen <surechen17@huawei.com>
Wed, 21 Jul 2021 03:35:06 +0000 (11:35 +0800)
compiler/rustc_ast_lowering/src/item.rs

index 9f9d41c3f3d9e8f816d7ad0a99eae3c4abfc2dd9..d1428f3b6c12f9084525f1d24500dab40ecb4846 100644 (file)
@@ -1373,50 +1373,37 @@ pub(super) fn lower_generics_mut(
         itctx: ImplTraitContext<'_, 'hir>,
     ) -> GenericsCtor<'hir> {
         // Collect `?Trait` bounds in where clause and move them to parameter definitions.
-        // FIXME: this could probably be done with less rightward drift. It also looks like two
-        // control paths where `report_error` is called are the only paths that advance to after the
-        // match statement, so the error reporting could probably just be moved there.
         let mut add_bounds: NodeMap<Vec<_>> = Default::default();
         for pred in &generics.where_clause.predicates {
             if let WherePredicate::BoundPredicate(ref bound_pred) = *pred {
                 'next_bound: for bound in &bound_pred.bounds {
                     if let GenericBound::Trait(_, TraitBoundModifier::Maybe) = *bound {
-                        let report_error = |this: &mut Self| {
-                            this.diagnostic().span_err(
-                                bound_pred.bounded_ty.span,
-                                "`?Trait` bounds are only permitted at the \
-                                 point where a type parameter is declared",
-                            );
-                        };
                         // Check if the where clause type is a plain type parameter.
-                        match bound_pred.bounded_ty.kind {
-                            TyKind::Path(None, ref path)
-                                if path.segments.len() == 1
-                                    && bound_pred.bound_generic_params.is_empty() =>
-                            {
-                                if let Some(Res::Def(DefKind::TyParam, def_id)) = self
-                                    .resolver
-                                    .get_partial_res(bound_pred.bounded_ty.id)
-                                    .map(|d| d.base_res())
+                        match self
+                            .resolver
+                            .get_partial_res(bound_pred.bounded_ty.id)
+                            .map(|d| (d.base_res(), d.unresolved_segments()))
+                        {
+                            Some((Res::Def(DefKind::TyParam, def_id), 0))
+                            if bound_pred.bound_generic_params.is_empty() =>
                                 {
-                                    if let Some(def_id) = def_id.as_local() {
-                                        for param in &generics.params {
-                                            if let GenericParamKind::Type { .. } = param.kind {
-                                                if def_id == self.resolver.local_def_id(param.id) {
-                                                    add_bounds
-                                                        .entry(param.id)
-                                                        .or_default()
-                                                        .push(bound.clone());
-                                                    continue 'next_bound;
-                                                }
-                                            }
+                                    for param in &generics.params {
+                                        if def_id == self.resolver.local_def_id(param.id).to_def_id() {
+                                            add_bounds
+                                                .entry(param.id)
+                                                .or_default()
+                                                .push(bound.clone());
+                                            continue 'next_bound;
                                         }
                                     }
                                 }
-                                report_error(self)
-                            }
-                            _ => report_error(self),
+                            _ => {}
                         }
+                        self.diagnostic().span_err(
+                            bound_pred.bounded_ty.span,
+                            "`?Trait` bounds are only permitted at the \
+                                 point where a type parameter is declared",
+                        );
                     }
                 }
             }