@@ -20,7 +20,8 @@ use std::collections::HashMap;
20
20
pub struct FuncHaystack {
21
21
pub available : HashMap < ResolvedName , Vec < asg:: FuncRef > > ,
22
22
pub imported_namespaces : Vec < Box < str > > ,
23
- pub fs_node_id : FsNodeId ,
23
+ pub physical_fs_node_id : FsNodeId ,
24
+ pub module_fs_node_id : FsNodeId ,
24
25
}
25
26
26
27
#[ derive( Clone , Debug ) ]
@@ -30,11 +31,16 @@ pub enum FindFunctionError {
30
31
}
31
32
32
33
impl FuncHaystack {
33
- pub fn new ( imported_namespaces : Vec < Box < str > > , fs_node_id : FsNodeId ) -> Self {
34
+ pub fn new (
35
+ imported_namespaces : Vec < Box < str > > ,
36
+ physical_fs_node_id : FsNodeId ,
37
+ module_fs_node_id : FsNodeId ,
38
+ ) -> Self {
34
39
Self {
35
40
available : Default :: default ( ) ,
36
41
imported_namespaces,
37
- fs_node_id,
42
+ physical_fs_node_id,
43
+ module_fs_node_id,
38
44
}
39
45
}
40
46
@@ -46,19 +52,29 @@ impl FuncHaystack {
46
52
arguments : & [ TypedExpr ] ,
47
53
source : Source ,
48
54
) -> Result < Callee , FindFunctionError > {
49
- let resolved_name = ResolvedName :: new ( self . fs_node_id , name) ;
50
-
51
- self . find_local ( ctx, & resolved_name, generics, arguments, source)
52
- . or_else ( || self . find_remote ( ctx, & name, generics, arguments, source) )
53
- . or_else ( || self . find_imported ( ctx, & name, generics, arguments, source) )
55
+ self . find_local ( ctx, name, generics, arguments, source)
56
+ . or_else ( || self . find_remote ( ctx, name, generics, arguments, source) )
57
+ . or_else ( || self . find_imported ( ctx, name, generics, arguments, source) )
54
58
. unwrap_or ( Err ( FindFunctionError :: NotDefined ) )
55
59
}
56
60
57
61
pub fn find_near_matches ( & self , ctx : & ResolveExprCtx , name : & Name ) -> Vec < String > {
58
62
// TODO: Clean up this function
59
63
60
- let resolved_name = ResolvedName :: new ( self . fs_node_id , name) ;
61
- let local_matches = self . available . get ( & resolved_name) . into_iter ( ) . flatten ( ) ;
64
+ let local_matches = self
65
+ . available
66
+ . get ( & ResolvedName :: new ( self . module_fs_node_id , name) )
67
+ . into_iter ( )
68
+ . chain (
69
+ ( self . module_fs_node_id != self . physical_fs_node_id )
70
+ . then ( || {
71
+ self . available
72
+ . get ( & ResolvedName :: new ( self . physical_fs_node_id , name) )
73
+ } )
74
+ . into_iter ( )
75
+ . flatten ( ) ,
76
+ )
77
+ . flatten ( ) ;
62
78
63
79
let remote_matches = ( !name. namespace . is_empty ( ) )
64
80
. then ( || {
@@ -187,15 +203,24 @@ impl FuncHaystack {
187
203
fn find_local (
188
204
& self ,
189
205
ctx : & ResolveExprCtx ,
190
- resolved_name : & ResolvedName ,
206
+ name : & Name ,
191
207
generics : & [ PolyValue ] ,
192
208
arguments : & [ TypedExpr ] ,
193
209
source : Source ,
194
210
) -> Option < Result < Callee , FindFunctionError > > {
195
211
let mut local_matches = self
196
212
. available
197
- . get ( & resolved_name )
213
+ . get ( & ResolvedName :: new ( self . module_fs_node_id , name ) )
198
214
. into_iter ( )
215
+ . chain (
216
+ ( self . module_fs_node_id != self . physical_fs_node_id )
217
+ . then ( || {
218
+ self . available
219
+ . get ( & ResolvedName :: new ( self . physical_fs_node_id , name) )
220
+ } )
221
+ . into_iter ( )
222
+ . flatten ( ) ,
223
+ )
199
224
. flatten ( )
200
225
. flat_map ( |f| Self :: fits ( ctx, * f, generics, arguments, None , source) ) ;
201
226
0 commit comments