From 0851d21d1e2ee93eb23d63ae9aa0a2f29eb15b4c Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 21 Jul 2024 13:26:19 +0200 Subject: [PATCH] fix: Allow flyimport to import primitive shadowing modules --- crates/ide-completion/src/tests/flyimport.rs | 15 +++++++++++++++ crates/ide-db/src/imports/import_assets.rs | 2 +- crates/ide/src/file_structure.rs | 4 +++- crates/test-utils/src/minicore.rs | 9 +++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/crates/ide-completion/src/tests/flyimport.rs b/crates/ide-completion/src/tests/flyimport.rs index eacec018c72b..158dbaf1b1dd 100644 --- a/crates/ide-completion/src/tests/flyimport.rs +++ b/crates/ide-completion/src/tests/flyimport.rs @@ -1618,3 +1618,18 @@ pub struct FooStruct; "#]], ); } + +#[test] +fn primitive_mod() { + check( + r#" +//- minicore: str +fn main() { + str::from$0 +} +"#, + expect![[r#" + fn from_utf8_unchecked(…) (use core::str) const unsafe fn(&[u8]) -> &str + "#]], + ); +} diff --git a/crates/ide-db/src/imports/import_assets.rs b/crates/ide-db/src/imports/import_assets.rs index 3bb5ac1b1039..1c4c15f2557d 100644 --- a/crates/ide-db/src/imports/import_assets.rs +++ b/crates/ide-db/src/imports/import_assets.rs @@ -703,7 +703,7 @@ fn path_import_candidate( ) -> Option { Some(match qualifier { Some(qualifier) => match sema.resolve_path(&qualifier) { - None => { + Some(PathResolution::Def(ModuleDef::BuiltinType(_))) | None => { if qualifier.first_qualifier().map_or(true, |it| sema.resolve_path(&it).is_none()) { let qualifier = qualifier .segments() diff --git a/crates/ide/src/file_structure.rs b/crates/ide/src/file_structure.rs index 568906a098e3..92458185849b 100644 --- a/crates/ide/src/file_structure.rs +++ b/crates/ide/src/file_structure.rs @@ -197,7 +197,9 @@ fn structure_token(token: SyntaxToken) -> Option { if let Some(comment) = ast::Comment::cast(token) { let text = comment.text().trim(); - if let Some(region_name) = text.strip_prefix("// region:").map(str::trim) { + if let Some(region_name) = + text.strip_prefix("// region:").map(str::trim).filter(|it| !it.is_empty()) + { return Some(StructureNode { parent: None, label: region_name.to_owned(), diff --git a/crates/test-utils/src/minicore.rs b/crates/test-utils/src/minicore.rs index d1862f7d738e..2d615c34a352 100644 --- a/crates/test-utils/src/minicore.rs +++ b/crates/test-utils/src/minicore.rs @@ -55,6 +55,7 @@ //! size_of: sized //! sized: //! slice: +//! str: //! sync: sized //! transmute: //! try: infallible @@ -1368,6 +1369,14 @@ pub mod iter { } // endregion:iterator +// region:str +pub mod str { + pub const unsafe fn from_utf8_unchecked(v: &[u8]) -> &str { + "" + } +} +// endregion:str + // region:panic mod panic { pub macro panic_2021 {