rust-lang / rust.vim

Vim configuration for Rust.
Apache License 2.0
3.91k stars 297 forks source link

Display richer error message #403

Open robinmoussu opened 4 years ago

robinmoussu commented 4 years ago

Tested with vim 8.2 and nvim 0.5.0-dev on fedora 30, with the current master of rust.vim (9e6836f44528312171b21a78d9228c88615f63ae) and the current master branch of syntastic (b3e2d8470fddc7f2b598f09023ebc5045a3fb1fd)

Steps to reproduce:

Type some rust code and wait for the error to be displayed in the location list (or open it manually with :lopen)

Currently the location list windows looks like this:

lib/dice_system.rs|34 col 5 error| struct is not supported in `trait`s or `impl`s                                                                                                                                                             
lib/dice_system.rs|41 col 5 error| associated type in `impl` without body
lib/dice_system.rs|41 col 23 error| bounds on `type`s in `impl`s have no effect
lib/dice_system.rs|53 col 5 error| associated function in `impl` without body
lib/dice_system.rs|54 col 5 error| associated function in `impl` without body

This is the same output that if you do manually (in command mode):

set makeprg=cargo\ check\ --message-format=short
make
copen

If I do change it to

set makeprg=cargo\ check\ --message-format=human

I get much nicer details

||     Checking pyrite v0.1.0 (/home/rmoussu/perso/brolisteam/pyrite)
lib/dice_system.rs|34 col 5 error| struct is not supported in `trait`s or `impl`s                                                                                                                                                             
||    |
|| 34 |     struct DiceInformation {
||    |     ^^^^^^^^^^^^^^^^^^^^^^
lib/dice_system.rs|41 col 5 error| associated type in `impl` without body
||    |
|| 41 |     type DiceDisplay: Display;
||    |     ^^^^^^^^^^^^^^^^^^^^^^^^^-
||    |                              |
||    |                              help: provide a definition for the type: `= <type>;`
lib/dice_system.rs|41 col 23 error| bounds on `type`s in `impl`s have no effect
||    |
|| 41 |     type DiceDisplay: Display;
||    |                       ^^^^^^^

I didn't found a way to specify the --message-format used by rust.vim It is possible? I am willing to do a PR, but I don't know where to look. I can also modify the errorformat used by rust.vim to correctly parse the multiline error but I don't know either where to look.

Using rust.vim + syntastic is much nicer that calling :make by hand since you have instant feedback, and it also works even if you have autochdir set.

I assume it's not possible to add colors (I don't think it's possible to display ANSI colors in vim – I have no idea if it's possible for neovim). If it was possible, then ideally --message-format=json-diagnostic-rendered-ansi should be used.

daveriedstra commented 4 years ago

what might be really nice is if the details were wrapped under the short error message, closed by default (maybe open if there's only one or something), so you can easily access them with z-o but still have a nice overview.