rust/compiler
bors 71569e4201 Auto merge of #75138 - jumbatm:session-diagnostic-derive, r=oli-obk
Add derive macro for specifying diagnostics using attributes.

Introduces `#[derive(SessionDiagnostic)]`, a derive macro for specifying structs that can be converted to Diagnostics using directions given by attributes on the struct and its fields. Currently, the following attributes have been implemented:
- `#[code = "..."]` -- this sets the Diagnostic's error code, and must be provided on the struct iself (ie, not on a field). Equivalent to calling `code`.
- `#[message = "..."]` -- this sets the Diagnostic's primary error message.
- `#[label = "..."]` -- this must be applied to fields of type `Span`, and is equivalent to `span_label`
- `#[suggestion(..)]` -- this allows a suggestion message to be supplied. This attribute must be applied to a field of type `Span` or `(Span, Applicability)`, and is equivalent to calling `span_suggestion`. Valid arguments are:
    - `message = "..."` -- this sets the suggestion message.
    - (Optional) `code = "..."` -- this suggests code for the suggestion. Defaults to empty.

`suggestion`also  comes with other variants: `#[suggestion_short(..)]`, `#[suggestion_hidden(..)]` and `#[suggestion_verbose(..)]` which all take the same keys.

Within the strings passed to each attribute, fields can be referenced without needing to be passed explicitly into the format string -- eg, `#[error = "{ident} already declared"] ` will set the error message to `format!("{} already declared", &self.ident)`. Any fields on the struct can be referenced in this way.

Additionally, for any of these attributes, Option fields can be used to only optionally apply the decoration -- for example:

```rust
#[derive(SessionDiagnostic)]
#[code = "E0123"]
struct SomeKindOfError {
    ...
    #[suggestion(message = "informative error message")]
    opt_sugg: Option<(Span, Applicability)>
    ...
}
```
will not emit a suggestion if `opt_sugg` is `None`.

We plan on iterating on this macro further; this PR is a start.

Closes #61132.

r? `@oli-obk`
2020-09-08 00:58:43 +00:00
..
rustc
rustc_apfloat
rustc_arena
rustc_ast Rollup merge of #76274 - scottmcm:fix-76271, r=petrochenkov 2020-09-07 01:17:46 +02:00
rustc_ast_lowering
rustc_ast_passes Implementation of incompatible features error 2020-09-04 22:17:28 +08:00
rustc_ast_pretty Auto merge of #76170 - matklad:notrivia, r=petrochenkov 2020-09-02 03:19:38 +00:00
rustc_attr
rustc_builtin_macros Improve recovery on malformed format call 2020-09-02 13:18:19 +02:00
rustc_codegen_llvm Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_codegen_ssa Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_data_structures Add BREAK too, and improve the comments 2020-09-04 16:28:23 -07:00
rustc_driver Auto merge of #73996 - da-x:short-unique-paths, r=petrochenkov 2020-09-03 23:27:45 +00:00
rustc_error_codes Auto merge of #75138 - jumbatm:session-diagnostic-derive, r=oli-obk 2020-09-08 00:58:43 +00:00
rustc_errors rustc_{errors,session}: add delay_good_path_bug 2020-09-02 10:43:17 +03:00
rustc_expand Optimize Cursor::look_ahead 2020-09-03 23:28:22 +02:00
rustc_feature Implementation of incompatible features error 2020-09-04 22:17:28 +08:00
rustc_fs_util
rustc_graphviz
rustc_hir add track_caller to local_def_id_to_hir_id 2020-09-04 09:24:44 +02:00
rustc_hir_pretty
rustc_incremental
rustc_index
rustc_infer ty.flags -> ty.flags() 2020-09-04 18:28:20 +02:00
rustc_interface Auto merge of #73996 - da-x:short-unique-paths, r=petrochenkov 2020-09-03 23:27:45 +00:00
rustc_lexer lexer: Tiny improvement to shebang detection 2020-09-02 00:40:19 +03:00
rustc_lint Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_macros Auto merge of #75138 - jumbatm:session-diagnostic-derive, r=oli-obk 2020-09-08 00:58:43 +00:00
rustc_metadata Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_middle Rollup merge of #76340 - jonas-schievink:rm-dupe, r=Mark-Simulacrum 2020-09-07 01:18:10 +02:00
rustc_mir Auto merge of #76044 - ecstatic-morse:dataflow-lattice, r=oli-obk 2020-09-07 21:29:43 +00:00
rustc_mir_build Rollup merge of #76318 - scottmcm:one-control-flow, r=ecstatic-morse 2020-09-07 01:18:05 +02:00
rustc_parse Optimize Cursor::look_ahead 2020-09-03 23:28:22 +02:00
rustc_parse_format
rustc_passes Auto merge of #75888 - GuillaumeGomez:trait-impl-assoc-const-doc-alias, r=ollie27 2020-09-05 09:35:17 +00:00
rustc_plugin_impl
rustc_privacy Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_query_system
rustc_resolve Rollup merge of #76143 - jyn514:duplicate-builtin-macros, r=petrochenkov 2020-09-01 18:24:35 -07:00
rustc_save_analysis Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_serialize
rustc_session Auto merge of #75138 - jumbatm:session-diagnostic-derive, r=oli-obk 2020-09-08 00:58:43 +00:00
rustc_span
rustc_symbol_mangling Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_target Rollup merge of #76364 - fusion-engineering-forks:avr-no-atomic, r=jonas-schievink 2020-09-07 01:18:17 +02:00
rustc_trait_selection ty.flags -> ty.flags() 2020-09-04 18:28:20 +02:00
rustc_traits kind -> kind() 2020-09-04 19:17:57 -04:00
rustc_ty Change ty.kind to a method 2020-09-04 17:47:51 +02:00
rustc_typeck Auto merge of #75138 - jumbatm:session-diagnostic-derive, r=oli-obk 2020-09-08 00:58:43 +00:00