mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 10:48:32 +00:00

The idea is nice and simple we replace: fn placeholder() -> Self; with fn message_formats() -> &'static [&'static str]; So e.g. if a Violation implementation defines: fn message(&self) -> String { format!("Local variable `{name}` is assigned to but never used") } it would also have to define: fn message_formats() -> &'static [&'static str] { &["Local variable `{name}` is assigned to but never used"] } Since we however obviously do not want to duplicate all of our format strings we simply introduce a new procedural macro attribute #[derive_message_formats] that can be added to the message method declaration in order to automatically derive the message_formats implementation. This commit implements the macro. The following and final commit updates violations.rs to use the macro. (The changes have been separated because the next commit is autogenerated via a Python script.)
44 lines
1.4 KiB
Rust
44 lines
1.4 KiB
Rust
//! This crate implements internal macros for the `ruff` library.
|
|
#![allow(
|
|
clippy::collapsible_else_if,
|
|
clippy::collapsible_if,
|
|
clippy::implicit_hasher,
|
|
clippy::match_same_arms,
|
|
clippy::missing_errors_doc,
|
|
clippy::missing_panics_doc,
|
|
clippy::module_name_repetitions,
|
|
clippy::must_use_candidate,
|
|
clippy::similar_names,
|
|
clippy::too_many_lines
|
|
)]
|
|
#![forbid(unsafe_code)]
|
|
|
|
use proc_macro::TokenStream;
|
|
use syn::{parse_macro_input, DeriveInput, ItemFn};
|
|
|
|
mod config;
|
|
mod define_rule_mapping;
|
|
mod derive_message_formats;
|
|
mod prefixes;
|
|
mod rule_code_prefix;
|
|
|
|
#[proc_macro_derive(ConfigurationOptions, attributes(option, doc, option_group))]
|
|
pub fn derive_config(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
let input = parse_macro_input!(input as DeriveInput);
|
|
|
|
config::derive_impl(input)
|
|
.unwrap_or_else(syn::Error::into_compile_error)
|
|
.into()
|
|
}
|
|
|
|
#[proc_macro]
|
|
pub fn define_rule_mapping(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
let mapping = parse_macro_input!(item as define_rule_mapping::Mapping);
|
|
define_rule_mapping::define_rule_mapping(&mapping).into()
|
|
}
|
|
|
|
#[proc_macro_attribute]
|
|
pub fn derive_message_formats(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
let func = parse_macro_input!(item as ItemFn);
|
|
derive_message_formats::derive_message_formats(&func).into()
|
|
}
|