diff --git a/Configurations.md b/Configurations.md index 49e7e4e6489..ae8099fd694 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1050,8 +1050,8 @@ Max width for code snippets included in doc comments. Only used if [`format_code ## `format_generated_files` -Format generated files. A file is considered generated -if any of the first five lines contain a `@generated` comment marker. +Format generated files. A file is considered generated if any of the first several lines contain a `@generated` comment marker. The number of lines to check is configured by `generated_file_header_size`. + By default, generated files are reformatted, i. e. `@generated` marker is ignored. This option is currently ignored for stdin (`@generated` in stdin is ignored.) @@ -1059,6 +1059,14 @@ This option is currently ignored for stdin (`@generated` in stdin is ignored.) - **Possible values**: `true`, `false` - **Stable**: No (tracking issue: [#5080](https://github.com/rust-lang/rustfmt/issues/5080)) +## `generated_file_header_size` + +Number of lines to check for a `@generated` pragma header when `format_generated_files` is enabled. When `format_generated_files` is disabled, this option has no effect. + +- **Default value**: `5` +- **Possible values**: any positive integer +- **Stable**: No (tracking issue: [#5080](https://github.com/rust-lang/rustfmt/issues/5080)) + ## `format_macro_matchers` Format the metavariable matching patterns in macros. diff --git a/src/config/mod.rs b/src/config/mod.rs index 14f27f3f8b6..f16fa7f125f 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -148,6 +148,8 @@ create_config! { "Write an item and its attribute on the same line \ if their combined width is below a threshold"; format_generated_files: bool, true, false, "Format generated files"; + generated_file_header_size: usize, 5, false, "Number of lines to check for a `@generated` \ + marker when `format_generated_files` is enabled"; // Options that can change the source code beyond whitespace/blocks (somewhat linty things) merge_derives: bool, true, true, "Merge multiple `#[derive(...)]` into a single one"; @@ -667,6 +669,7 @@ edition = "2015" version = "One" inline_attribute_width = 0 format_generated_files = true +generated_file_header_size = 5 merge_derives = true use_try_shorthand = false use_field_init_shorthand = false diff --git a/src/formatting.rs b/src/formatting.rs index 1dfd8a514f0..6eee40885f9 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -82,7 +82,7 @@ fn should_skip_module( let source_file = context.parse_session.span_to_file_contents(module.span); let src = source_file.src.as_ref().expect("SourceFile without src"); - if is_generated_file(src) { + if is_generated_file(src, config.generated_file_header_size()) { return true; } } diff --git a/src/formatting/generated.rs b/src/formatting/generated.rs index 58f43f17ee1..7f2727dc92d 100644 --- a/src/formatting/generated.rs +++ b/src/formatting/generated.rs @@ -1,7 +1,7 @@ /// Returns `true` if the given span is a part of generated files. -pub(super) fn is_generated_file(original_snippet: &str) -> bool { +pub(super) fn is_generated_file(original_snippet: &str, header_size: usize) -> bool { original_snippet .lines() - .take(5) // looking for marker only in the beginning of the file + .take(header_size) // looking for marker only in the beginning of the file .any(|line| line.contains("@generated")) } diff --git a/tests/source/configs/format_generated_files/false_with_generated_file_header_size.rs b/tests/source/configs/format_generated_files/false_with_generated_file_header_size.rs new file mode 100644 index 00000000000..a121e0b40f0 --- /dev/null +++ b/tests/source/configs/format_generated_files/false_with_generated_file_header_size.rs @@ -0,0 +1,10 @@ +// rustfmt-format_generated_files: false +// rustfmt-generated_file_header_size: 15 + +fn main() +{ + println!("hello, world") + ; +} + +// @generated \ No newline at end of file diff --git a/tests/source/configs/format_generated_files/true_with_marker_not_in_header.rs b/tests/source/configs/format_generated_files/true_with_marker_not_in_header.rs new file mode 100644 index 00000000000..8eff1a3b0ee --- /dev/null +++ b/tests/source/configs/format_generated_files/true_with_marker_not_in_header.rs @@ -0,0 +1,9 @@ +// rustfmt-format_generated_files: true + +fn main() +{ + println!("hello, world") + ; +} + +// @generated \ No newline at end of file diff --git a/tests/target/configs/format_generated_files/false_with_generated_file_header_size.rs b/tests/target/configs/format_generated_files/false_with_generated_file_header_size.rs new file mode 100644 index 00000000000..a121e0b40f0 --- /dev/null +++ b/tests/target/configs/format_generated_files/false_with_generated_file_header_size.rs @@ -0,0 +1,10 @@ +// rustfmt-format_generated_files: false +// rustfmt-generated_file_header_size: 15 + +fn main() +{ + println!("hello, world") + ; +} + +// @generated \ No newline at end of file diff --git a/tests/target/configs/format_generated_files/true_with_marker_not_in_header.rs b/tests/target/configs/format_generated_files/true_with_marker_not_in_header.rs new file mode 100644 index 00000000000..3b6280b350e --- /dev/null +++ b/tests/target/configs/format_generated_files/true_with_marker_not_in_header.rs @@ -0,0 +1,7 @@ +// rustfmt-format_generated_files: true + +fn main() { + println!("hello, world"); +} + +// @generated