From b9e28974fa6465940de17756a862c17830f78a6a Mon Sep 17 00:00:00 2001 From: tanzaku Date: Tue, 22 Nov 2022 02:11:34 +0900 Subject: [PATCH 1/9] Add `ignore_missing_submod` config option --- Configurations.md | 8 ++++++++ src/config/mod.rs | 2 ++ src/formatting.rs | 1 + src/modules.rs | 11 +++++++++++ tests/config/issue-5609.toml | 1 + tests/source/issue-5609.rs | 7 +++++++ tests/target/issue-5609.rs | 5 +++++ 7 files changed, 35 insertions(+) create mode 100644 tests/config/issue-5609.toml create mode 100644 tests/source/issue-5609.rs create mode 100644 tests/target/issue-5609.rs diff --git a/Configurations.md b/Configurations.md index 2d01fb3bb3b..6d726a2c3da 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1306,6 +1306,14 @@ If you want to ignore every file under the directory where you put your rustfmt. ignore = ["/"] ``` +## `ignore_missing_submod` + +Ignore missing submodule error. + +- **Default value**: `false` +- **Possible values**: `true`, `false` +- **Stable**: Yes + ## `imports_indent` Indent style of imports diff --git a/src/config/mod.rs b/src/config/mod.rs index 9484b2e5829..45cf387f9ac 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -179,6 +179,7 @@ create_config! { or they are left with trailing whitespaces"; ignore: IgnoreList, IgnoreList::default(), false, "Skip formatting the specified files and directories"; + ignore_missing_submod: bool, false, true, "Ignore missing submodule error"; // Not user-facing verbose: Verbosity, Verbosity::Normal, false, "How much to information to emit to the user"; @@ -697,6 +698,7 @@ show_parse_errors = true error_on_line_overflow = false error_on_unformatted = false ignore = [] +ignore_missing_submod = false emit_mode = "Files" make_backup = false "#, diff --git a/src/formatting.rs b/src/formatting.rs index 60361505a3f..06993329e93 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -135,6 +135,7 @@ fn format_project( &context.parse_session, directory_ownership.unwrap_or(DirectoryOwnership::UnownedViaBlock), !input_is_stdin && !config.skip_children(), + config.ignore_missing_submod(), ) .visit_crate(&krate)? .into_iter() diff --git a/src/modules.rs b/src/modules.rs index af9a154a6ae..b143aa1e308 100644 --- a/src/modules.rs +++ b/src/modules.rs @@ -62,6 +62,7 @@ pub(crate) struct ModResolver<'ast, 'sess> { directory: Directory, file_map: FileModMap<'ast>, recursive: bool, + ignore_missing_submod: bool, } /// Represents errors while trying to resolve modules. @@ -105,6 +106,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { parse_sess: &'sess ParseSess, directory_ownership: DirectoryOwnership, recursive: bool, + ignore_missing_submod: bool, ) -> Self { ModResolver { directory: Directory { @@ -114,6 +116,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { file_map: BTreeMap::new(), parse_sess, recursive, + ignore_missing_submod, } } @@ -249,6 +252,14 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { // mod foo; // Look for an extern file. self.find_external_module(item.ident, &item.attrs, sub_mod) + .or_else(|err| match err.kind { + ModuleResolutionErrorKind::NotFound { file: _ } + if self.ignore_missing_submod => + { + Ok(None) + } + _ => Err(err), + }) } else { // An internal module (`mod foo { /* ... */ }`); Ok(Some(SubModKind::Internal(item))) diff --git a/tests/config/issue-5609.toml b/tests/config/issue-5609.toml new file mode 100644 index 00000000000..450ad952083 --- /dev/null +++ b/tests/config/issue-5609.toml @@ -0,0 +1 @@ +ignore_missing_submod = true diff --git a/tests/source/issue-5609.rs b/tests/source/issue-5609.rs new file mode 100644 index 00000000000..7fffec461d5 --- /dev/null +++ b/tests/source/issue-5609.rs @@ -0,0 +1,7 @@ +// rustfmt-config: issue-5609.toml + +mod missing_submod; + +fn test() { + +} diff --git a/tests/target/issue-5609.rs b/tests/target/issue-5609.rs new file mode 100644 index 00000000000..0626c77fb75 --- /dev/null +++ b/tests/target/issue-5609.rs @@ -0,0 +1,5 @@ +// rustfmt-config: issue-5609.toml + +mod missing_submod; + +fn test() {} From 34fd63018a154e153774688609cab98f4838ab4c Mon Sep 17 00:00:00 2001 From: tanzaku Date: Sat, 26 Nov 2022 02:29:47 +0900 Subject: [PATCH 2/9] Remove an unnecessary configuration file for testing --- tests/config/issue-5609.toml | 1 - tests/source/issue-5609.rs | 2 +- tests/target/issue-5609.rs | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 tests/config/issue-5609.toml diff --git a/tests/config/issue-5609.toml b/tests/config/issue-5609.toml deleted file mode 100644 index 450ad952083..00000000000 --- a/tests/config/issue-5609.toml +++ /dev/null @@ -1 +0,0 @@ -ignore_missing_submod = true diff --git a/tests/source/issue-5609.rs b/tests/source/issue-5609.rs index 7fffec461d5..bb6170b2b45 100644 --- a/tests/source/issue-5609.rs +++ b/tests/source/issue-5609.rs @@ -1,4 +1,4 @@ -// rustfmt-config: issue-5609.toml +// rustfmt-ignore_missing_submod: true mod missing_submod; diff --git a/tests/target/issue-5609.rs b/tests/target/issue-5609.rs index 0626c77fb75..c4ccdc4202e 100644 --- a/tests/target/issue-5609.rs +++ b/tests/target/issue-5609.rs @@ -1,4 +1,4 @@ -// rustfmt-config: issue-5609.toml +// rustfmt-ignore_missing_submod: true mod missing_submod; From b6d27d33672f098dfb5040da6453f8021f2a92f5 Mon Sep 17 00:00:00 2001 From: tanzaku Date: Sun, 27 Nov 2022 14:14:23 +0900 Subject: [PATCH 3/9] Add skip_children option explicitly --- tests/source/issue-5609.rs | 1 + tests/target/issue-5609.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/source/issue-5609.rs b/tests/source/issue-5609.rs index bb6170b2b45..296464846b7 100644 --- a/tests/source/issue-5609.rs +++ b/tests/source/issue-5609.rs @@ -1,4 +1,5 @@ // rustfmt-ignore_missing_submod: true +// rustfmt-skip_children: false mod missing_submod; diff --git a/tests/target/issue-5609.rs b/tests/target/issue-5609.rs index c4ccdc4202e..c38cfc17604 100644 --- a/tests/target/issue-5609.rs +++ b/tests/target/issue-5609.rs @@ -1,4 +1,5 @@ // rustfmt-ignore_missing_submod: true +// rustfmt-skip_children: false mod missing_submod; From 2faae327997aa16d000251b48b4c4fe352ad1203 Mon Sep 17 00:00:00 2001 From: tanzaku Date: Sun, 27 Nov 2022 14:19:13 +0900 Subject: [PATCH 4/9] Mark the ignore_missing_submod option as unstable --- Configurations.md | 2 +- src/config/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Configurations.md b/Configurations.md index 6d726a2c3da..84dec58faa1 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1312,7 +1312,7 @@ Ignore missing submodule error. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: Yes +- **Stable**: No ## `imports_indent` diff --git a/src/config/mod.rs b/src/config/mod.rs index 45cf387f9ac..6d2169599d1 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -179,7 +179,7 @@ create_config! { or they are left with trailing whitespaces"; ignore: IgnoreList, IgnoreList::default(), false, "Skip formatting the specified files and directories"; - ignore_missing_submod: bool, false, true, "Ignore missing submodule error"; + ignore_missing_submod: bool, false, false, "Ignore missing submodule error"; // Not user-facing verbose: Verbosity, Verbosity::Normal, false, "How much to information to emit to the user"; From aa4cd2639d60be95b76ad5892da59b2e7e7b08fb Mon Sep 17 00:00:00 2001 From: tanzaku Date: Sun, 27 Nov 2022 16:56:10 +0900 Subject: [PATCH 5/9] Add tests --- tests/rustfmt/main.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/tests/rustfmt/main.rs b/tests/rustfmt/main.rs index 87b55ca1d1d..801a7490284 100644 --- a/tests/rustfmt/main.rs +++ b/tests/rustfmt/main.rs @@ -1,8 +1,8 @@ //! Integration tests for rustfmt. use std::env; -use std::fs::remove_file; -use std::path::Path; +use std::fs::{read_to_string, remove_file}; +use std::path::{Path, PathBuf}; use std::process::Command; use rustfmt_config_proc_macro::rustfmt_only_ci_test; @@ -200,3 +200,30 @@ fn rustfmt_emits_error_when_control_brace_style_is_always_next_line() { let (_stdout, stderr) = rustfmt(&args); assert!(!stderr.contains("error[internal]: left behind trailing whitespace")) } + +#[test] +fn ignore_missing_sub_mod_false() { + // Ensure that missing submodules cause module not found errors when trying to + // resolve submodules with `skip_children=false` and `ignore_missing_submod=false` + let args = [ + "--config=skip_children=false,ignore_missing_submod=false", + "tests/source/issue-5609.rs", + ]; + let (_stdout, stderr) = rustfmt(&args); + // Module resolution fails because we're unable to find `missing_submod.rs` + assert!(stderr.contains("missing_submod.rs does not exist")) +} + +#[test] +fn ignore_missing_sub_mod_true() { + // Ensure that missing submodules don't cause module not found errors when trying to + // resolve submodules with `skip_children=false` and `ignore_missing_submod=true`. + let args = [ + "--emit=stdout", + "--config=skip_children=false,ignore_missing_submod=true", + "tests/source/issue-5609.rs", + ]; + let (stdout, _stderr) = rustfmt(&args); + let target = read_to_string(PathBuf::from("tests/target/issue-5609.rs")).unwrap(); + assert!(stdout.ends_with(&target)); +} From 50e7197e7851f9b42310ff2ad52a07d74348cc07 Mon Sep 17 00:00:00 2001 From: tanzaku Date: Sun, 27 Nov 2022 21:36:16 +0900 Subject: [PATCH 6/9] Update ignore_missing_submod option description --- Configurations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Configurations.md b/Configurations.md index 84dec58faa1..d187ed18d52 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1309,6 +1309,7 @@ ignore = ["/"] ## `ignore_missing_submod` Ignore missing submodule error. +By default, missing modules will lead to module not found errors and rustfmt won't format anything. - **Default value**: `false` - **Possible values**: `true`, `false` From 4bb045340276b8fade94dd822dbb34ba40c4ed49 Mon Sep 17 00:00:00 2001 From: tanzaku Date: Thu, 1 Feb 2024 19:58:04 +0900 Subject: [PATCH 7/9] Update Configuration.md --- Configurations.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Configurations.md b/Configurations.md index d187ed18d52..70abb009e9e 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1306,15 +1306,26 @@ If you want to ignore every file under the directory where you put your rustfmt. ignore = ["/"] ``` -## `ignore_missing_submod` +## `report_missing_submod` -Ignore missing submodule error. -By default, missing modules will lead to module not found errors and rustfmt won't format anything. +Controls whether to report missing submodules and whether rustfmt will format. -- **Default value**: `false` -- **Possible values**: `true`, `false` +- **Default value**: `Error` +- **Possible values**: `Error`, `Warn`, `Ignore` - **Stable**: No +#### `Error` (default): + +Missing modules will lead to module not found errors and rustfmt won't format anything. + +#### `Warn` + +Missing modules will lead to module not found warnings and rustfmt will format. + +#### `Ignore` + +Ignores missing submodule error and rustfmt will format. + ## `imports_indent` Indent style of imports From f678369ce39f5d2591bc94a8ef1e81bf45053269 Mon Sep 17 00:00:00 2001 From: tanzaku Date: Thu, 1 Feb 2024 20:22:20 +0900 Subject: [PATCH 8/9] Changes error reporting to an Error, Warn, and Ignore model --- src/config/mod.rs | 5 +++-- src/config/options.rs | 11 +++++++++++ src/formatting.rs | 2 +- src/modules.rs | 16 +++++++++++----- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index 6d2169599d1..772b09dd8c4 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -179,7 +179,8 @@ create_config! { or they are left with trailing whitespaces"; ignore: IgnoreList, IgnoreList::default(), false, "Skip formatting the specified files and directories"; - ignore_missing_submod: bool, false, false, "Ignore missing submodule error"; + report_missing_submod: ReportMissingSubmod, ReportMissingSubmod::Error, false, + "Report missing submodule"; // Not user-facing verbose: Verbosity, Verbosity::Normal, false, "How much to information to emit to the user"; @@ -698,7 +699,7 @@ show_parse_errors = true error_on_line_overflow = false error_on_unformatted = false ignore = [] -ignore_missing_submod = false +report_missing_submod = "Error" emit_mode = "Files" make_backup = false "#, diff --git a/src/config/options.rs b/src/config/options.rs index 3c5c713a33a..e9edc607f0b 100644 --- a/src/config/options.rs +++ b/src/config/options.rs @@ -494,3 +494,14 @@ pub enum StyleEdition { /// [Edition 2024](). Edition2024, } + +/// Controls whether to report missing submodules and whether rustfmt will format. +#[config_type] +pub enum ReportMissingSubmod { + /// Missing modules will lead to module not found errors and rustfmt won't format anything. + Error, + /// Missing modules will lead to module not found warnings and rustfmt will format. + Warn, + /// Ignores missing submodule error and rustfmt will format. + Ignore, +} diff --git a/src/formatting.rs b/src/formatting.rs index 06993329e93..f24233c91d7 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -135,7 +135,7 @@ fn format_project( &context.parse_session, directory_ownership.unwrap_or(DirectoryOwnership::UnownedViaBlock), !input_is_stdin && !config.skip_children(), - config.ignore_missing_submod(), + config.report_missing_submod(), ) .visit_crate(&krate)? .into_iter() diff --git a/src/modules.rs b/src/modules.rs index b143aa1e308..38f993fbcfa 100644 --- a/src/modules.rs +++ b/src/modules.rs @@ -10,7 +10,7 @@ use thin_vec::ThinVec; use thiserror::Error; use crate::attr::MetaVisitor; -use crate::config::FileName; +use crate::config::{FileName, ReportMissingSubmod}; use crate::items::is_mod_decl; use crate::parse::parser::{ Directory, DirectoryOwnership, ModError, ModulePathSuccess, Parser, ParserError, @@ -62,7 +62,7 @@ pub(crate) struct ModResolver<'ast, 'sess> { directory: Directory, file_map: FileModMap<'ast>, recursive: bool, - ignore_missing_submod: bool, + report_missing_submod: ReportMissingSubmod, } /// Represents errors while trying to resolve modules. @@ -106,7 +106,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { parse_sess: &'sess ParseSess, directory_ownership: DirectoryOwnership, recursive: bool, - ignore_missing_submod: bool, + report_missing_submod: ReportMissingSubmod, ) -> Self { ModResolver { directory: Directory { @@ -116,7 +116,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { file_map: BTreeMap::new(), parse_sess, recursive, - ignore_missing_submod, + report_missing_submod, } } @@ -254,10 +254,16 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { self.find_external_module(item.ident, &item.attrs, sub_mod) .or_else(|err| match err.kind { ModuleResolutionErrorKind::NotFound { file: _ } - if self.ignore_missing_submod => + if self.report_missing_submod == ReportMissingSubmod::Ignore => { Ok(None) } + ModuleResolutionErrorKind::NotFound { file: _ } + if self.report_missing_submod == ReportMissingSubmod::Warn => + { + eprintln!("Warning: {}", err); + Ok(None) + } _ => Err(err), }) } else { From fcc06f96af07f6423d052191667dc64da2690a25 Mon Sep 17 00:00:00 2001 From: tanzaku Date: Thu, 1 Feb 2024 22:12:50 +0900 Subject: [PATCH 9/9] Fix tests --- tests/rustfmt/main.rs | 27 ++++++++++++++++++++++----- tests/source/issue-5609-2.rs | 8 ++++++++ tests/source/issue-5609.rs | 2 +- tests/target/issue-5609-2.rs | 6 ++++++ tests/target/issue-5609.rs | 2 +- 5 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 tests/source/issue-5609-2.rs create mode 100644 tests/target/issue-5609-2.rs diff --git a/tests/rustfmt/main.rs b/tests/rustfmt/main.rs index 801a7490284..74eae3e9c08 100644 --- a/tests/rustfmt/main.rs +++ b/tests/rustfmt/main.rs @@ -202,11 +202,11 @@ fn rustfmt_emits_error_when_control_brace_style_is_always_next_line() { } #[test] -fn ignore_missing_sub_mod_false() { +fn report_missing_sub_mod_error() { // Ensure that missing submodules cause module not found errors when trying to - // resolve submodules with `skip_children=false` and `ignore_missing_submod=false` + // resolve submodules with `skip_children=false` and `report_missing_submod=Error` let args = [ - "--config=skip_children=false,ignore_missing_submod=false", + "--config=skip_children=false,report_missing_submod=Error", "tests/source/issue-5609.rs", ]; let (_stdout, stderr) = rustfmt(&args); @@ -214,13 +214,30 @@ fn ignore_missing_sub_mod_false() { assert!(stderr.contains("missing_submod.rs does not exist")) } +#[test] +fn report_missing_sub_mod_warn() { + // Ensure that missing submodules cause module not found warnings when trying to + // resolve submodules with `skip_children=false` and `report_missing_submod=Warn` + let args = [ + "--emit=stdout", + "--config=skip_children=false,report_missing_submod=Warn", + "tests/source/issue-5609.rs", + ]; + let (stdout, stderr) = rustfmt(&args); + // Module resolution succeed but we emit warnings because we're unable to find `missing_submod.rs` + assert!(stderr.contains("missing_submod.rs does not exist")); + + let target = read_to_string(PathBuf::from("tests/target/issue-5609.rs")).unwrap(); + assert!(stdout.ends_with(&target)); +} + #[test] fn ignore_missing_sub_mod_true() { // Ensure that missing submodules don't cause module not found errors when trying to - // resolve submodules with `skip_children=false` and `ignore_missing_submod=true`. + // resolve submodules with `skip_children=false` and `report_missing_submod=Ignore`. let args = [ "--emit=stdout", - "--config=skip_children=false,ignore_missing_submod=true", + "--config=skip_children=false,report_missing_submod=Ignore", "tests/source/issue-5609.rs", ]; let (stdout, _stderr) = rustfmt(&args); diff --git a/tests/source/issue-5609-2.rs b/tests/source/issue-5609-2.rs new file mode 100644 index 00000000000..413c0829f4d --- /dev/null +++ b/tests/source/issue-5609-2.rs @@ -0,0 +1,8 @@ +// rustfmt-report_missing_submod: Warn +// rustfmt-skip_children: false + +mod missing_submod; + +fn test() { + +} diff --git a/tests/source/issue-5609.rs b/tests/source/issue-5609.rs index 296464846b7..d7112a4d262 100644 --- a/tests/source/issue-5609.rs +++ b/tests/source/issue-5609.rs @@ -1,4 +1,4 @@ -// rustfmt-ignore_missing_submod: true +// rustfmt-report_missing_submod: Ignore // rustfmt-skip_children: false mod missing_submod; diff --git a/tests/target/issue-5609-2.rs b/tests/target/issue-5609-2.rs new file mode 100644 index 00000000000..f7b454216bf --- /dev/null +++ b/tests/target/issue-5609-2.rs @@ -0,0 +1,6 @@ +// rustfmt-report_missing_submod: Warn +// rustfmt-skip_children: false + +mod missing_submod; + +fn test() {} diff --git a/tests/target/issue-5609.rs b/tests/target/issue-5609.rs index c38cfc17604..184cc0aed60 100644 --- a/tests/target/issue-5609.rs +++ b/tests/target/issue-5609.rs @@ -1,4 +1,4 @@ -// rustfmt-ignore_missing_submod: true +// rustfmt-report_missing_submod: Ignore // rustfmt-skip_children: false mod missing_submod;