Skip to content

Commit be278e7

Browse files
authored
fix: type inference for user-defined module function return types (#811)
The inferModuleCallType() function only handled stdlib modules and returned empty types for user-defined modules. This caused type mismatch errors when variables were assigned from user module function calls without explicit type annotations. Now uses GetModuleFunction() to look up user-defined module function signatures and properly infer return types. Fixes #807
1 parent b26511c commit be278e7

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* main.ez - Test type inference for user-defined module function return types
3+
*
4+
* Tests issue #807: Type inference fails for user-defined module function return types
5+
*/
6+
module main
7+
8+
import & use @std
9+
import & use lib"./mylib"
10+
11+
do needs_u64(v u64) {
12+
println("Got u64: ${v}")
13+
}
14+
15+
do needs_string(s string) {
16+
println("Got string: ${s}")
17+
}
18+
19+
do needs_float(f float) {
20+
println("Got float: ${f}")
21+
}
22+
23+
do main() {
24+
println("========================================")
25+
println(" User Module Type Inference Test")
26+
println("========================================")
27+
println("")
28+
29+
// Test 1: Type inference from user module function returning u64
30+
temp val = lib.get_value() // Type should be inferred as u64
31+
needs_u64(val) // Should work without explicit type
32+
println("Test 1 PASSED: u64 type inference")
33+
34+
// Test 2: Type inference from user module function returning string
35+
temp str = lib.get_string() // Type should be inferred as string
36+
needs_string(str)
37+
println("Test 2 PASSED: string type inference")
38+
39+
// Test 3: Type inference from user module function returning float
40+
temp flt = lib.get_float() // Type should be inferred as float
41+
needs_float(flt)
42+
println("Test 3 PASSED: float type inference")
43+
44+
println("")
45+
println("========================================")
46+
println(" All Tests PASSED!")
47+
println("========================================")
48+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* mylib.ez - Test module for type inference from user-defined modules
3+
*/
4+
module mylib
5+
6+
do get_value() -> u64 {
7+
return 42
8+
}
9+
10+
do get_string() -> string {
11+
return "hello"
12+
}
13+
14+
do get_float() -> float {
15+
return 3.14
16+
}

pkg/typechecker/typechecker.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4725,6 +4725,13 @@ func (tc *TypeChecker) inferModuleCallType(member *ast.MemberExpression, args []
47254725
case "time":
47264726
return tc.inferTimeCallType(funcName, args)
47274727
default:
4728+
// Check user-defined modules
4729+
if sig, ok := tc.GetModuleFunction(moduleName, funcName); ok {
4730+
if len(sig.ReturnTypes) >= 1 {
4731+
return sig.ReturnTypes[0], true
4732+
}
4733+
return "void", true
4734+
}
47284735
return "", false
47294736
}
47304737
}

0 commit comments

Comments
 (0)