Add sub-fn for method call annotation in FnCtxt::report_no_match_method_error
Currently this method is quiet long and complex, this commit
refactors it and improves its readability by adding sub-fn
diff --git a/compiler/rustc_hir_typeck/src/method/suggest.rs b/compiler/rustc_hir_typeck/src/method/suggest.rs
index a0d9e9a..56f4a2a 100644
--- a/compiler/rustc_hir_typeck/src/method/suggest.rs
+++ b/compiler/rustc_hir_typeck/src/method/suggest.rs
@@ -666,6 +666,52 @@ fn visit_pat(&mut self, p: &'v hir::Pat<'v>) -> Self::Result {
}
}
+ fn suggest_method_call_annotation(
+ &self,
+ err: &mut Diag<'_>,
+ span: Span,
+ rcvr_ty: Ty<'tcx>,
+ item_ident: Ident,
+ mode: Mode,
+ source: SelfSource<'tcx>,
+ expected: Expectation<'tcx>,
+ ) {
+ if let Mode::MethodCall = mode
+ && let SelfSource::MethodCall(cal) = source
+ {
+ self.suggest_await_before_method(
+ err,
+ item_ident,
+ rcvr_ty,
+ cal,
+ span,
+ expected.only_has_type(self),
+ );
+ }
+
+ self.suggest_on_pointer_type(err, source, rcvr_ty, item_ident);
+
+ if let SelfSource::MethodCall(rcvr_expr) = source {
+ self.suggest_fn_call(err, rcvr_expr, rcvr_ty, |output_ty| {
+ let call_expr = self.tcx.hir_expect_expr(self.tcx.parent_hir_id(rcvr_expr.hir_id));
+ let probe = self.lookup_probe_for_diagnostic(
+ item_ident,
+ output_ty,
+ call_expr,
+ ProbeScope::AllTraits,
+ expected.only_has_type(self),
+ );
+ probe.is_ok()
+ });
+ self.note_internal_mutation_in_method(
+ err,
+ rcvr_expr,
+ expected.to_option(self),
+ rcvr_ty,
+ );
+ }
+ }
+
fn report_no_match_method_error(
&self,
mut span: Span,
@@ -754,40 +800,9 @@ fn report_no_match_method_error(
args,
);
- if let Mode::MethodCall = mode
- && let SelfSource::MethodCall(cal) = source
- {
- self.suggest_await_before_method(
- &mut err,
- item_ident,
- rcvr_ty,
- cal,
- span,
- expected.only_has_type(self),
- );
- }
-
- self.suggest_on_pointer_type(&mut err, source, rcvr_ty, item_ident);
-
- if let SelfSource::MethodCall(rcvr_expr) = source {
- self.suggest_fn_call(&mut err, rcvr_expr, rcvr_ty, |output_ty| {
- let call_expr = self.tcx.hir_expect_expr(self.tcx.parent_hir_id(rcvr_expr.hir_id));
- let probe = self.lookup_probe_for_diagnostic(
- item_ident,
- output_ty,
- call_expr,
- ProbeScope::AllTraits,
- expected.only_has_type(self),
- );
- probe.is_ok()
- });
- self.note_internal_mutation_in_method(
- &mut err,
- rcvr_expr,
- expected.to_option(self),
- rcvr_ty,
- );
- }
+ self.suggest_method_call_annotation(
+ &mut err, span, rcvr_ty, item_ident, mode, source, expected,
+ );
let mut custom_span_label = false;
let mut static_candidates = no_match_data.static_candidates.clone();