Skip to content

Commit 8a73a89

Browse files
Merge #3707
3707: Add ItemScope::visibility_of r=matklad a=edwin0cheng ~This PR implements `HasVisibility` for various constructs and change `Definition::search_scope` to use `Visibility` directly instead of depends on ad-hoc string parsing.~ This PR added `visibility_of` in `ItemScope` and `Module` and use it directly directly instead of depends on ad-hoc string parsing. And also add a FIXME to indicate that there is a bug which do not search child-submodules in other files recursively in `Definition::search_scope`. I will submit another PR to fix that bug after this is merged. cc @flodiebold Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
2 parents 6ad1a07 + d606521 commit 8a73a89

File tree

5 files changed

+50
-59
lines changed

5 files changed

+50
-59
lines changed

crates/ra_hir/src/code_model.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ impl Module {
234234
.collect()
235235
}
236236

237+
pub fn visibility_of(self, db: &dyn HirDatabase, def: &ModuleDef) -> Option<Visibility> {
238+
db.crate_def_map(self.id.krate)[self.id.local_id].scope.visbility_of(def.clone().into())
239+
}
240+
237241
pub fn diagnostics(self, db: &dyn HirDatabase, sink: &mut DiagnosticSink) {
238242
let _p = profile("Module::diagnostics");
239243
let crate_def_map = db.crate_def_map(self.id.krate);

crates/ra_hir/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub use crate::{
5454
Adt, AsAssocItem, AssocItem, AssocItemContainer, AttrDef, Const, Crate, CrateDependency,
5555
DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, HasAttrs,
5656
HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct,
57-
StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef,
57+
StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, Visibility,
5858
},
5959
has_source::HasSource,
6060
semantics::{original_range, PathResolution, Semantics, SemanticsScope},

crates/ra_hir_def/src/item_scope.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ impl ItemScope {
6868
self.impls.iter().copied()
6969
}
7070

71+
pub fn visbility_of(&self, def: ModuleDefId) -> Option<Visibility> {
72+
self.name_of(ItemInNs::Types(def))
73+
.or_else(|| self.name_of(ItemInNs::Values(def)))
74+
.map(|(_, v)| v)
75+
}
76+
7177
/// Iterate over all module scoped macros
7278
pub(crate) fn macros<'a>(&'a self) -> impl Iterator<Item = (&'a Name, MacroDefId)> + 'a {
7379
self.visible.iter().filter_map(|(name, def)| def.take_macros().map(|macro_| (name, macro_)))

crates/ra_ide_db/src/defs.rs

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
// FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
77

88
use hir::{
9-
Adt, FieldSource, HasSource, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
10-
Semantics, StructField, TypeParam,
9+
HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution, Semantics,
10+
StructField, TypeParam, Visibility,
1111
};
1212
use ra_prof::profile;
1313
use ra_syntax::{
14-
ast::{self, AstNode, VisibilityOwner},
14+
ast::{self, AstNode},
1515
match_ast,
1616
};
1717
use test_utils::tested_by;
@@ -41,28 +41,13 @@ impl Definition {
4141
}
4242
}
4343

44-
pub fn visibility(&self, db: &RootDatabase) -> Option<ast::Visibility> {
44+
pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
45+
let module = self.module(db);
46+
4547
match self {
4648
Definition::Macro(_) => None,
47-
Definition::StructField(sf) => match sf.source(db).value {
48-
FieldSource::Named(it) => it.visibility(),
49-
FieldSource::Pos(it) => it.visibility(),
50-
},
51-
Definition::ModuleDef(def) => match def {
52-
ModuleDef::Module(it) => it.declaration_source(db)?.value.visibility(),
53-
ModuleDef::Function(it) => it.source(db).value.visibility(),
54-
ModuleDef::Adt(adt) => match adt {
55-
Adt::Struct(it) => it.source(db).value.visibility(),
56-
Adt::Union(it) => it.source(db).value.visibility(),
57-
Adt::Enum(it) => it.source(db).value.visibility(),
58-
},
59-
ModuleDef::Const(it) => it.source(db).value.visibility(),
60-
ModuleDef::Static(it) => it.source(db).value.visibility(),
61-
ModuleDef::Trait(it) => it.source(db).value.visibility(),
62-
ModuleDef::TypeAlias(it) => it.source(db).value.visibility(),
63-
ModuleDef::EnumVariant(_) => None,
64-
ModuleDef::BuiltinType(_) => None,
65-
},
49+
Definition::StructField(sf) => Some(sf.visibility(db)),
50+
Definition::ModuleDef(def) => module?.visibility_of(db, def),
6651
Definition::SelfType(_) => None,
6752
Definition::Local(_) => None,
6853
Definition::TypeParam(_) => None,

crates/ra_ide_db/src/search.rs

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
use std::mem;
88

9-
use hir::{DefWithBody, HasSource, ModuleSource, Semantics};
9+
use hir::{DefWithBody, HasSource, Module, ModuleSource, Semantics, Visibility};
1010
use once_cell::unsync::Lazy;
1111
use ra_db::{FileId, FileRange, SourceDatabaseExt};
1212
use ra_prof::profile;
@@ -123,51 +123,47 @@ impl Definition {
123123
return SearchScope::new(res);
124124
}
125125

126-
let vis = self.visibility(db).as_ref().map(|v| v.syntax().to_string()).unwrap_or_default();
126+
let vis = self.visibility(db);
127127

128-
if vis.as_str() == "pub(super)" {
129-
if let Some(parent_module) = module.parent(db) {
130-
let mut res = FxHashMap::default();
131-
let parent_src = parent_module.definition_source(db);
132-
let file_id = parent_src.file_id.original_file(db);
128+
// FIXME:
129+
// The following logic are wrong that it does not search
130+
// for submodules within other files recursively.
133131

134-
match parent_src.value {
135-
ModuleSource::Module(m) => {
136-
let range = Some(m.syntax().text_range());
137-
res.insert(file_id, range);
138-
}
139-
ModuleSource::SourceFile(_) => {
140-
res.insert(file_id, None);
141-
res.extend(parent_module.children(db).map(|m| {
142-
let src = m.definition_source(db);
143-
(src.file_id.original_file(db), None)
144-
}));
145-
}
132+
if let Some(Visibility::Module(module)) = vis.and_then(|it| it.into()) {
133+
let module: Module = module.into();
134+
let mut res = FxHashMap::default();
135+
let src = module.definition_source(db);
136+
let file_id = src.file_id.original_file(db);
137+
138+
match src.value {
139+
ModuleSource::Module(m) => {
140+
let range = Some(m.syntax().text_range());
141+
res.insert(file_id, range);
142+
}
143+
ModuleSource::SourceFile(_) => {
144+
res.insert(file_id, None);
145+
res.extend(module.children(db).map(|m| {
146+
let src = m.definition_source(db);
147+
(src.file_id.original_file(db), None)
148+
}));
146149
}
147-
return SearchScope::new(res);
148150
}
151+
return SearchScope::new(res);
149152
}
150153

151-
if vis.as_str() != "" {
154+
if let Some(Visibility::Public) = vis {
152155
let source_root_id = db.file_source_root(file_id);
153156
let source_root = db.source_root(source_root_id);
154157
let mut res = source_root.walk().map(|id| (id, None)).collect::<FxHashMap<_, _>>();
155158

156-
// FIXME: add "pub(in path)"
157-
158-
if vis.as_str() == "pub(crate)" {
159-
return SearchScope::new(res);
160-
}
161-
if vis.as_str() == "pub" {
162-
let krate = module.krate();
163-
for rev_dep in krate.reverse_dependencies(db) {
164-
let root_file = rev_dep.root_file(db);
165-
let source_root_id = db.file_source_root(root_file);
166-
let source_root = db.source_root(source_root_id);
167-
res.extend(source_root.walk().map(|id| (id, None)));
168-
}
169-
return SearchScope::new(res);
159+
let krate = module.krate();
160+
for rev_dep in krate.reverse_dependencies(db) {
161+
let root_file = rev_dep.root_file(db);
162+
let source_root_id = db.file_source_root(root_file);
163+
let source_root = db.source_root(source_root_id);
164+
res.extend(source_root.walk().map(|id| (id, None)));
170165
}
166+
return SearchScope::new(res);
171167
}
172168

173169
let mut res = FxHashMap::default();

0 commit comments

Comments
 (0)