diff options
| author | David Wood <david.wood@huawei.com> | 2022-04-27 05:43:36 +0100 |
|---|---|---|
| committer | David Wood <david.wood@huawei.com> | 2022-04-29 02:12:10 +0100 |
| commit | e5d9371b302ff0d368ea6e075769eb4b2709b2ba (patch) | |
| tree | 6a5de85fdcd1e9a5286819c4d1b2bada3784cbb7 /compiler/rustc_macros/src/diagnostics/utils.rs | |
| parent | e8ee0d7a20432bafaa59c04a9ad99c3b040d395f (diff) | |
| download | rust-e5d9371b302ff0d368ea6e075769eb4b2709b2ba.tar.gz rust-e5d9371b302ff0d368ea6e075769eb4b2709b2ba.zip | |
macros: allow setting applicability in attribute
In the initial implementation of the `SessionSubdiagnostic`, the `Applicability` of a suggestion can be set both as a field and as part of the attribute, this commit adds the same support to the original `SessionDiagnostic` derive. Signed-off-by: David Wood <david.wood@huawei.com>
Diffstat (limited to 'compiler/rustc_macros/src/diagnostics/utils.rs')
| -rw-r--r-- | compiler/rustc_macros/src/diagnostics/utils.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/compiler/rustc_macros/src/diagnostics/utils.rs b/compiler/rustc_macros/src/diagnostics/utils.rs index 6791a9e35b8..1f36af0a20b 100644 --- a/compiler/rustc_macros/src/diagnostics/utils.rs +++ b/compiler/rustc_macros/src/diagnostics/utils.rs @@ -3,6 +3,7 @@ use proc_macro::Span; use proc_macro2::TokenStream; use quote::{format_ident, quote}; use std::collections::BTreeSet; +use std::str::FromStr; use syn::{spanned::Spanned, Attribute, Meta, Type, Visibility}; use synstructure::BindingInfo; @@ -222,3 +223,45 @@ pub(crate) trait HasFieldMap { } } } + +/// `Applicability` of a suggestion - mirrors `rustc_errors::Applicability` - and used to represent +/// the user's selection of applicability if specified in an attribute. +pub(crate) enum Applicability { + MachineApplicable, + MaybeIncorrect, + HasPlaceholders, + Unspecified, +} + +impl FromStr for Applicability { + type Err = (); + + fn from_str(s: &str) -> Result<Self, Self::Err> { + match s { + "machine-applicable" => Ok(Applicability::MachineApplicable), + "maybe-incorrect" => Ok(Applicability::MaybeIncorrect), + "has-placeholders" => Ok(Applicability::HasPlaceholders), + "unspecified" => Ok(Applicability::Unspecified), + _ => Err(()), + } + } +} + +impl quote::ToTokens for Applicability { + fn to_tokens(&self, tokens: &mut TokenStream) { + tokens.extend(match self { + Applicability::MachineApplicable => { + quote! { rustc_errors::Applicability::MachineApplicable } + } + Applicability::MaybeIncorrect => { + quote! { rustc_errors::Applicability::MaybeIncorrect } + } + Applicability::HasPlaceholders => { + quote! { rustc_errors::Applicability::HasPlaceholders } + } + Applicability::Unspecified => { + quote! { rustc_errors::Applicability::Unspecified } + } + }); + } +} |
