@@ -5799,9 +5799,8 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
57995799 return;
58005800 };
58015801 let mut diagnostic = builder.into_diagnostic(format_args!(
5802- "Cannot resolve imported module `{}{}`",
5803- ".".repeat(level as usize),
5804- module.unwrap_or_default()
5802+ "Cannot resolve imported module `{}`",
5803+ format_import_from_module(level, module)
58055804 ));
58065805
58075806 if level == 0 {
@@ -5832,6 +5831,30 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
58325831 }
58335832 }
58345833 }
5834+ } else {
5835+ if let Some(better_level) = (0..level).rev().find(|reduced_level| {
5836+ let Ok(module_name) = ModuleName::from_identifier_parts(
5837+ self.db(),
5838+ self.file(),
5839+ module,
5840+ *reduced_level,
5841+ ) else {
5842+ return false;
5843+ };
5844+ resolve_module(self.db(), &module_name).is_some()
5845+ }) {
5846+ diagnostic
5847+ .help("The module can be resolved if the number of leading dots is reduced");
5848+ diagnostic.help(format_args!(
5849+ "Did you mean `{}`?",
5850+ format_import_from_module(better_level, module)
5851+ ));
5852+ diagnostic.set_concise_message(format_args!(
5853+ "Cannot resolve imported module `{}` - did you mean `{}`?",
5854+ format_import_from_module(level, module),
5855+ format_import_from_module(better_level, module)
5856+ ));
5857+ }
58355858 }
58365859
58375860 // Add search paths information to the diagnostic
@@ -6026,8 +6049,7 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
60266049 }
60276050 Err(ModuleNameResolutionError::TooManyDots) => {
60286051 tracing::debug!(
6029- "Relative module resolution `{}` failed: too many leading dots \
6030- (try adjusting configured search paths?)",
6052+ "Relative module resolution `{}` failed: too many leading dots",
60316053 format_import_from_module(*level, module),
60326054 );
60336055 self.report_unresolved_import(
0 commit comments