@@ -13,57 +13,53 @@ use crate::{
1313use either:: Either ;
1414use rustc_hash:: FxHashSet ;
1515
16- pub struct ImportsLocator < ' a > {
17- sema : Semantics < ' a , RootDatabase > ,
16+ pub fn find_imports < ' a > (
17+ sema : & Semantics < ' a , RootDatabase > ,
1818 krate : Crate ,
19- }
20-
21- impl < ' a > ImportsLocator < ' a > {
22- pub fn new ( db : & ' a RootDatabase , krate : Crate ) -> Self {
23- Self { sema : Semantics :: new ( db) , krate }
24- }
19+ name_to_import : & str ,
20+ ) -> Vec < Either < ModuleDef , MacroDef > > {
21+ let _p = profile ( "search_for_imports" ) ;
22+ let db = sema. db ;
2523
26- pub fn find_imports ( & mut self , name_to_import : & str ) -> Vec < Either < ModuleDef , MacroDef > > {
27- let _p = profile ( "search_for_imports" ) ;
28- let db = self . sema . db ;
24+ // Query dependencies first.
25+ let mut candidates : FxHashSet < _ > =
26+ krate . query_external_importables ( db , name_to_import ) . collect ( ) ;
2927
30- // Query dependencies first.
31- let mut candidates: FxHashSet < _ > =
32- self . krate . query_external_importables ( db, name_to_import) . collect ( ) ;
28+ // Query the local crate using the symbol index.
29+ let local_results = {
30+ let mut query = Query :: new ( name_to_import. to_string ( ) ) ;
31+ query. exact ( ) ;
32+ query. limit ( 40 ) ;
33+ symbol_index:: crate_symbols ( db, krate. into ( ) , query)
34+ } ;
3335
34- // Query the local crate using the symbol index.
35- let local_results = {
36- let mut query = Query :: new ( name_to_import. to_string ( ) ) ;
37- query. exact ( ) ;
38- query. limit ( 40 ) ;
39- symbol_index:: crate_symbols ( db, self . krate . into ( ) , query)
40- } ;
36+ candidates. extend (
37+ local_results
38+ . into_iter ( )
39+ . filter_map ( |import_candidate| get_name_definition ( sema, & import_candidate) )
40+ . filter_map ( |name_definition_to_import| match name_definition_to_import {
41+ Definition :: ModuleDef ( module_def) => Some ( Either :: Left ( module_def) ) ,
42+ Definition :: Macro ( macro_def) => Some ( Either :: Right ( macro_def) ) ,
43+ _ => None ,
44+ } ) ,
45+ ) ;
4146
42- candidates. extend (
43- local_results
44- . into_iter ( )
45- . filter_map ( |import_candidate| self . get_name_definition ( & import_candidate) )
46- . filter_map ( |name_definition_to_import| match name_definition_to_import {
47- Definition :: ModuleDef ( module_def) => Some ( Either :: Left ( module_def) ) ,
48- Definition :: Macro ( macro_def) => Some ( Either :: Right ( macro_def) ) ,
49- _ => None ,
50- } ) ,
51- ) ;
52-
53- candidates. into_iter ( ) . collect ( )
54- }
47+ candidates. into_iter ( ) . collect ( )
48+ }
5549
56- fn get_name_definition ( & mut self , import_candidate : & FileSymbol ) -> Option < Definition > {
57- let _p = profile ( "get_name_definition" ) ;
58- let file_id = import_candidate. file_id ;
50+ fn get_name_definition < ' a > (
51+ sema : & Semantics < ' a , RootDatabase > ,
52+ import_candidate : & FileSymbol ,
53+ ) -> Option < Definition > {
54+ let _p = profile ( "get_name_definition" ) ;
55+ let file_id = import_candidate. file_id ;
5956
60- let candidate_node = import_candidate. ptr . to_node ( self . sema . parse ( file_id) . syntax ( ) ) ;
61- let candidate_name_node = if candidate_node. kind ( ) != NAME {
62- candidate_node. children ( ) . find ( |it| it. kind ( ) == NAME ) ?
63- } else {
64- candidate_node
65- } ;
66- let name = ast:: Name :: cast ( candidate_name_node) ?;
67- classify_name ( & self . sema , & name) ?. into_definition ( )
68- }
57+ let candidate_node = import_candidate. ptr . to_node ( sema. parse ( file_id) . syntax ( ) ) ;
58+ let candidate_name_node = if candidate_node. kind ( ) != NAME {
59+ candidate_node. children ( ) . find ( |it| it. kind ( ) == NAME ) ?
60+ } else {
61+ candidate_node
62+ } ;
63+ let name = ast:: Name :: cast ( candidate_name_node) ?;
64+ classify_name ( sema, & name) ?. into_definition ( )
6965}
0 commit comments