suggest declaring modules when file found but module not defined

This commit is contained in:
bendn 2025-06-20 00:01:06 +07:00
parent 36b21637e9
commit 3583423536
No known key found for this signature in database
GPG key ID: 0D9D3A2A3B2A93D6
2 changed files with 55 additions and 1 deletions

View file

@ -2423,6 +2423,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
} else {
let suggestion = if suggestion.is_some() {
suggestion
} else if let Some(m) = self.undeclared_module_exists(ident) {
self.undeclared_module_suggest_declare(ident, m)
} else if was_invoked_from_cargo() {
Some((
vec![],
@ -2444,6 +2446,55 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
}
}
fn undeclared_module_suggest_declare(
&mut self,
ident: Ident,
path: std::path::PathBuf,
) -> Option<(Vec<(Span, String)>, String, Applicability)> {
Some((
vec![(self.current_crate_outer_attr_insert_span, format!("mod {ident};\n"))],
format!(
"to make use of source file {}, use `mod {ident}` \
in this file to declare the module",
path.display()
),
Applicability::MaybeIncorrect,
))
}
fn undeclared_module_exists(&mut self, ident: Ident) -> Option<std::path::PathBuf> {
let map = self.tcx.sess.source_map();
let src = map.span_to_filename(ident.span).into_local_path()?;
let i = ident.as_str();
// FIXME: add case where non parent using undeclared module (hard?)
let dir = src.parent()?;
let src = src.file_stem()?.to_str()?;
for file in [
// …/x.rs
dir.join(i).with_extension("rs"),
// …/x/mod.rs
dir.join(i).join("mod.rs"),
] {
if file.exists() {
return Some(file);
}
}
if !matches!(src, "main" | "lib" | "mod") {
for file in [
// …/x/y.rs
dir.join(src).join(i).with_extension("rs"),
// …/x/y/mod.rs
dir.join(src).join(i).join("mod.rs"),
] {
if file.exists() {
return Some(file);
}
}
}
None
}
/// Adds suggestions for a path that cannot be resolved.
#[instrument(level = "debug", skip(self, parent_scope))]
pub(crate) fn make_path_suggestion(

View file

@ -12,7 +12,10 @@ error[E0433]: failed to resolve: use of unresolved module or unlinked crate `mod
LL | assert_eq!(mod_file_aux::bar(), 10);
| ^^^^^^^^^^^^ use of unresolved module or unlinked crate `mod_file_aux`
|
= help: you might be missing a crate named `mod_file_aux`
help: to make use of source file $DIR/mod_file_aux.rs, use `mod mod_file_aux` in this file to declare the module
|
LL + mod mod_file_aux;
|
error: aborting due to 2 previous errors