about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2021-06-21 14:36:25 -0400
committerNiko Matsakis <niko@alum.mit.edu>2021-06-21 14:36:25 -0400
commitaa3580baa6f5ef69aba41a63297fb659bcd4b793 (patch)
treefe9aabc99b4d48f2d853988205a11944d1b619c7
parent186c09ae8381e0c8fb43c1d47341649d214362ad (diff)
downloadrust-aa3580baa6f5ef69aba41a63297fb659bcd4b793.tar.gz
rust-aa3580baa6f5ef69aba41a63297fb659bcd4b793.zip
introduce helper function
-rw-r--r--compiler/rustc_typeck/src/check/method/prelude2021.rs54
1 files changed, 32 insertions, 22 deletions
diff --git a/compiler/rustc_typeck/src/check/method/prelude2021.rs b/compiler/rustc_typeck/src/check/method/prelude2021.rs
index 0750567d3dd..4c925a6f237 100644
--- a/compiler/rustc_typeck/src/check/method/prelude2021.rs
+++ b/compiler/rustc_typeck/src/check/method/prelude2021.rs
@@ -137,28 +137,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                         segment.ident.name
                     ));
 
-                    if let Ok(self_expr) = self.sess().source_map().span_to_snippet(self_expr.span)
-                    {
-                        let derefs = "*".repeat(pick.autoderefs);
-
-                        let autoref = match pick.autoref_or_ptr_adjustment {
-                            Some(probe::AutorefOrPtrAdjustment::Autoref {
-                                mutbl: Mutability::Mut,
-                                ..
-                            }) => "&mut ",
-                            Some(probe::AutorefOrPtrAdjustment::Autoref {
-                                mutbl: Mutability::Not,
-                                ..
-                            }) => "&",
-                            Some(probe::AutorefOrPtrAdjustment::ToConstPtr) | None => "",
-                        };
-                        let self_adjusted = if let Some(probe::AutorefOrPtrAdjustment::ToConstPtr) =
-                            pick.autoref_or_ptr_adjustment
-                        {
-                            format!("{}{} as *const _", derefs, self_expr)
-                        } else {
-                            format!("{}{}{}", autoref, derefs, self_expr)
-                        };
+                    let (self_adjusted, precise) = self.adjust_expr(pick, self_expr);
+                    if precise {
                         let args = args
                             .iter()
                             .skip(1)
@@ -317,4 +297,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
             }
         }
     }
+
+    /// Creates a string version of the `expr` that includes explicit adjustments.
+    /// Returns the string and also a bool indicating whther this is a *precise*
+    /// suggestion.
+    fn adjust_expr(&self, pick: &Pick<'tcx>, expr: &hir::Expr<'tcx>) -> (String, bool) {
+        let derefs = "*".repeat(pick.autoderefs);
+
+        let autoref = match pick.autoref_or_ptr_adjustment {
+            Some(probe::AutorefOrPtrAdjustment::Autoref { mutbl: Mutability::Mut, .. }) => "&mut ",
+            Some(probe::AutorefOrPtrAdjustment::Autoref { mutbl: Mutability::Not, .. }) => "&",
+            Some(probe::AutorefOrPtrAdjustment::ToConstPtr) | None => "",
+        };
+
+        let (expr_text, precise) =
+            if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
+                (expr_text, true)
+            } else {
+                (format!("(..)"), false)
+            };
+
+        let adjusted_text = if let Some(probe::AutorefOrPtrAdjustment::ToConstPtr) =
+            pick.autoref_or_ptr_adjustment
+        {
+            format!("{}{} as *const _", derefs, expr_text)
+        } else {
+            format!("{}{}{}", autoref, derefs, expr_text)
+        };
+
+        (adjusted_text, precise)
+    }
 }