Unergonomic structured suggestions in rustc

38c7b87
Opened by Oli Scherer at 2018-02-01 10:52:28

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

  1. 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_snippet should fail? Are malformed codemaps and the like an expected contingency to return Err on, or a rare bug that we should .expect not to happen?

    Zack M. Davis at 2018-02-01 10:14:16

  2. macros and stuff, usually. not all spans come from a contiguous region of code

    Manish Goregaokar at 2018-02-01 10:19:35