From d54745aed3a747a907e2fea3528f98c4d4701345 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 8 Dec 2023 11:59:44 +0100 Subject: [PATCH] fix: Fix item tree lowering pub(self) to pub() --- crates/hir-def/src/item_tree/tests.rs | 12 ++++++++ crates/hir-def/src/nameres/path_resolution.rs | 14 ++++----- crates/hir-def/src/visibility.rs | 2 +- crates/ide-completion/src/completions/expr.rs | 29 ++++++------------- crates/ide-completion/src/tests/special.rs | 2 +- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/crates/hir-def/src/item_tree/tests.rs b/crates/hir-def/src/item_tree/tests.rs index 4180f81720..96c65b941c 100644 --- a/crates/hir-def/src/item_tree/tests.rs +++ b/crates/hir-def/src/item_tree/tests.rs @@ -370,3 +370,15 @@ struct S<#[cfg(never)] T>; "#]], ) } + +#[test] +fn pub_self() { + check( + r#" +pub(self) struct S; + "#, + expect![[r#" + pub(self) struct S; + "#]], + ) +} diff --git a/crates/hir-def/src/nameres/path_resolution.rs b/crates/hir-def/src/nameres/path_resolution.rs index 7c3231913d..be3438e427 100644 --- a/crates/hir-def/src/nameres/path_resolution.rs +++ b/crates/hir-def/src/nameres/path_resolution.rs @@ -93,15 +93,11 @@ impl DefMap { if remaining.is_some() { return None; } - let types = result.take_types(); - - match (types, path.kind) { - (Some(ModuleDefId::ModuleId(m)), _) => Visibility::Module(m), - // resolve_path doesn't find any values for a plan pathkind of a private function - (None, PathKind::Plain | PathKind::Crate) => { - Visibility::Module(self.module_id(original_module)) - } - (_, _) => { + let types = result.take_types()?; + match types { + ModuleDefId::ModuleId(m) => Visibility::Module(m), + // error: visibility needs to refer to module + _ => { return None; } } diff --git a/crates/hir-def/src/visibility.rs b/crates/hir-def/src/visibility.rs index ab9266aa60..f5803653c7 100644 --- a/crates/hir-def/src/visibility.rs +++ b/crates/hir-def/src/visibility.rs @@ -73,7 +73,7 @@ impl RawVisibility { RawVisibility::Module(path) } ast::VisibilityKind::PubSelf => { - let path = ModPath::from_kind(PathKind::Plain); + let path = ModPath::from_kind(PathKind::Super(0)); RawVisibility::Module(path) } ast::VisibilityKind::Pub => RawVisibility::Public, diff --git a/crates/ide-completion/src/completions/expr.rs b/crates/ide-completion/src/completions/expr.rs index 17a52787b8..d3c817d4b4 100644 --- a/crates/ide-completion/src/completions/expr.rs +++ b/crates/ide-completion/src/completions/expr.rs @@ -1,6 +1,6 @@ //! Completion of names from the current scope in expression position. -use hir::{HasVisibility, Module, ScopeDef}; +use hir::ScopeDef; use syntax::ast; use crate::{ @@ -9,23 +9,6 @@ use crate::{ CompletionContext, Completions, }; -fn scope_def_applicable( - def: ScopeDef, - ctx: &CompletionContext<'_>, - module: Option<&Module>, -) -> bool { - match (def, module) { - (ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) | ScopeDef::Label(_), _) => { - false - } - (ScopeDef::ModuleDef(hir::ModuleDef::Macro(mac)), _) => mac.is_fn_like(ctx.db), - (ScopeDef::ModuleDef(hir::ModuleDef::Function(f)), Some(m)) => { - f.is_visible_from(ctx.db, *m) - } - _ => true, - } -} - pub(crate) fn complete_expr_path( acc: &mut Completions, ctx: &CompletionContext<'_>, @@ -54,6 +37,12 @@ pub(crate) fn complete_expr_path( let wants_mut_token = ref_expr_parent.as_ref().map(|it| it.mut_token().is_none()).unwrap_or(false); + let scope_def_applicable = |def| match def { + ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) | ScopeDef::Label(_) => false, + ScopeDef::ModuleDef(hir::ModuleDef::Macro(mac)) => mac.is_fn_like(ctx.db), + _ => true, + }; + let add_assoc_item = |acc: &mut Completions, item| match item { hir::AssocItem::Function(func) => acc.add_function(ctx, path_ctx, func, None), hir::AssocItem::Const(ct) => acc.add_const(ctx, ct), @@ -98,7 +87,7 @@ pub(crate) fn complete_expr_path( hir::PathResolution::Def(hir::ModuleDef::Module(module)) => { let module_scope = module.scope(ctx.db, Some(ctx.module)); for (name, def) in module_scope { - if scope_def_applicable(def, ctx, Some(module)) { + if scope_def_applicable(def) { acc.add_path_resolution( ctx, path_ctx, @@ -244,7 +233,7 @@ pub(crate) fn complete_expr_path( [..] => acc.add_path_resolution(ctx, path_ctx, name, def, doc_aliases), } } - _ if scope_def_applicable(def, ctx, None) => { + _ if scope_def_applicable(def) => { acc.add_path_resolution(ctx, path_ctx, name, def, doc_aliases) } _ => (), diff --git a/crates/ide-completion/src/tests/special.rs b/crates/ide-completion/src/tests/special.rs index 8d82b5f02b..28c9bffc5e 100644 --- a/crates/ide-completion/src/tests/special.rs +++ b/crates/ide-completion/src/tests/special.rs @@ -1292,7 +1292,7 @@ fn completes_only_public() { r#" //- /e.rs pub(self) fn i_should_be_hidden() {} -pub(in crate::krate) fn i_should_also_be_hidden() {} +pub(in crate::e) fn i_should_also_be_hidden() {} pub fn i_am_public () {} //- /lib.rs crate:krate