about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDavid Bar-On <david.cdb004@gmail.com>2021-02-16 16:35:47 +0200
committerCaleb Cartwright <calebcartwright@users.noreply.github.com>2021-02-17 20:19:27 -0600
commit4b0ed96f2eed2e49da2cceba550732ce9e7e461e (patch)
treef95c88deaffa905d82a62c78c49511c74191448d /src
parent61709488204bce4f82456d01482e5c31bb9e8b17 (diff)
downloadrust-4b0ed96f2eed2e49da2cceba550732ce9e7e461e.tar.gz
rust-4b0ed96f2eed2e49da2cceba550732ce9e7e461e.zip
Fix for issue 4603 about extra macro body indentation (third version)
Diffstat (limited to 'src')
-rw-r--r--src/formatting.rs4
-rw-r--r--src/lib.rs27
2 files changed, 26 insertions, 5 deletions
diff --git a/src/formatting.rs b/src/formatting.rs
index 185b53b3987..e42864a5055 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)
     }
 }