diff options
Diffstat (limited to 'crates/ra_ide_api/src/references')
-rw-r--r-- | crates/ra_ide_api/src/references/classify.rs | 34 | ||||
-rw-r--r-- | crates/ra_ide_api/src/references/name_definition.rs | 20 | ||||
-rw-r--r-- | crates/ra_ide_api/src/references/rename.rs | 2 | ||||
-rw-r--r-- | crates/ra_ide_api/src/references/search_scope.rs | 16 |
4 files changed, 38 insertions, 34 deletions
diff --git a/crates/ra_ide_api/src/references/classify.rs b/crates/ra_ide_api/src/references/classify.rs index 5cb194c0e..93e079ccc 100644 --- a/crates/ra_ide_api/src/references/classify.rs +++ b/crates/ra_ide_api/src/references/classify.rs | |||
@@ -1,3 +1,5 @@ | |||
1 | //! FIXME: write short doc here | ||
2 | |||
1 | use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; | 3 | use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; |
2 | use ra_db::FileId; | 4 | use ra_db::FileId; |
3 | use ra_syntax::{ast, match_ast, AstNode, AstPtr}; | 5 | use ra_syntax::{ast, match_ast, AstNode, AstPtr}; |
@@ -102,8 +104,9 @@ pub(crate) fn classify_name_ref( | |||
102 | let analyzer = SourceAnalyzer::new(db, file_id, name_ref.syntax(), None); | 104 | let analyzer = SourceAnalyzer::new(db, file_id, name_ref.syntax(), None); |
103 | 105 | ||
104 | if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) { | 106 | if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) { |
105 | let func = analyzer.resolve_method_call(&method_call)?; | 107 | if let Some(func) = analyzer.resolve_method_call(&method_call) { |
106 | return Some(from_assoc_item(db, func.into())); | 108 | return Some(from_assoc_item(db, func.into())); |
109 | } | ||
107 | } | 110 | } |
108 | 111 | ||
109 | if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) { | 112 | if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) { |
@@ -128,15 +131,10 @@ pub(crate) fn classify_name_ref( | |||
128 | let container = Module::from_definition(db, Source { file_id, ast })?; | 131 | let container = Module::from_definition(db, Source { file_id, ast })?; |
129 | let visibility = None; | 132 | let visibility = None; |
130 | 133 | ||
131 | if let Some(macro_call) = | 134 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { |
132 | parent.parent().and_then(|node| node.parent()).and_then(ast::MacroCall::cast) | ||
133 | { | ||
134 | if let Some(macro_def) = analyzer.resolve_macro_call(db, ¯o_call) { | 135 | if let Some(macro_def) = analyzer.resolve_macro_call(db, ¯o_call) { |
135 | return Some(NameDefinition { | 136 | let kind = NameKind::Macro(macro_def); |
136 | item: NameKind::Macro(macro_def), | 137 | return Some(NameDefinition { kind, container, visibility }); |
137 | container, | ||
138 | visibility, | ||
139 | }); | ||
140 | } | 138 | } |
141 | } | 139 | } |
142 | 140 | ||
@@ -147,23 +145,23 @@ pub(crate) fn classify_name_ref( | |||
147 | AssocItem(item) => Some(from_assoc_item(db, item)), | 145 | AssocItem(item) => Some(from_assoc_item(db, item)), |
148 | LocalBinding(Either::A(pat)) => from_pat(db, file_id, pat), | 146 | LocalBinding(Either::A(pat)) => from_pat(db, file_id, pat), |
149 | LocalBinding(Either::B(par)) => { | 147 | LocalBinding(Either::B(par)) => { |
150 | let item = NameKind::SelfParam(par); | 148 | let kind = NameKind::SelfParam(par); |
151 | Some(NameDefinition { item, container, visibility }) | 149 | Some(NameDefinition { kind, container, visibility }) |
152 | } | 150 | } |
153 | GenericParam(par) => { | 151 | GenericParam(par) => { |
154 | // FIXME: get generic param def | 152 | // FIXME: get generic param def |
155 | let item = NameKind::GenericParam(par); | 153 | let kind = NameKind::GenericParam(par); |
156 | Some(NameDefinition { item, container, visibility }) | 154 | Some(NameDefinition { kind, container, visibility }) |
157 | } | 155 | } |
158 | Macro(def) => { | 156 | Macro(def) => { |
159 | let item = NameKind::Macro(def); | 157 | let kind = NameKind::Macro(def); |
160 | Some(NameDefinition { item, container, visibility }) | 158 | Some(NameDefinition { kind, container, visibility }) |
161 | } | 159 | } |
162 | SelfType(impl_block) => { | 160 | SelfType(impl_block) => { |
163 | let ty = impl_block.target_ty(db); | 161 | let ty = impl_block.target_ty(db); |
164 | let item = NameKind::SelfType(ty); | 162 | let kind = NameKind::SelfType(ty); |
165 | let container = impl_block.module(); | 163 | let container = impl_block.module(); |
166 | Some(NameDefinition { item, container, visibility }) | 164 | Some(NameDefinition { kind, container, visibility }) |
167 | } | 165 | } |
168 | } | 166 | } |
169 | } | 167 | } |
diff --git a/crates/ra_ide_api/src/references/name_definition.rs b/crates/ra_ide_api/src/references/name_definition.rs index 58baf3686..723d97237 100644 --- a/crates/ra_ide_api/src/references/name_definition.rs +++ b/crates/ra_ide_api/src/references/name_definition.rs | |||
@@ -1,3 +1,5 @@ | |||
1 | //! FIXME: write short doc here | ||
2 | |||
1 | use hir::{ | 3 | use hir::{ |
2 | db::AstDatabase, Adt, AssocItem, DefWithBody, FromSource, HasSource, HirFileId, MacroDef, | 4 | db::AstDatabase, Adt, AssocItem, DefWithBody, FromSource, HasSource, HirFileId, MacroDef, |
3 | Module, ModuleDef, StructField, Ty, VariantDef, | 5 | Module, ModuleDef, StructField, Ty, VariantDef, |
@@ -22,7 +24,7 @@ pub enum NameKind { | |||
22 | pub(crate) struct NameDefinition { | 24 | pub(crate) struct NameDefinition { |
23 | pub visibility: Option<ast::Visibility>, | 25 | pub visibility: Option<ast::Visibility>, |
24 | pub container: Module, | 26 | pub container: Module, |
25 | pub item: NameKind, | 27 | pub kind: NameKind, |
26 | } | 28 | } |
27 | 29 | ||
28 | pub(super) fn from_pat( | 30 | pub(super) fn from_pat( |
@@ -50,9 +52,9 @@ pub(super) fn from_pat( | |||
50 | } | 52 | } |
51 | } | 53 | } |
52 | })?; | 54 | })?; |
53 | let item = NameKind::Pat((def, pat)); | 55 | let kind = NameKind::Pat((def, pat)); |
54 | let container = def.module(db); | 56 | let container = def.module(db); |
55 | Some(NameDefinition { item, container, visibility: None }) | 57 | Some(NameDefinition { kind, container, visibility: None }) |
56 | } | 58 | } |
57 | 59 | ||
58 | pub(super) fn from_assoc_item(db: &RootDatabase, item: AssocItem) -> NameDefinition { | 60 | pub(super) fn from_assoc_item(db: &RootDatabase, item: AssocItem) -> NameDefinition { |
@@ -62,19 +64,19 @@ pub(super) fn from_assoc_item(db: &RootDatabase, item: AssocItem) -> NameDefinit | |||
62 | AssocItem::Const(c) => c.source(db).ast.visibility(), | 64 | AssocItem::Const(c) => c.source(db).ast.visibility(), |
63 | AssocItem::TypeAlias(a) => a.source(db).ast.visibility(), | 65 | AssocItem::TypeAlias(a) => a.source(db).ast.visibility(), |
64 | }; | 66 | }; |
65 | let item = NameKind::AssocItem(item); | 67 | let kind = NameKind::AssocItem(item); |
66 | NameDefinition { item, container, visibility } | 68 | NameDefinition { kind, container, visibility } |
67 | } | 69 | } |
68 | 70 | ||
69 | pub(super) fn from_struct_field(db: &RootDatabase, field: StructField) -> NameDefinition { | 71 | pub(super) fn from_struct_field(db: &RootDatabase, field: StructField) -> NameDefinition { |
70 | let item = NameKind::Field(field); | 72 | let kind = NameKind::Field(field); |
71 | let parent = field.parent_def(db); | 73 | let parent = field.parent_def(db); |
72 | let container = parent.module(db); | 74 | let container = parent.module(db); |
73 | let visibility = match parent { | 75 | let visibility = match parent { |
74 | VariantDef::Struct(s) => s.source(db).ast.visibility(), | 76 | VariantDef::Struct(s) => s.source(db).ast.visibility(), |
75 | VariantDef::EnumVariant(e) => e.source(db).ast.parent_enum().visibility(), | 77 | VariantDef::EnumVariant(e) => e.source(db).ast.parent_enum().visibility(), |
76 | }; | 78 | }; |
77 | NameDefinition { item, container, visibility } | 79 | NameDefinition { kind, container, visibility } |
78 | } | 80 | } |
79 | 81 | ||
80 | pub(super) fn from_module_def( | 82 | pub(super) fn from_module_def( |
@@ -82,7 +84,7 @@ pub(super) fn from_module_def( | |||
82 | def: ModuleDef, | 84 | def: ModuleDef, |
83 | module: Option<Module>, | 85 | module: Option<Module>, |
84 | ) -> NameDefinition { | 86 | ) -> NameDefinition { |
85 | let item = NameKind::Def(def); | 87 | let kind = NameKind::Def(def); |
86 | let (container, visibility) = match def { | 88 | let (container, visibility) = match def { |
87 | ModuleDef::Module(it) => { | 89 | ModuleDef::Module(it) => { |
88 | let container = it.parent(db).or_else(|| Some(it)).unwrap(); | 90 | let container = it.parent(db).or_else(|| Some(it)).unwrap(); |
@@ -104,5 +106,5 @@ pub(super) fn from_module_def( | |||
104 | ModuleDef::Adt(Adt::Enum(it)) => (it.module(db), it.source(db).ast.visibility()), | 106 | ModuleDef::Adt(Adt::Enum(it)) => (it.module(db), it.source(db).ast.visibility()), |
105 | ModuleDef::BuiltinType(..) => (module.unwrap(), None), | 107 | ModuleDef::BuiltinType(..) => (module.unwrap(), None), |
106 | }; | 108 | }; |
107 | NameDefinition { item, container, visibility } | 109 | NameDefinition { kind, container, visibility } |
108 | } | 110 | } |
diff --git a/crates/ra_ide_api/src/references/rename.rs b/crates/ra_ide_api/src/references/rename.rs index 7e564a40e..c91dada46 100644 --- a/crates/ra_ide_api/src/references/rename.rs +++ b/crates/ra_ide_api/src/references/rename.rs | |||
@@ -1,3 +1,5 @@ | |||
1 | //! FIXME: write short doc here | ||
2 | |||
1 | use hir::ModuleSource; | 3 | use hir::ModuleSource; |
2 | use ra_db::SourceDatabase; | 4 | use ra_db::SourceDatabase; |
3 | use ra_syntax::{algo::find_node_at_offset, ast, AstNode, SyntaxNode}; | 5 | use ra_syntax::{algo::find_node_at_offset, ast, AstNode, SyntaxNode}; |
diff --git a/crates/ra_ide_api/src/references/search_scope.rs b/crates/ra_ide_api/src/references/search_scope.rs index 346815d31..aae9db13b 100644 --- a/crates/ra_ide_api/src/references/search_scope.rs +++ b/crates/ra_ide_api/src/references/search_scope.rs | |||
@@ -1,3 +1,5 @@ | |||
1 | //! FIXME: write short doc here | ||
2 | |||
1 | use hir::{DefWithBody, HasSource, ModuleSource}; | 3 | use hir::{DefWithBody, HasSource, ModuleSource}; |
2 | use ra_db::{FileId, SourceDatabase}; | 4 | use ra_db::{FileId, SourceDatabase}; |
3 | use ra_syntax::{AstNode, TextRange}; | 5 | use ra_syntax::{AstNode, TextRange}; |
@@ -7,21 +9,21 @@ use crate::db::RootDatabase; | |||
7 | use super::{NameDefinition, NameKind}; | 9 | use super::{NameDefinition, NameKind}; |
8 | 10 | ||
9 | pub(crate) struct SearchScope { | 11 | pub(crate) struct SearchScope { |
10 | pub scope: Vec<(FileId, Option<TextRange>)>, | 12 | pub files: Vec<(FileId, Option<TextRange>)>, |
11 | } | 13 | } |
12 | 14 | ||
13 | impl NameDefinition { | 15 | impl NameDefinition { |
14 | pub fn scope(&self, db: &RootDatabase) -> SearchScope { | 16 | pub(crate) fn scope(&self, db: &RootDatabase) -> SearchScope { |
15 | let module_src = self.container.definition_source(db); | 17 | let module_src = self.container.definition_source(db); |
16 | let file_id = module_src.file_id.original_file(db); | 18 | let file_id = module_src.file_id.original_file(db); |
17 | 19 | ||
18 | if let NameKind::Pat((def, _)) = self.item { | 20 | if let NameKind::Pat((def, _)) = self.kind { |
19 | let range = match def { | 21 | let range = match def { |
20 | DefWithBody::Function(f) => f.source(db).ast.syntax().text_range(), | 22 | DefWithBody::Function(f) => f.source(db).ast.syntax().text_range(), |
21 | DefWithBody::Const(c) => c.source(db).ast.syntax().text_range(), | 23 | DefWithBody::Const(c) => c.source(db).ast.syntax().text_range(), |
22 | DefWithBody::Static(s) => s.source(db).ast.syntax().text_range(), | 24 | DefWithBody::Static(s) => s.source(db).ast.syntax().text_range(), |
23 | }; | 25 | }; |
24 | return SearchScope { scope: vec![(file_id, Some(range))] }; | 26 | return SearchScope { files: vec![(file_id, Some(range))] }; |
25 | } | 27 | } |
26 | 28 | ||
27 | if let Some(ref vis) = self.visibility { | 29 | if let Some(ref vis) = self.visibility { |
@@ -30,7 +32,7 @@ impl NameDefinition { | |||
30 | let mut files = source_root.walk().map(|id| (id.into(), None)).collect::<Vec<_>>(); | 32 | let mut files = source_root.walk().map(|id| (id.into(), None)).collect::<Vec<_>>(); |
31 | 33 | ||
32 | if vis.syntax().to_string().as_str() == "pub(crate)" { | 34 | if vis.syntax().to_string().as_str() == "pub(crate)" { |
33 | return SearchScope { scope: files }; | 35 | return SearchScope { files }; |
34 | } | 36 | } |
35 | if vis.syntax().to_string().as_str() == "pub" { | 37 | if vis.syntax().to_string().as_str() == "pub" { |
36 | let krate = self.container.krate(db).unwrap(); | 38 | let krate = self.container.krate(db).unwrap(); |
@@ -47,7 +49,7 @@ impl NameDefinition { | |||
47 | } | 49 | } |
48 | } | 50 | } |
49 | 51 | ||
50 | return SearchScope { scope: files }; | 52 | return SearchScope { files }; |
51 | } | 53 | } |
52 | // FIXME: "pub(super)", "pub(in path)" | 54 | // FIXME: "pub(super)", "pub(in path)" |
53 | } | 55 | } |
@@ -56,6 +58,6 @@ impl NameDefinition { | |||
56 | ModuleSource::Module(m) => Some(m.syntax().text_range()), | 58 | ModuleSource::Module(m) => Some(m.syntax().text_range()), |
57 | ModuleSource::SourceFile(_) => None, | 59 | ModuleSource::SourceFile(_) => None, |
58 | }; | 60 | }; |
59 | SearchScope { scope: vec![(file_id, range)] } | 61 | SearchScope { files: vec![(file_id, range)] } |
60 | } | 62 | } |
61 | } | 63 | } |