Skip to content

Commit aa3580b

Browse files
committed
introduce helper function
1 parent 186c09a commit aa3580b

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed

compiler/rustc_typeck/src/check/method/prelude2021.rs

+32-22
Original file line numberDiff line numberDiff line change
@@ -137,28 +137,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
137137
segment.ident.name
138138
));
139139

140-
if let Ok(self_expr) = self.sess().source_map().span_to_snippet(self_expr.span)
141-
{
142-
let derefs = "*".repeat(pick.autoderefs);
143-
144-
let autoref = match pick.autoref_or_ptr_adjustment {
145-
Some(probe::AutorefOrPtrAdjustment::Autoref {
146-
mutbl: Mutability::Mut,
147-
..
148-
}) => "&mut ",
149-
Some(probe::AutorefOrPtrAdjustment::Autoref {
150-
mutbl: Mutability::Not,
151-
..
152-
}) => "&",
153-
Some(probe::AutorefOrPtrAdjustment::ToConstPtr) | None => "",
154-
};
155-
let self_adjusted = if let Some(probe::AutorefOrPtrAdjustment::ToConstPtr) =
156-
pick.autoref_or_ptr_adjustment
157-
{
158-
format!("{}{} as *const _", derefs, self_expr)
159-
} else {
160-
format!("{}{}{}", autoref, derefs, self_expr)
161-
};
140+
let (self_adjusted, precise) = self.adjust_expr(pick, self_expr);
141+
if precise {
162142
let args = args
163143
.iter()
164144
.skip(1)
@@ -317,4 +297,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
317297
}
318298
}
319299
}
300+
301+
/// Creates a string version of the `expr` that includes explicit adjustments.
302+
/// Returns the string and also a bool indicating whther this is a *precise*
303+
/// suggestion.
304+
fn adjust_expr(&self, pick: &Pick<'tcx>, expr: &hir::Expr<'tcx>) -> (String, bool) {
305+
let derefs = "*".repeat(pick.autoderefs);
306+
307+
let autoref = match pick.autoref_or_ptr_adjustment {
308+
Some(probe::AutorefOrPtrAdjustment::Autoref { mutbl: Mutability::Mut, .. }) => "&mut ",
309+
Some(probe::AutorefOrPtrAdjustment::Autoref { mutbl: Mutability::Not, .. }) => "&",
310+
Some(probe::AutorefOrPtrAdjustment::ToConstPtr) | None => "",
311+
};
312+
313+
let (expr_text, precise) =
314+
if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
315+
(expr_text, true)
316+
} else {
317+
(format!("(..)"), false)
318+
};
319+
320+
let adjusted_text = if let Some(probe::AutorefOrPtrAdjustment::ToConstPtr) =
321+
pick.autoref_or_ptr_adjustment
322+
{
323+
format!("{}{} as *const _", derefs, expr_text)
324+
} else {
325+
format!("{}{}{}", autoref, derefs, expr_text)
326+
};
327+
328+
(adjusted_text, precise)
329+
}
320330
}

0 commit comments

Comments
 (0)