diff options
Diffstat (limited to 'crates/ra_hir/src/ty')
-rw-r--r-- | crates/ra_hir/src/ty/method_resolution.rs | 39 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 6 |
2 files changed, 21 insertions, 24 deletions
diff --git a/crates/ra_hir/src/ty/method_resolution.rs b/crates/ra_hir/src/ty/method_resolution.rs index 94c5124a9..b221bd142 100644 --- a/crates/ra_hir/src/ty/method_resolution.rs +++ b/crates/ra_hir/src/ty/method_resolution.rs | |||
@@ -6,7 +6,7 @@ use std::sync::Arc; | |||
6 | 6 | ||
7 | use rustc_hash::FxHashMap; | 7 | use rustc_hash::FxHashMap; |
8 | 8 | ||
9 | use ra_db::{Cancelable, SourceRootId}; | 9 | use ra_db::SourceRootId; |
10 | 10 | ||
11 | use crate::{HirDatabase, DefId, module_tree::ModuleId, Module, Crate, Name, Function, impl_block::{ImplId, ImplBlock, ImplItem}}; | 11 | use crate::{HirDatabase, DefId, module_tree::ModuleId, Module, Crate, Name, Function, impl_block::{ImplId, ImplBlock, ImplItem}}; |
12 | use super::Ty; | 12 | use super::Ty; |
@@ -42,7 +42,7 @@ impl CrateImplBlocks { | |||
42 | &'a self, | 42 | &'a self, |
43 | db: &'a impl HirDatabase, | 43 | db: &'a impl HirDatabase, |
44 | ty: &Ty, | 44 | ty: &Ty, |
45 | ) -> impl Iterator<Item = Cancelable<ImplBlock>> + 'a { | 45 | ) -> impl Iterator<Item = ImplBlock> + 'a { |
46 | let fingerprint = TyFingerprint::for_impl(ty); | 46 | let fingerprint = TyFingerprint::for_impl(ty); |
47 | fingerprint | 47 | fingerprint |
48 | .and_then(|f| self.impls.get(&f)) | 48 | .and_then(|f| self.impls.get(&f)) |
@@ -50,11 +50,11 @@ impl CrateImplBlocks { | |||
50 | .flat_map(|i| i.iter()) | 50 | .flat_map(|i| i.iter()) |
51 | .map(move |(module_id, impl_id)| { | 51 | .map(move |(module_id, impl_id)| { |
52 | let module_impl_blocks = db.impls_in_module(self.source_root_id, *module_id); | 52 | let module_impl_blocks = db.impls_in_module(self.source_root_id, *module_id); |
53 | Ok(ImplBlock::from_id(module_impl_blocks, *impl_id)) | 53 | ImplBlock::from_id(module_impl_blocks, *impl_id) |
54 | }) | 54 | }) |
55 | } | 55 | } |
56 | 56 | ||
57 | fn collect_recursive(&mut self, db: &impl HirDatabase, module: Module) -> Cancelable<()> { | 57 | fn collect_recursive(&mut self, db: &impl HirDatabase, module: Module) { |
58 | let module_id = module.def_id.loc(db).module_id; | 58 | let module_id = module.def_id.loc(db).module_id; |
59 | let module_impl_blocks = db.impls_in_module(self.source_root_id, module_id); | 59 | let module_impl_blocks = db.impls_in_module(self.source_root_id, module_id); |
60 | 60 | ||
@@ -65,7 +65,7 @@ impl CrateImplBlocks { | |||
65 | // ignore for now | 65 | // ignore for now |
66 | } else { | 66 | } else { |
67 | let target_ty = | 67 | let target_ty = |
68 | Ty::from_hir(db, &module, Some(&impl_block), impl_data.target_type())?; | 68 | Ty::from_hir(db, &module, Some(&impl_block), impl_data.target_type()); |
69 | if let Some(target_ty_fp) = TyFingerprint::for_impl(&target_ty) { | 69 | if let Some(target_ty_fp) = TyFingerprint::for_impl(&target_ty) { |
70 | self.impls | 70 | self.impls |
71 | .entry(target_ty_fp) | 71 | .entry(target_ty_fp) |
@@ -76,16 +76,14 @@ impl CrateImplBlocks { | |||
76 | } | 76 | } |
77 | 77 | ||
78 | for child in module.children(db) { | 78 | for child in module.children(db) { |
79 | self.collect_recursive(db, child)?; | 79 | self.collect_recursive(db, child); |
80 | } | 80 | } |
81 | |||
82 | Ok(()) | ||
83 | } | 81 | } |
84 | 82 | ||
85 | pub(crate) fn impls_in_crate_query( | 83 | pub(crate) fn impls_in_crate_query( |
86 | db: &impl HirDatabase, | 84 | db: &impl HirDatabase, |
87 | krate: Crate, | 85 | krate: Crate, |
88 | ) -> Cancelable<Arc<CrateImplBlocks>> { | 86 | ) -> Arc<CrateImplBlocks> { |
89 | let crate_graph = db.crate_graph(); | 87 | let crate_graph = db.crate_graph(); |
90 | let file_id = crate_graph.crate_root(krate.crate_id); | 88 | let file_id = crate_graph.crate_root(krate.crate_id); |
91 | let source_root_id = db.file_source_root(file_id); | 89 | let source_root_id = db.file_source_root(file_id); |
@@ -94,9 +92,9 @@ impl CrateImplBlocks { | |||
94 | impls: FxHashMap::default(), | 92 | impls: FxHashMap::default(), |
95 | }; | 93 | }; |
96 | if let Some(module) = krate.root_module(db) { | 94 | if let Some(module) = krate.root_module(db) { |
97 | crate_impl_blocks.collect_recursive(db, module)?; | 95 | crate_impl_blocks.collect_recursive(db, module); |
98 | } | 96 | } |
99 | Ok(Arc::new(crate_impl_blocks)) | 97 | Arc::new(crate_impl_blocks) |
100 | } | 98 | } |
101 | } | 99 | } |
102 | 100 | ||
@@ -111,13 +109,13 @@ impl Ty { | |||
111 | // TODO: cache this as a query? | 109 | // TODO: cache this as a query? |
112 | // - if so, what signature? (TyFingerprint, Name)? | 110 | // - if so, what signature? (TyFingerprint, Name)? |
113 | // - or maybe cache all names and def_ids of methods per fingerprint? | 111 | // - or maybe cache all names and def_ids of methods per fingerprint? |
114 | pub fn lookup_method(self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<DefId>> { | 112 | pub fn lookup_method(self, db: &impl HirDatabase, name: &Name) -> Option<DefId> { |
115 | self.iterate_methods(db, |f| { | 113 | self.iterate_methods(db, |f| { |
116 | let sig = f.signature(db); | 114 | let sig = f.signature(db); |
117 | if sig.name() == name && sig.has_self_param() { | 115 | if sig.name() == name && sig.has_self_param() { |
118 | Ok(Some(f.def_id())) | 116 | Some(f.def_id()) |
119 | } else { | 117 | } else { |
120 | Ok(None) | 118 | None |
121 | } | 119 | } |
122 | }) | 120 | }) |
123 | } | 121 | } |
@@ -127,8 +125,8 @@ impl Ty { | |||
127 | pub fn iterate_methods<T>( | 125 | pub fn iterate_methods<T>( |
128 | self, | 126 | self, |
129 | db: &impl HirDatabase, | 127 | db: &impl HirDatabase, |
130 | mut callback: impl FnMut(Function) -> Cancelable<Option<T>>, | 128 | mut callback: impl FnMut(Function) -> Option<T>, |
131 | ) -> Cancelable<Option<T>> { | 129 | ) -> Option<T> { |
132 | // For method calls, rust first does any number of autoderef, and then one | 130 | // For method calls, rust first does any number of autoderef, and then one |
133 | // autoref (i.e. when the method takes &self or &mut self). We just ignore | 131 | // autoref (i.e. when the method takes &self or &mut self). We just ignore |
134 | // the autoref currently -- when we find a method matching the given name, | 132 | // the autoref currently -- when we find a method matching the given name, |
@@ -143,15 +141,14 @@ impl Ty { | |||
143 | Some(krate) => krate, | 141 | Some(krate) => krate, |
144 | None => continue, | 142 | None => continue, |
145 | }; | 143 | }; |
146 | let impls = db.impls_in_crate(krate)?; | 144 | let impls = db.impls_in_crate(krate); |
147 | 145 | ||
148 | for impl_block in impls.lookup_impl_blocks(db, &derefed_ty) { | 146 | for impl_block in impls.lookup_impl_blocks(db, &derefed_ty) { |
149 | let impl_block = impl_block?; | ||
150 | for item in impl_block.items() { | 147 | for item in impl_block.items() { |
151 | match item { | 148 | match item { |
152 | ImplItem::Method(f) => { | 149 | ImplItem::Method(f) => { |
153 | if let Some(result) = callback(f.clone())? { | 150 | if let Some(result) = callback(f.clone()) { |
154 | return Ok(Some(result)); | 151 | return Some(result); |
155 | } | 152 | } |
156 | } | 153 | } |
157 | _ => {} | 154 | _ => {} |
@@ -159,6 +156,6 @@ impl Ty { | |||
159 | } | 156 | } |
160 | } | 157 | } |
161 | } | 158 | } |
162 | Ok(None) | 159 | None |
163 | } | 160 | } |
164 | } | 161 | } |
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index b44ac9987..929fee04c 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs | |||
@@ -321,7 +321,7 @@ fn infer(content: &str) -> String { | |||
321 | .filter_map(ast::FnDef::cast) | 321 | .filter_map(ast::FnDef::cast) |
322 | { | 322 | { |
323 | let func = source_binder::function_from_source(&db, file_id, fn_def).unwrap(); | 323 | let func = source_binder::function_from_source(&db, file_id, fn_def).unwrap(); |
324 | let inference_result = func.infer(&db).unwrap(); | 324 | let inference_result = func.infer(&db); |
325 | let body_syntax_mapping = func.body_syntax_mapping(&db); | 325 | let body_syntax_mapping = func.body_syntax_mapping(&db); |
326 | let mut types = Vec::new(); | 326 | let mut types = Vec::new(); |
327 | for (pat, ty) in inference_result.type_of_pat.iter() { | 327 | for (pat, ty) in inference_result.type_of_pat.iter() { |
@@ -405,7 +405,7 @@ fn typing_whitespace_inside_a_function_should_not_invalidate_types() { | |||
405 | let func = source_binder::function_from_position(&db, pos).unwrap(); | 405 | let func = source_binder::function_from_position(&db, pos).unwrap(); |
406 | { | 406 | { |
407 | let events = db.log_executed(|| { | 407 | let events = db.log_executed(|| { |
408 | func.infer(&db).unwrap(); | 408 | func.infer(&db); |
409 | }); | 409 | }); |
410 | assert!(format!("{:?}", events).contains("infer")) | 410 | assert!(format!("{:?}", events).contains("infer")) |
411 | } | 411 | } |
@@ -424,7 +424,7 @@ fn typing_whitespace_inside_a_function_should_not_invalidate_types() { | |||
424 | 424 | ||
425 | { | 425 | { |
426 | let events = db.log_executed(|| { | 426 | let events = db.log_executed(|| { |
427 | func.infer(&db).unwrap(); | 427 | func.infer(&db); |
428 | }); | 428 | }); |
429 | assert!(!format!("{:?}", events).contains("infer"), "{:#?}", events) | 429 | assert!(!format!("{:?}", events).contains("infer"), "{:#?}", events) |
430 | } | 430 | } |