I was discussing the designing of APIs for a UI framework, and the issue came up that error messages can be very opaque. As the API designers, we have more information than the compiler, and we could use this information to modify the error messages to be more useful to the downstream user. So the question is: could rustc expose some way of modifying errors before reporting them, similar to how proc macros work on source code.
This is definitely a raw idea rather than a developed proposal. I'm just interested if the same idea has come up before?
I agree, and this isn't about dealing with some defficiency with rustc error messages themselves. The problem comes when you have types that use a lot of generics. A contrived example might be a tree, where a Child trait is implemented by tuples. You could imagine how this could cause a type explosion.
A real-world example of the error messages that we would like to avoid is
the trait `ElementTree<u16, ButtonPressed>` is not implemented for `Row<ElementTuple_4<WithEvent<u16, &ButtonPressed, capitaine::elements::Button<u16, &ButtonPressed>, [closure@examples/list.rs:31:42: 34:10]>, capitaine::elements::Label<u16, &ButtonPressed>, capitaine::elements::Label<u16, &ButtonPressed>, capitaine::elements::Label<u16, &ButtonPressed>, u16, &ButtonPressed>, u16, &ButtonPressed>`
The user will have used the wrong type somewhere in the tree, and we as the API writers will be able to work out where, but since rustc knows nothing about our API it's not reasonable to expect it to give the optimal error message.
I think that rusc still has room for improvements wrt tuple trait errors. I think there are only a couple of patterns for performing generic variadic type gymnastics. Maybe if you point out what the missing link was, we'll be able to come up with an error pattern that can find and point out those sorts of missing links.
I read that the link you posted, and it looks like the second item you mention is the same as what I'm getting at. The buy-in it needs from rustc is some kinda of minimal stability on error messages, in any format, and possibly the cargo support you talk about.