From a3c6e73c65526af7d586bf33e7d9a5261b59782b Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Tue, 16 Feb 2021 16:35:47 +0200 Subject: [PATCH] Fix for issue 4603 about extra macro body indentation (third version) --- src/formatting.rs | 4 ++++ src/lib.rs | 27 ++++++++++++++++++---- tests/source/issue-4603.rs | 47 ++++++++++++++++++++++++++++++++++++++ tests/target/issue-4603.rs | 47 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 tests/source/issue-4603.rs create mode 100644 tests/target/issue-4603.rs diff --git a/src/formatting.rs b/src/formatting.rs index 289e58cf693..5435d108737 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -331,6 +331,9 @@ pub(crate) struct ReportedErrors { /// Formatted code differs from existing code (--check only). pub(crate) has_diff: bool, + + /// Formatted code missed something, like lost comments or extra trailing space + pub(crate) has_unformatted_code_errors: bool, } impl ReportedErrors { @@ -342,6 +345,7 @@ impl ReportedErrors { self.has_macro_format_failure |= other.has_macro_format_failure; self.has_check_errors |= other.has_check_errors; self.has_diff |= other.has_diff; + self.has_unformatted_code_errors |= other.has_unformatted_code_errors; } } diff --git a/src/lib.rs b/src/lib.rs index 370b7eb6c4e..db48b52f440 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -210,14 +210,22 @@ impl FormatReport { if !new_errors.is_empty() { errs.has_formatting_errors = true; } - if errs.has_operational_errors && errs.has_check_errors { + if errs.has_operational_errors && errs.has_check_errors && errs.has_unformatted_code_errors + { return; } for err in new_errors { match err.kind { - ErrorKind::LineOverflow(..) | ErrorKind::TrailingWhitespace => { + ErrorKind::LineOverflow(..) => { errs.has_operational_errors = true; } + ErrorKind::TrailingWhitespace => { + errs.has_operational_errors = true; + errs.has_unformatted_code_errors = true; + } + ErrorKind::LostComment => { + errs.has_unformatted_code_errors = true; + } ErrorKind::BadIssue(_) | ErrorKind::LicenseCheck | ErrorKind::DeprecatedAttr @@ -294,6 +302,9 @@ fn format_snippet(snippet: &str, config: &Config, is_macro_def: bool) -> Option< config.set().emit_mode(config::EmitMode::Stdout); config.set().verbose(Verbosity::Quiet); config.set().hide_parse_errors(true); + if is_macro_def { + config.set().error_on_unformatted(true); + } let (formatting_error, result) = { let input = Input::Text(snippet.into()); @@ -302,7 +313,8 @@ fn format_snippet(snippet: &str, config: &Config, is_macro_def: bool) -> Option< ( session.errors.has_macro_format_failure || session.out.as_ref().unwrap().is_empty() && !snippet.is_empty() - || result.is_err(), + || result.is_err() + || (is_macro_def && session.has_unformatted_code_errors()), result, ) }; @@ -477,13 +489,18 @@ impl<'b, T: Write + 'b> Session<'b, T> { self.errors.has_diff } + pub fn has_unformatted_code_errors(&self) -> bool { + self.errors.has_unformatted_code_errors + } + pub fn has_no_errors(&self) -> bool { !(self.has_operational_errors() || self.has_parsing_errors() || self.has_formatting_errors() || self.has_check_errors() - || self.has_diff()) - || self.errors.has_macro_format_failure + || self.has_diff() + || self.has_unformatted_code_errors() + || self.errors.has_macro_format_failure) } } diff --git a/tests/source/issue-4603.rs b/tests/source/issue-4603.rs new file mode 100644 index 00000000000..ba0803e0eca --- /dev/null +++ b/tests/source/issue-4603.rs @@ -0,0 +1,47 @@ +// Formatting when original macro snippet is used + +// Original issue #4603 code +#![feature(or_patterns)] +macro_rules! t_or_f { + () => { + (true // some comment + | false) + }; +} + +// Other test cases variations +macro_rules! RULES { + () => { + ( + xxxxxxx // COMMENT + | yyyyyyy + ) + }; +} +macro_rules! RULES { + () => { + (xxxxxxx // COMMENT + | yyyyyyy) + }; +} + +fn main() { + macro_rules! RULES { + () => { + (xxxxxxx // COMMENT + | yyyyyyy) + }; + } +} + +macro_rules! RULES { + () => { + (xxxxxxx /* COMMENT */ | yyyyyyy) + }; +} +macro_rules! RULES { + () => { + (xxxxxxx /* COMMENT */ + | yyyyyyy) + }; +} diff --git a/tests/target/issue-4603.rs b/tests/target/issue-4603.rs new file mode 100644 index 00000000000..e8c368a247f --- /dev/null +++ b/tests/target/issue-4603.rs @@ -0,0 +1,47 @@ +// Formatting when original macro snippet is used + +// Original issue #4603 code +#![feature(or_patterns)] +macro_rules! t_or_f { + () => { + (true // some comment + | false) + }; +} + +// Other test cases variations +macro_rules! RULES { + () => { + ( + xxxxxxx // COMMENT + | yyyyyyy + ) + }; +} +macro_rules! RULES { + () => { + (xxxxxxx // COMMENT + | yyyyyyy) + }; +} + +fn main() { + macro_rules! RULES { + () => { + (xxxxxxx // COMMENT + | yyyyyyy) + }; + } +} + +macro_rules! RULES { + () => { + (xxxxxxx /* COMMENT */ | yyyyyyy) + }; +} +macro_rules! RULES { + () => { + (xxxxxxx /* COMMENT */ + | yyyyyyy) + }; +}