aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src')
-rw-r--r--crates/ra_ide/src/impls.rs31
-rw-r--r--crates/ra_ide/src/references/classify.rs4
2 files changed, 18 insertions, 17 deletions
diff --git a/crates/ra_ide/src/impls.rs b/crates/ra_ide/src/impls.rs
index 31195036e..bd14a6d13 100644
--- a/crates/ra_ide/src/impls.rs
+++ b/crates/ra_ide/src/impls.rs
@@ -1,6 +1,6 @@
1//! FIXME: write short doc here 1//! FIXME: write short doc here
2 2
3use hir::{FromSource, ImplBlock}; 3use hir::{ImplBlock, SourceBinder};
4use ra_db::SourceDatabase; 4use ra_db::SourceDatabase;
5use ra_syntax::{algo::find_node_at_offset, ast, AstNode}; 5use ra_syntax::{algo::find_node_at_offset, ast, AstNode};
6 6
@@ -12,6 +12,7 @@ pub(crate) fn goto_implementation(
12) -> Option<RangeInfo<Vec<NavigationTarget>>> { 12) -> Option<RangeInfo<Vec<NavigationTarget>>> {
13 let parse = db.parse(position.file_id); 13 let parse = db.parse(position.file_id);
14 let syntax = parse.tree().syntax().clone(); 14 let syntax = parse.tree().syntax().clone();
15 let mut sb = SourceBinder::new(db);
15 16
16 let src = hir::ModuleSource::from_position(db, position); 17 let src = hir::ModuleSource::from_position(db, position);
17 let module = hir::Module::from_definition( 18 let module = hir::Module::from_definition(
@@ -22,12 +23,12 @@ pub(crate) fn goto_implementation(
22 if let Some(nominal_def) = find_node_at_offset::<ast::NominalDef>(&syntax, position.offset) { 23 if let Some(nominal_def) = find_node_at_offset::<ast::NominalDef>(&syntax, position.offset) {
23 return Some(RangeInfo::new( 24 return Some(RangeInfo::new(
24 nominal_def.syntax().text_range(), 25 nominal_def.syntax().text_range(),
25 impls_for_def(db, position, &nominal_def, module)?, 26 impls_for_def(&mut sb, position, &nominal_def, module)?,
26 )); 27 ));
27 } else if let Some(trait_def) = find_node_at_offset::<ast::TraitDef>(&syntax, position.offset) { 28 } else if let Some(trait_def) = find_node_at_offset::<ast::TraitDef>(&syntax, position.offset) {
28 return Some(RangeInfo::new( 29 return Some(RangeInfo::new(
29 trait_def.syntax().text_range(), 30 trait_def.syntax().text_range(),
30 impls_for_trait(db, position, &trait_def, module)?, 31 impls_for_trait(&mut sb, position, &trait_def, module)?,
31 )); 32 ));
32 } 33 }
33 34
@@ -35,7 +36,7 @@ pub(crate) fn goto_implementation(
35} 36}
36 37
37fn impls_for_def( 38fn impls_for_def(
38 db: &RootDatabase, 39 sb: &mut SourceBinder<RootDatabase>,
39 position: FilePosition, 40 position: FilePosition,
40 node: &ast::NominalDef, 41 node: &ast::NominalDef,
41 module: hir::Module, 42 module: hir::Module,
@@ -43,43 +44,43 @@ fn impls_for_def(
43 let ty = match node { 44 let ty = match node {
44 ast::NominalDef::StructDef(def) => { 45 ast::NominalDef::StructDef(def) => {
45 let src = hir::InFile { file_id: position.file_id.into(), value: def.clone() }; 46 let src = hir::InFile { file_id: position.file_id.into(), value: def.clone() };
46 hir::Struct::from_source(db, src)?.ty(db) 47 sb.to_def::<hir::Struct, _>(src)?.ty(sb.db)
47 } 48 }
48 ast::NominalDef::EnumDef(def) => { 49 ast::NominalDef::EnumDef(def) => {
49 let src = hir::InFile { file_id: position.file_id.into(), value: def.clone() }; 50 let src = hir::InFile { file_id: position.file_id.into(), value: def.clone() };
50 hir::Enum::from_source(db, src)?.ty(db) 51 sb.to_def::<hir::Enum, _>(src)?.ty(sb.db)
51 } 52 }
52 ast::NominalDef::UnionDef(def) => { 53 ast::NominalDef::UnionDef(def) => {
53 let src = hir::InFile { file_id: position.file_id.into(), value: def.clone() }; 54 let src = hir::InFile { file_id: position.file_id.into(), value: def.clone() };
54 hir::Union::from_source(db, src)?.ty(db) 55 sb.to_def::<hir::Union, _>(src)?.ty(sb.db)
55 } 56 }
56 }; 57 };
57 58
58 let krate = module.krate(); 59 let krate = module.krate();
59 let impls = ImplBlock::all_in_crate(db, krate); 60 let impls = ImplBlock::all_in_crate(sb.db, krate);
60 61
61 Some( 62 Some(
62 impls 63 impls
63 .into_iter() 64 .into_iter()
64 .filter(|impl_block| ty.is_equal_for_find_impls(&impl_block.target_ty(db))) 65 .filter(|impl_block| ty.is_equal_for_find_impls(&impl_block.target_ty(sb.db)))
65 .map(|imp| imp.to_nav(db)) 66 .map(|imp| imp.to_nav(sb.db))
66 .collect(), 67 .collect(),
67 ) 68 )
68} 69}
69 70
70fn impls_for_trait( 71fn impls_for_trait(
71 db: &RootDatabase, 72 sb: &mut SourceBinder<RootDatabase>,
72 position: FilePosition, 73 position: FilePosition,
73 node: &ast::TraitDef, 74 node: &ast::TraitDef,
74 module: hir::Module, 75 module: hir::Module,
75) -> Option<Vec<NavigationTarget>> { 76) -> Option<Vec<NavigationTarget>> {
76 let src = hir::InFile { file_id: position.file_id.into(), value: node.clone() }; 77 let src = hir::InFile { file_id: position.file_id.into(), value: node.clone() };
77 let tr = hir::Trait::from_source(db, src)?; 78 let tr = sb.to_def(src)?;
78 79
79 let krate = module.krate(); 80 let krate = module.krate();
80 let impls = ImplBlock::for_trait(db, krate, tr); 81 let impls = ImplBlock::for_trait(sb.db, krate, tr);
81 82
82 Some(impls.into_iter().map(|imp| imp.to_nav(db)).collect()) 83 Some(impls.into_iter().map(|imp| imp.to_nav(sb.db)).collect())
83} 84}
84 85
85#[cfg(test)] 86#[cfg(test)]
@@ -210,7 +211,7 @@ mod tests {
210 " 211 "
211 //- /lib.rs 212 //- /lib.rs
212 #[derive(Copy)] 213 #[derive(Copy)]
213 struct Foo<|>; 214 struct Foo<|>;
214 ", 215 ",
215 &["impl IMPL_BLOCK FileId(1) [0; 15)"], 216 &["impl IMPL_BLOCK FileId(1) [0; 15)"],
216 ); 217 );
diff --git a/crates/ra_ide/src/references/classify.rs b/crates/ra_ide/src/references/classify.rs
index 4a6e11e27..dcffc3df2 100644
--- a/crates/ra_ide/src/references/classify.rs
+++ b/crates/ra_ide/src/references/classify.rs
@@ -1,6 +1,6 @@
1//! Functions that are used to classify an element from its definition or reference. 1//! Functions that are used to classify an element from its definition or reference.
2 2
3use hir::{FromSource, InFile, Module, ModuleSource, PathResolution, SourceBinder}; 3use hir::{InFile, Module, ModuleSource, PathResolution, SourceBinder};
4use ra_prof::profile; 4use ra_prof::profile;
5use ra_syntax::{ast, match_ast, AstNode}; 5use ra_syntax::{ast, match_ast, AstNode};
6use test_utils::tested_by; 6use test_utils::tested_by;
@@ -101,7 +101,7 @@ pub(crate) fn classify_name(
101 }, 101 },
102 ast::MacroCall(it) => { 102 ast::MacroCall(it) => {
103 let src = name.with_value(it); 103 let src = name.with_value(it);
104 let def = hir::MacroDef::from_source(sb.db, src.clone())?; 104 let def = sb.to_def(src.clone())?;
105 105
106 let module_src = ModuleSource::from_child_node(sb.db, src.as_ref().map(|it| it.syntax())); 106 let module_src = ModuleSource::from_child_node(sb.db, src.as_ref().map(|it| it.syntax()));
107 let module = Module::from_definition(sb.db, src.with_value(module_src))?; 107 let module = Module::from_definition(sb.db, src.with_value(module_src))?;