Skip to content

Commit 1a67ac4

Browse files
committed
Started implementing lookup for file-local functions
1 parent 373aded commit 1a67ac4

File tree

3 files changed

+44
-14
lines changed

3 files changed

+44
-14
lines changed

Diff for: src/interpreter_env/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ pub fn setup_build_system_interpreter_symbols(file: &mut AstFile) {
182182

183183
file.funcs.push(thin_cstring_func(
184184
"adept",
185-
"version_string",
185+
"version",
186186
InterpreterSyscallKind::BuildSetAdeptVersion,
187187
));
188188

Diff for: src/resolve/func_haystack.rs

+37-12
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ use std::collections::HashMap;
2020
pub struct FuncHaystack {
2121
pub available: HashMap<ResolvedName, Vec<asg::FuncRef>>,
2222
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,
2425
}
2526

2627
#[derive(Clone, Debug)]
@@ -30,11 +31,16 @@ pub enum FindFunctionError {
3031
}
3132

3233
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 {
3439
Self {
3540
available: Default::default(),
3641
imported_namespaces,
37-
fs_node_id,
42+
physical_fs_node_id,
43+
module_fs_node_id,
3844
}
3945
}
4046

@@ -46,19 +52,29 @@ impl FuncHaystack {
4652
arguments: &[TypedExpr],
4753
source: Source,
4854
) -> 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))
5458
.unwrap_or(Err(FindFunctionError::NotDefined))
5559
}
5660

5761
pub fn find_near_matches(&self, ctx: &ResolveExprCtx, name: &Name) -> Vec<String> {
5862
// TODO: Clean up this function
5963

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();
6278

6379
let remote_matches = (!name.namespace.is_empty())
6480
.then(|| {
@@ -187,15 +203,24 @@ impl FuncHaystack {
187203
fn find_local(
188204
&self,
189205
ctx: &ResolveExprCtx,
190-
resolved_name: &ResolvedName,
206+
name: &Name,
191207
generics: &[PolyValue],
192208
arguments: &[TypedExpr],
193209
source: Source,
194210
) -> Option<Result<Callee, FindFunctionError>> {
195211
let mut local_matches = self
196212
.available
197-
.get(&resolved_name)
213+
.get(&ResolvedName::new(self.module_fs_node_id, name))
198214
.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+
)
199224
.flatten()
200225
.flat_map(|f| Self::fits(ctx, *f, generics, arguments, None, source));
201226

Diff for: src/resolve/func_head.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ pub fn create_func_heads<'a>(
3131
create_impl_heads(ctx, asg, options, module_file_id, *physical_file_id, file)?;
3232

3333
for (func_i, func) in file.funcs.iter().enumerate() {
34-
let name = ResolvedName::new(module_file_id, &Name::plain(&func.head.name));
34+
let name = if func.head.privacy.is_private() {
35+
ResolvedName::new(*physical_file_id, &Name::plain(&func.head.name))
36+
} else {
37+
ResolvedName::new(module_file_id, &Name::plain(&func.head.name))
38+
};
3539

3640
let func_ref = create_func_head(
3741
ctx,
@@ -60,6 +64,7 @@ pub fn create_func_heads<'a>(
6064
imported_namespaces
6165
.map(|namespaces| namespaces.clone())
6266
.unwrap_or_else(|| vec![]),
67+
*physical_file_id,
6368
module_file_id,
6469
)
6570
});

0 commit comments

Comments
 (0)