diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index 5984243055c..6b41921ae46 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs @@ -486,22 +486,35 @@ impl DefCollector<'_> { } else { PathKind::Abs }; - let path = - ModPath::from_segments(path_kind, [krate, name![prelude], edition].iter().cloned()); + let path = ModPath::from_segments( + path_kind.clone(), + [krate.clone(), name![prelude], edition].iter().cloned(), + ); + // Fall back to the older `std::prelude::v1` for compatibility with Rust <1.52.0 + // FIXME remove this fallback + let fallback_path = + ModPath::from_segments(path_kind, [krate, name![prelude], name![v1]].iter().cloned()); - let (per_ns, _) = - self.def_map.resolve_path(self.db, self.def_map.root, &path, BuiltinShadowMode::Other); + for path in &[path, fallback_path] { + let (per_ns, _) = self.def_map.resolve_path( + self.db, + self.def_map.root, + &path, + BuiltinShadowMode::Other, + ); - match &per_ns.types { - Some((ModuleDefId::ModuleId(m), _)) => { - self.def_map.prelude = Some(*m); - } - _ => { - log::error!( - "could not resolve prelude path `{}` to module (resolved to {:?})", - path, - per_ns.types - ); + match &per_ns.types { + Some((ModuleDefId::ModuleId(m), _)) => { + self.def_map.prelude = Some(*m); + return; + } + _ => { + log::debug!( + "could not resolve prelude path `{}` to module (resolved to {:?})", + path, + per_ns.types + ); + } } } } diff --git a/crates/hir_expand/src/name.rs b/crates/hir_expand/src/name.rs index abc6753bf13..00b8adc1ebd 100644 --- a/crates/hir_expand/src/name.rs +++ b/crates/hir_expand/src/name.rs @@ -180,6 +180,7 @@ pub mod known { rust_2015, rust_2018, rust_2021, + v1, // Components of known path (type name) Iterator, IntoIterator,