@@ -8,28 +8,30 @@ mod utils;
88
99use error:: ReferencesError ;
1010use node_finder:: NodeVisitor ;
11- use solc_wrapper:: { command :: SolcCommand , get_ast_from_solc_output , SolcAstFile } ;
11+ use solc_wrapper:: { get_ast_for_file , SolcAstFile } ;
1212pub use solc_ast_rs_types:: types:: * ;
13- use types:: { InteractableNode , Position } ;
13+ pub use types:: { Location , Position } ;
14+ use types:: { get_id, get_range, get_reference_id, InteractableNode } ;
1415use usages:: UsagesFinder ;
16+ use utils:: index_to_position;
1517
16-
18+ # [ derive ( Debug ) ]
1719pub struct ReferencesProvider {
18- files : Vec < SolcAstFile >
20+ pub files : Vec < SolcAstFile >
1921}
2022
2123impl ReferencesProvider {
2224 pub fn update_file_content ( & mut self , filepath : String , content : String ) -> Result < ( ) , ReferencesError > {
23- let solc = SolcCommand :: new ( filepath) ;
24- let out = solc. execute_with_input ( & content) ?;
25- let out = String :: from_utf8_lossy ( & out. stdout ) ;
26- let ast_files = get_ast_from_solc_output ( & out) ?;
25+ let ast_files = get_ast_for_file ( filepath, content) ?;
2726 for res_file in & ast_files {
2827 let mut found = false ;
2928 for file in & mut self . files {
3029 if file. file == res_file. file {
3130 found = true ;
3231 file. ast = res_file. ast . clone ( ) ;
32+ if res_file. src . len ( ) > 0 {
33+ file. src = res_file. src . clone ( ) ;
34+ }
3335 break ;
3436 }
3537 }
@@ -40,26 +42,43 @@ impl ReferencesProvider {
4042 Ok ( ( ) )
4143 }
4244
43- pub fn get_references ( & self , position : Position ) -> Vec < ( Position , Position ) > {
44- let mut references: Vec < ( Position , Position ) > = Vec :: new ( ) ;
45- let mut node : InteractableNode ;
46- let mut node_finder = NodeVisitor :: new ( position) ;
45+ pub fn get_references ( & self , position : Position ) -> Vec < Location > {
46+ let mut references: Vec < Location > = Vec :: new ( ) ;
47+ let mut found_node : Option < InteractableNode > = None ;
48+ let mut node_finder = NodeVisitor :: new ( position. clone ( ) , String :: from ( "" ) ) ;
4749 for file in & self . files {
48- node_finder. find ( file. ast ) ;
49- if let Some ( node ) = node_finder . node {
50- node = node. clone ( ) ;
50+ if let Some ( node ) = node_finder. find ( & file. ast , & file . src ) {
51+ found_node = Some ( node. clone ( ) ) ;
52+ eprintln ! ( "Found node: {:?}" , node) ;
5153 break ;
5254 }
5355 }
54- let mut usages_finder = UsagesFinder {
55- id : get_id ! ( node) ,
56- token : get_name ! ( node) ,
57- to_find : references,
56+ if found_node. is_none ( ) {
57+ eprintln ! ( "No node found at position: {:?}" , & position) ;
58+ return references;
59+ }
60+ let found_node = found_node. unwrap ( ) ;
61+ let ref_id = match get_reference_id ( & found_node. clone ( ) )
62+ {
63+ Some ( id) => id,
64+ None => get_id ( & found_node. clone ( ) )
5865 } ;
66+
67+ eprintln ! ( "Ref id: {:?}" , ref_id) ;
68+
69+ let mut usages_finder = UsagesFinder :: new ( ref_id) ;
5970 for file in & self . files {
6071 let nodes = usages_finder. find ( & file. ast ) ;
6172 for node in nodes {
62- references. push ( node) ;
73+ let range = get_range ( & node) ;
74+ let start = index_to_position ( range. index , & file. src ) ;
75+ let end = index_to_position ( range. index + range. length , & file. src ) ;
76+ let location = Location {
77+ start,
78+ end,
79+ uri : file. file . clone ( )
80+ } ;
81+ references. push ( location) ;
6382 }
6483 }
6584 references
0 commit comments