Unergonomic structured suggestions in rustc
While checking span_helps that could be span_suggestion I noticed that rustc contains lots of code similar to
match fcx.tcx.sess.codemap().span_to_snippet(self.cast_span) {
Ok(s) => {
err.span_suggestion(self.cast_span,
"try casting to a reference instead",
format!("&{}{}", mtstr, s));
}
Err(_) => {
span_help!(err, self.cast_span, "did you mean `&{}{}`?", mtstr, tstr)
}
}
where we try to get a snippet and if that fails, since we can't produce a nice suggestion, we produce a help message that contains a message.
We should probably provide a helper for that. First I thought that we could add a helper that does essentially the above without all the duplication, but with the new approximate suggestions (#47540) we can always produce the suggestion, but mark it as approximate if we need to use the fallback value.
I'd assume the above example would look something like this:
err.span_possibly_approximate_suggestion(
self.cast_span, // span to replace
"try casting to a reference instead", // message
fcx.tcx.sess.codemap().span_to_snippet(self.cast_span).ok(), // optional snippet
tstr, // default if snippet is none
|snip| format!("&{}{}", mtstr, snip), // closure taking snippet and producing the replacement code
);
cc @Manishearth @nrc
where we try to get a snippet [...] and if that fails
(This is probably a really dumb question, but this API had bugged me for a while, so just in case my intuition isn't going haywire here—)
If we can know that spans are valid, is there much reason
span_to_snippetshould fail? Are malformed codemaps and the like an expected contingency to returnErron, or a rare bug that we should.expectnot to happen?Zack M. Davis at 2018-02-01 10:14:16
macros and stuff, usually. not all spans come from a contiguous region of code
Manish Goregaokar at 2018-02-01 10:19:35