Skip to content

Commit

Permalink
Fix for issue 4603 about extra macro body indentation (third version)
Browse files Browse the repository at this point in the history
  • Loading branch information
davidBar-On committed Feb 16, 2021
1 parent 7de6968 commit a3c6e73
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 5 deletions.
4 changes: 4 additions & 0 deletions src/formatting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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;
}
}

Expand Down
27 changes: 22 additions & 5 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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());
Expand All @@ -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,
)
};
Expand Down Expand Up @@ -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)
}
}

Expand Down
47 changes: 47 additions & 0 deletions tests/source/issue-4603.rs
Original file line number Diff line number Diff line change
@@ -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)
};
}
47 changes: 47 additions & 0 deletions tests/target/issue-4603.rs
Original file line number Diff line number Diff line change
@@ -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)
};
}

0 comments on commit a3c6e73

Please sign in to comment.