Skip to content

Commit 3885345

Browse files
committed
Add ModuleSource::Block
1 parent 7cbedc5 commit 3885345

File tree

9 files changed

+102
-100
lines changed

9 files changed

+102
-100
lines changed

crates/ra_hir/src/code_model.rs

Lines changed: 4 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use hir_def::{
1111
builtin_type::BuiltinType,
1212
docs::Documentation,
1313
expr::{BindingAnnotation, Pat, PatId},
14+
nameres::ModuleSource,
1415
per_ns::PerNs,
1516
resolver::HasResolver,
1617
type_ref::{Mutability, TypeRef},
@@ -21,11 +22,11 @@ use hir_def::{
2122
use hir_expand::{
2223
diagnostics::DiagnosticSink,
2324
name::{self, AsName},
24-
AstId, MacroDefId,
25+
MacroDefId,
2526
};
2627
use hir_ty::expr::ExprValidator;
27-
use ra_db::{CrateId, Edition, FileId, FilePosition};
28-
use ra_syntax::{ast, AstNode, SyntaxNode};
28+
use ra_db::{CrateId, Edition};
29+
use ra_syntax::ast;
2930

3031
use crate::{
3132
db::{DefDatabase, HirDatabase},
@@ -79,64 +80,6 @@ impl Crate {
7980
}
8081
}
8182

82-
pub enum ModuleSource {
83-
SourceFile(ast::SourceFile),
84-
Module(ast::Module),
85-
}
86-
87-
impl ModuleSource {
88-
pub fn new(
89-
db: &impl DefDatabase,
90-
file_id: Option<FileId>,
91-
decl_id: Option<AstId<ast::Module>>,
92-
) -> ModuleSource {
93-
match (file_id, decl_id) {
94-
(Some(file_id), _) => {
95-
let source_file = db.parse(file_id).tree();
96-
ModuleSource::SourceFile(source_file)
97-
}
98-
(None, Some(item_id)) => {
99-
let module = item_id.to_node(db);
100-
assert!(module.item_list().is_some(), "expected inline module");
101-
ModuleSource::Module(module)
102-
}
103-
(None, None) => panic!(),
104-
}
105-
}
106-
107-
// FIXME: this methods do not belong here
108-
pub fn from_position(db: &impl DefDatabase, position: FilePosition) -> ModuleSource {
109-
let parse = db.parse(position.file_id);
110-
match &ra_syntax::algo::find_node_at_offset::<ast::Module>(
111-
parse.tree().syntax(),
112-
position.offset,
113-
) {
114-
Some(m) if !m.has_semi() => ModuleSource::Module(m.clone()),
115-
_ => {
116-
let source_file = parse.tree();
117-
ModuleSource::SourceFile(source_file)
118-
}
119-
}
120-
}
121-
122-
pub fn from_child_node(db: &impl DefDatabase, child: InFile<&SyntaxNode>) -> ModuleSource {
123-
if let Some(m) =
124-
child.value.ancestors().filter_map(ast::Module::cast).find(|it| !it.has_semi())
125-
{
126-
ModuleSource::Module(m)
127-
} else {
128-
let file_id = child.file_id.original_file(db);
129-
let source_file = db.parse(file_id).tree();
130-
ModuleSource::SourceFile(source_file)
131-
}
132-
}
133-
134-
pub fn from_file_id(db: &impl DefDatabase, file_id: FileId) -> ModuleSource {
135-
let source_file = db.parse(file_id).tree();
136-
ModuleSource::SourceFile(source_file)
137-
}
138-
}
139-
14083
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14184
pub struct Module {
14285
pub(crate) id: ModuleId,

crates/ra_hir/src/code_model/src.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
33
use either::Either;
44
use hir_def::{
5+
nameres::ModuleSource,
56
src::{HasChildSource, HasSource as _},
67
AstItemDef, Lookup, VariantId,
78
};
89
use ra_syntax::ast;
910

1011
use crate::{
1112
db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef,
12-
Module, ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union,
13+
Module, Static, Struct, StructField, Trait, TypeAlias, Union,
1314
};
1415

1516
pub use hir_expand::InFile;

crates/ra_hir/src/from_source.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! FIXME: write short doc here
22
3-
use hir_def::{AstItemDef, LocationCtx, ModuleId};
3+
use hir_def::{nameres::ModuleSource, AstItemDef, LocationCtx, ModuleId};
44
use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind};
55
use ra_syntax::{
66
ast::{self, AstNode, NameOwner},
@@ -10,8 +10,8 @@ use ra_syntax::{
1010
use crate::{
1111
db::{AstDatabase, DefDatabase, HirDatabase},
1212
AssocItem, Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, HasSource, ImplBlock,
13-
InFile, Local, MacroDef, Module, ModuleDef, ModuleSource, Static, Struct, StructField, Trait,
14-
TypeAlias, Union, VariantDef,
13+
InFile, Local, MacroDef, Module, ModuleDef, Static, Struct, StructField, Trait, TypeAlias,
14+
Union, VariantDef,
1515
};
1616

1717
pub trait FromSource: Sized {
@@ -257,7 +257,7 @@ impl Module {
257257
InFile { file_id: src.file_id, value: module.clone() },
258258
);
259259
}
260-
ModuleSource::SourceFile(_) => (),
260+
ModuleSource::SourceFile(_) | ModuleSource::Block(_) => (),
261261
};
262262

263263
let original_file = src.file_id.original_file(db);

crates/ra_hir/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ pub use crate::{
4343
code_model::{
4444
src::HasSource, Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency,
4545
DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, GenericParam,
46-
HasAttrs, ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ModuleSource, ScopeDef,
47-
Static, Struct, StructField, Trait, Type, TypeAlias, Union, VariantDef,
46+
HasAttrs, ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct,
47+
StructField, Trait, Type, TypeAlias, Union, VariantDef,
4848
},
4949
from_source::FromSource,
5050
source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer},
@@ -59,6 +59,7 @@ pub use hir_def::{
5959
body::scope::ExprScopes,
6060
builtin_type::BuiltinType,
6161
docs::Documentation,
62+
nameres::ModuleSource,
6263
path::{Path, PathKind},
6364
type_ref::Mutability,
6465
};

crates/ra_hir/src/source_binder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use hir_def::{
1414
BodySourceMap,
1515
},
1616
expr::{ExprId, PatId},
17+
nameres::ModuleSource,
1718
path::known,
1819
resolver::{self, resolver_for_scope, HasResolver, Resolver, TypeNs, ValueNs},
1920
AssocItemId, DefWithBodyId,
@@ -46,7 +47,7 @@ fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) -
4647
Some(crate::Module::from_declaration(db, src)?.id.resolver(db))
4748
},
4849
ast::SourceFile(it) => {
49-
let src = node.with_value(crate::ModuleSource::SourceFile(it));
50+
let src = node.with_value(ModuleSource::SourceFile(it));
5051
Some(crate::Module::from_definition(db, src)?.id.resolver(db))
5152
},
5253
ast::StructDef(it) => {

crates/ra_hir_def/src/nameres.rs

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,12 @@ use hir_expand::{
6363
};
6464
use once_cell::sync::Lazy;
6565
use ra_arena::Arena;
66-
use ra_db::{CrateId, Edition, FileId};
66+
use ra_db::{CrateId, Edition, FileId, FilePosition};
6767
use ra_prof::profile;
68-
use ra_syntax::ast;
68+
use ra_syntax::{
69+
ast::{self, AstNode},
70+
SyntaxNode,
71+
};
6972
use rustc_hash::FxHashMap;
7073

7174
use crate::{
@@ -361,6 +364,67 @@ impl ModuleData {
361364
}
362365
}
363366

367+
pub enum ModuleSource {
368+
SourceFile(ast::SourceFile),
369+
Module(ast::Module),
370+
Block(ast::Block),
371+
}
372+
373+
impl ModuleSource {
374+
pub fn new(
375+
db: &impl DefDatabase,
376+
file_id: Option<FileId>,
377+
decl_id: Option<AstId<ast::Module>>,
378+
) -> ModuleSource {
379+
match (file_id, decl_id) {
380+
(Some(file_id), _) => {
381+
let source_file = db.parse(file_id).tree();
382+
ModuleSource::SourceFile(source_file)
383+
}
384+
(None, Some(item_id)) => {
385+
let module = item_id.to_node(db);
386+
assert!(module.item_list().is_some(), "expected inline module");
387+
ModuleSource::Module(module)
388+
}
389+
(None, None) => panic!(),
390+
}
391+
}
392+
393+
// FIXME: this methods do not belong here
394+
pub fn from_position(db: &impl DefDatabase, position: FilePosition) -> ModuleSource {
395+
let parse = db.parse(position.file_id);
396+
match &ra_syntax::algo::find_node_at_offset::<ast::Module>(
397+
parse.tree().syntax(),
398+
position.offset,
399+
) {
400+
Some(m) if !m.has_semi() => ModuleSource::Module(m.clone()),
401+
_ => {
402+
let source_file = parse.tree();
403+
ModuleSource::SourceFile(source_file)
404+
}
405+
}
406+
}
407+
408+
pub fn from_child_node(db: &impl DefDatabase, child: InFile<&SyntaxNode>) -> ModuleSource {
409+
if let Some(m) =
410+
child.value.ancestors().filter_map(ast::Module::cast).find(|it| !it.has_semi())
411+
{
412+
ModuleSource::Module(m)
413+
} else if let Some(b) = child.value.ancestors().filter_map(ast::Block::cast).next() {
414+
ModuleSource::Block(b)
415+
} else {
416+
let file_id = child.file_id.original_file(db);
417+
let source_file = db.parse(file_id).tree();
418+
ModuleSource::SourceFile(source_file)
419+
}
420+
}
421+
422+
pub fn from_file_id(db: &impl DefDatabase, file_id: FileId) -> ModuleSource {
423+
let source_file = db.parse(file_id).tree();
424+
ModuleSource::SourceFile(source_file)
425+
}
426+
}
427+
364428
mod diagnostics {
365429
use hir_expand::diagnostics::DiagnosticSink;
366430
use ra_db::RelativePathBuf;

crates/ra_ide/src/display/navigation_target.rs

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -231,34 +231,21 @@ impl ToNav for hir::Module {
231231
fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
232232
let src = self.definition_source(db);
233233
let name = self.name(db).map(|it| it.to_string().into()).unwrap_or_default();
234-
match &src.value {
235-
ModuleSource::SourceFile(node) => {
236-
let frange = original_range(db, src.with_value(node.syntax()));
237-
238-
NavigationTarget::from_syntax(
239-
frange.file_id,
240-
name,
241-
None,
242-
frange.range,
243-
node.syntax().kind(),
244-
None,
245-
None,
246-
)
247-
}
248-
ModuleSource::Module(node) => {
249-
let frange = original_range(db, src.with_value(node.syntax()));
250-
251-
NavigationTarget::from_syntax(
252-
frange.file_id,
253-
name,
254-
None,
255-
frange.range,
256-
node.syntax().kind(),
257-
node.doc_comment_text(),
258-
node.short_label(),
259-
)
260-
}
261-
}
234+
let syntax = match &src.value {
235+
ModuleSource::SourceFile(node) => node.syntax(),
236+
ModuleSource::Module(node) => node.syntax(),
237+
ModuleSource::Block(node) => node.syntax(),
238+
};
239+
let frange = original_range(db, src.with_value(syntax));
240+
NavigationTarget::from_syntax(
241+
frange.file_id,
242+
name,
243+
None,
244+
frange.range,
245+
syntax.kind(),
246+
None,
247+
None,
248+
)
262249
}
263250
}
264251

crates/ra_ide/src/references/rename.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ fn rename_mod(
8888
file_system_edits.push(move_file);
8989
}
9090
}
91-
ModuleSource::Module(..) => {}
91+
ModuleSource::Module(..) | ModuleSource::Block(..) => {}
9292
}
9393
}
9494

crates/ra_ide/src/references/search_scope.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ impl NameDefinition {
9696
let range = Some(m.syntax().text_range());
9797
res.insert(file_id, range);
9898
}
99+
ModuleSource::Block(b) => {
100+
let range = Some(b.syntax().text_range());
101+
res.insert(file_id, range);
102+
}
99103
ModuleSource::SourceFile(_) => {
100104
res.insert(file_id, None);
101105
res.extend(parent_module.children(db).map(|m| {
@@ -137,6 +141,7 @@ impl NameDefinition {
137141
let mut res = FxHashMap::default();
138142
let range = match module_src.value {
139143
ModuleSource::Module(m) => Some(m.syntax().text_range()),
144+
ModuleSource::Block(b) => Some(b.syntax().text_range()),
140145
ModuleSource::SourceFile(_) => None,
141146
};
142147
res.insert(file_id, range);

0 commit comments

Comments
 (0)