aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/references
diff options
context:
space:
mode:
authorEkaterina Babshukova <[email protected]>2019-10-14 12:59:02 +0100
committerEkaterina Babshukova <[email protected]>2019-10-22 21:47:31 +0100
commit88ff88d3189de9dd9b0d88bdda3da769254c2b8e (patch)
tree080616bb7e00e028e8d561c828e48eb51956b635 /crates/ra_ide_api/src/references
parent19fbf2c16b5c1f39e23c720a2655cfdb49c25135 (diff)
use Lazy, some fixes
Diffstat (limited to 'crates/ra_ide_api/src/references')
-rw-r--r--crates/ra_ide_api/src/references/classify.rs34
-rw-r--r--crates/ra_ide_api/src/references/name_definition.rs20
-rw-r--r--crates/ra_ide_api/src/references/rename.rs2
-rw-r--r--crates/ra_ide_api/src/references/search_scope.rs16
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
1use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer}; 3use hir::{Either, FromSource, Module, ModuleSource, Path, PathResolution, Source, SourceAnalyzer};
2use ra_db::FileId; 4use ra_db::FileId;
3use ra_syntax::{ast, match_ast, AstNode, AstPtr}; 5use 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, &macro_call) { 135 if let Some(macro_def) = analyzer.resolve_macro_call(db, &macro_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
1use hir::{ 3use 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 {
22pub(crate) struct NameDefinition { 24pub(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
28pub(super) fn from_pat( 30pub(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
58pub(super) fn from_assoc_item(db: &RootDatabase, item: AssocItem) -> NameDefinition { 60pub(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
69pub(super) fn from_struct_field(db: &RootDatabase, field: StructField) -> NameDefinition { 71pub(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
80pub(super) fn from_module_def( 82pub(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
1use hir::ModuleSource; 3use hir::ModuleSource;
2use ra_db::SourceDatabase; 4use ra_db::SourceDatabase;
3use ra_syntax::{algo::find_node_at_offset, ast, AstNode, SyntaxNode}; 5use 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
1use hir::{DefWithBody, HasSource, ModuleSource}; 3use hir::{DefWithBody, HasSource, ModuleSource};
2use ra_db::{FileId, SourceDatabase}; 4use ra_db::{FileId, SourceDatabase};
3use ra_syntax::{AstNode, TextRange}; 5use ra_syntax::{AstNode, TextRange};
@@ -7,21 +9,21 @@ use crate::db::RootDatabase;
7use super::{NameDefinition, NameKind}; 9use super::{NameDefinition, NameKind};
8 10
9pub(crate) struct SearchScope { 11pub(crate) struct SearchScope {
10 pub scope: Vec<(FileId, Option<TextRange>)>, 12 pub files: Vec<(FileId, Option<TextRange>)>,
11} 13}
12 14
13impl NameDefinition { 15impl 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}