-
Notifications
You must be signed in to change notification settings - Fork 889
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add skip_macro_invocations option (#5347)
* feat: add skip_macro_names option * [review] update configuration documentation * [review] fix docstring * [feat] implement wildcard macro invocation skip * commit missed files * [review] test override skip macro names * [review] skip_macro_names -> skip_macro_invocations * [review] expand doc configuration * [review] add lots more tests * [review] add use alias test examples * [review] add link to standard macro behaviour
- Loading branch information
1 parent
2403f82
commit c240f3a
Showing
27 changed files
with
459 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
//! This module contains types and functions to support formatting specific macros. | ||
|
||
use itertools::Itertools; | ||
use std::{fmt, str}; | ||
|
||
use serde::{Deserialize, Serialize}; | ||
use serde_json as json; | ||
use thiserror::Error; | ||
|
||
/// Defines the name of a macro. | ||
#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize)] | ||
pub struct MacroName(String); | ||
|
||
impl MacroName { | ||
pub fn new(other: String) -> Self { | ||
Self(other) | ||
} | ||
} | ||
|
||
impl fmt::Display for MacroName { | ||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
self.0.fmt(f) | ||
} | ||
} | ||
|
||
impl From<MacroName> for String { | ||
fn from(other: MacroName) -> Self { | ||
other.0 | ||
} | ||
} | ||
|
||
/// Defines a selector to match against a macro. | ||
#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize)] | ||
pub enum MacroSelector { | ||
Name(MacroName), | ||
All, | ||
} | ||
|
||
impl fmt::Display for MacroSelector { | ||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
match self { | ||
Self::Name(name) => name.fmt(f), | ||
Self::All => write!(f, "*"), | ||
} | ||
} | ||
} | ||
|
||
impl str::FromStr for MacroSelector { | ||
type Err = std::convert::Infallible; | ||
|
||
fn from_str(s: &str) -> Result<Self, Self::Err> { | ||
Ok(match s { | ||
"*" => MacroSelector::All, | ||
name => MacroSelector::Name(MacroName(name.to_owned())), | ||
}) | ||
} | ||
} | ||
|
||
/// A set of macro selectors. | ||
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)] | ||
pub struct MacroSelectors(pub Vec<MacroSelector>); | ||
|
||
impl fmt::Display for MacroSelectors { | ||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
write!(f, "{}", self.0.iter().format(", ")) | ||
} | ||
} | ||
|
||
#[derive(Error, Debug)] | ||
pub enum MacroSelectorsError { | ||
#[error("{0}")] | ||
Json(json::Error), | ||
} | ||
|
||
// This impl is needed for `Config::override_value` to work for use in tests. | ||
impl str::FromStr for MacroSelectors { | ||
type Err = MacroSelectorsError; | ||
|
||
fn from_str(s: &str) -> Result<Self, Self::Err> { | ||
let raw: Vec<&str> = json::from_str(s).map_err(MacroSelectorsError::Json)?; | ||
Ok(Self( | ||
raw.into_iter() | ||
.map(|raw| { | ||
MacroSelector::from_str(raw).expect("MacroSelector from_str is infallible") | ||
}) | ||
.collect(), | ||
)) | ||
} | ||
} | ||
|
||
#[cfg(test)] | ||
mod test { | ||
use super::*; | ||
use std::str::FromStr; | ||
|
||
#[test] | ||
fn macro_names_from_str() { | ||
let macro_names = MacroSelectors::from_str(r#"["foo", "*", "bar"]"#).unwrap(); | ||
assert_eq!( | ||
macro_names, | ||
MacroSelectors( | ||
[ | ||
MacroSelector::Name(MacroName("foo".to_owned())), | ||
MacroSelector::All, | ||
MacroSelector::Name(MacroName("bar".to_owned())) | ||
] | ||
.into_iter() | ||
.collect() | ||
) | ||
); | ||
} | ||
|
||
#[test] | ||
fn macro_names_display() { | ||
let macro_names = MacroSelectors::from_str(r#"["foo", "*", "bar"]"#).unwrap(); | ||
assert_eq!(format!("{}", macro_names), "foo, *, bar"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
// rustfmt-skip_macro_invocations: ["*"] | ||
|
||
// Should skip this invocation | ||
items!( | ||
const _: u8 = 0; | ||
); | ||
|
||
// Should skip this invocation | ||
renamed_items!( | ||
const _: u8 = 0; | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
// rustfmt-skip_macro_invocations: ["*","items"] | ||
|
||
// Should skip this invocation | ||
items!( | ||
const _: u8 = 0; | ||
); | ||
|
||
// Should also skip this invocation, as the wildcard covers it | ||
renamed_items!( | ||
const _: u8 = 0; | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
// rustfmt-skip_macro_invocations: [] | ||
|
||
// Should not skip this invocation | ||
items!( | ||
const _: u8 = 0; | ||
); | ||
|
||
// Should not skip this invocation | ||
renamed_items!( | ||
const _: u8 = 0; | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
// rustfmt-skip_macro_invocations: ["items"] | ||
|
||
// Should skip this invocation | ||
items!( | ||
const _: u8 = 0; | ||
); | ||
|
||
// Should not skip this invocation | ||
renamed_items!( | ||
const _: u8 = 0; | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
// rustfmt-skip_macro_invocations: ["unknown"] | ||
|
||
// Should not skip this invocation | ||
items!( | ||
const _: u8 = 0; | ||
); |
Oops, something went wrong.