about summary refs log tree commit diff
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
parent61709488204bce4f82456d01482e5c31bb9e8b17 (diff)
downloadrust-4b0ed96f2eed2e49da2cceba550732ce9e7e461e.tar.gz
rust-4b0ed96f2eed2e49da2cceba550732ce9e7e461e.zip
Fix for issue 4603 about extra macro body indentation (third version)
-rw-r--r--src/formatting.rs4
-rw-r--r--src/lib.rs27
-rw-r--r--tests/source/issue-4603.rs47
-rw-r--r--tests/target/issue-4603.rs47
4 files changed, 120 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)
     }
 }
 
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)
+    };
+}