about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Configurations.md14
-rw-r--r--src/config/mod.rs3
-rw-r--r--src/formatting.rs2
-rw-r--r--src/formatting/generated.rs7
-rw-r--r--tests/source/configs/format_generated_files/false_with_generated_marker_line_search_limit.rs10
-rw-r--r--tests/source/configs/format_generated_files/false_with_marker_out_scope_size.rs10
-rw-r--r--tests/source/configs/format_generated_files/false_with_zero_search_limit.rs9
-rw-r--r--tests/source/configs/format_generated_files/true_with_marker_in_scope_size.rs10
-rw-r--r--tests/source/configs/format_generated_files/true_with_marker_not_in_header.rs9
-rw-r--r--tests/target/configs/format_generated_files/false_with_generated_marker_line_search_limit.rs10
-rw-r--r--tests/target/configs/format_generated_files/false_with_marker_out_scope_size.rs8
-rw-r--r--tests/target/configs/format_generated_files/false_with_zero_search_limit.rs8
-rw-r--r--tests/target/configs/format_generated_files/true_with_marker_in_scope_size.rs8
-rw-r--r--tests/target/configs/format_generated_files/true_with_marker_not_in_header.rs7
14 files changed, 110 insertions, 5 deletions
diff --git a/Configurations.md b/Configurations.md
index c1e967c85da..af7fa012063 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_marker_line_search_limit`.
+
 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,16 @@ 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_marker_line_search_limit`
+
+Number of lines to check for a `@generated` pragma header, starting from the top of the file. Setting this value to `0` will treat all files as non-generated. When`format_generated_files` is `true`, 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))
+
+See also [format_generated_files](#format_generated_files) link here.
+
 ## `format_macro_matchers`
 
 Format the metavariable matching patterns in macros.
diff --git a/src/config/mod.rs b/src/config/mod.rs
index 2b38b616e29..c7c2d4e48a8 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -151,6 +151,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_marker_line_search_limit: 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";
@@ -680,6 +682,7 @@ edition = "2015"
 version = "One"
 inline_attribute_width = 0
 format_generated_files = true
+generated_marker_line_search_limit = 5
 merge_derives = true
 use_try_shorthand = false
 use_field_init_shorthand = false
diff --git a/src/formatting.rs b/src/formatting.rs
index cd57a025b67..60361505a3f 100644
--- a/src/formatting.rs
+++ b/src/formatting.rs
@@ -82,7 +82,7 @@ fn should_skip_module<T: FormatHandler>(
         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) {
             return true;
         }
     }
diff --git a/src/formatting/generated.rs b/src/formatting/generated.rs
index 58f43f17ee1..68ffee6e664 100644
--- a/src/formatting/generated.rs
+++ b/src/formatting/generated.rs
@@ -1,7 +1,10 @@
+use crate::Config;
+
 /// 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, config: &Config) -> bool {
     original_snippet
         .lines()
-        .take(5) // looking for marker only in the beginning of the file
+        // looking for marker only in the beginning of the file
+        .take(config.generated_marker_line_search_limit())
         .any(|line| line.contains("@generated"))
 }
diff --git a/tests/source/configs/format_generated_files/false_with_generated_marker_line_search_limit.rs b/tests/source/configs/format_generated_files/false_with_generated_marker_line_search_limit.rs
new file mode 100644
index 00000000000..be03849fe10
--- /dev/null
+++ b/tests/source/configs/format_generated_files/false_with_generated_marker_line_search_limit.rs
@@ -0,0 +1,10 @@
+// rustfmt-format_generated_files: false
+// rustfmt-generated_marker_line_search_limit: 15
+
+fn main()
+{
+    println!("hello, world")
+    ;
+}
+
+// @generated
\ No newline at end of file
diff --git a/tests/source/configs/format_generated_files/false_with_marker_out_scope_size.rs b/tests/source/configs/format_generated_files/false_with_marker_out_scope_size.rs
new file mode 100644
index 00000000000..abb97e6259f
--- /dev/null
+++ b/tests/source/configs/format_generated_files/false_with_marker_out_scope_size.rs
@@ -0,0 +1,10 @@
+// rustfmt-format_generated_files: false
+// rustfmt-generated_marker_line_search_limit: 1
+
+fn main()
+{
+    println!("hello, world")
+    ;
+}
+
+// @generated
\ No newline at end of file
diff --git a/tests/source/configs/format_generated_files/false_with_zero_search_limit.rs b/tests/source/configs/format_generated_files/false_with_zero_search_limit.rs
new file mode 100644
index 00000000000..f6978d0f355
--- /dev/null
+++ b/tests/source/configs/format_generated_files/false_with_zero_search_limit.rs
@@ -0,0 +1,9 @@
+// rustfmt-format_generated_files: false
+// rustfmt-generated_marker_line_search_limit: 0
+
+// @generated
+fn main() {
+    println!("hello, world")
+    ;
+}
+// @generated
diff --git a/tests/source/configs/format_generated_files/true_with_marker_in_scope_size.rs b/tests/source/configs/format_generated_files/true_with_marker_in_scope_size.rs
new file mode 100644
index 00000000000..53cc116ec2b
--- /dev/null
+++ b/tests/source/configs/format_generated_files/true_with_marker_in_scope_size.rs
@@ -0,0 +1,10 @@
+// rustfmt-format_generated_files: true
+// rustfmt-generated_marker_line_search_limit: 20
+
+fn main()
+{
+    println!("hello, world")
+    ;
+}
+
+// @generated
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_marker_line_search_limit.rs b/tests/target/configs/format_generated_files/false_with_generated_marker_line_search_limit.rs
new file mode 100644
index 00000000000..be03849fe10
--- /dev/null
+++ b/tests/target/configs/format_generated_files/false_with_generated_marker_line_search_limit.rs
@@ -0,0 +1,10 @@
+// rustfmt-format_generated_files: false
+// rustfmt-generated_marker_line_search_limit: 15
+
+fn main()
+{
+    println!("hello, world")
+    ;
+}
+
+// @generated
\ No newline at end of file
diff --git a/tests/target/configs/format_generated_files/false_with_marker_out_scope_size.rs b/tests/target/configs/format_generated_files/false_with_marker_out_scope_size.rs
new file mode 100644
index 00000000000..93405896a1d
--- /dev/null
+++ b/tests/target/configs/format_generated_files/false_with_marker_out_scope_size.rs
@@ -0,0 +1,8 @@
+// rustfmt-format_generated_files: false
+// rustfmt-generated_marker_line_search_limit: 1
+
+fn main() {
+    println!("hello, world");
+}
+
+// @generated
diff --git a/tests/target/configs/format_generated_files/false_with_zero_search_limit.rs b/tests/target/configs/format_generated_files/false_with_zero_search_limit.rs
new file mode 100644
index 00000000000..6acd46ed2eb
--- /dev/null
+++ b/tests/target/configs/format_generated_files/false_with_zero_search_limit.rs
@@ -0,0 +1,8 @@
+// rustfmt-format_generated_files: false
+// rustfmt-generated_marker_line_search_limit: 0
+
+// @generated
+fn main() {
+    println!("hello, world");
+}
+// @generated
diff --git a/tests/target/configs/format_generated_files/true_with_marker_in_scope_size.rs b/tests/target/configs/format_generated_files/true_with_marker_in_scope_size.rs
new file mode 100644
index 00000000000..03bfdfd1c59
--- /dev/null
+++ b/tests/target/configs/format_generated_files/true_with_marker_in_scope_size.rs
@@ -0,0 +1,8 @@
+// rustfmt-format_generated_files: true
+// rustfmt-generated_marker_line_search_limit: 20
+
+fn main() {
+    println!("hello, world");
+}
+
+// @generated
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