Skip to content

Commit 80b2437

Browse files
committed
sema: fix owner generics ignored in type inference of the generic function calls
1 parent 5c04a72 commit 80b2437

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

std/jule/sema/sema.jule

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -881,35 +881,33 @@ impl sema {
881881
// - For non-generic type parsed string type kinds.
882882
// - For checking non-generic types.
883883
fn buildNonGenericType(mut &self, mut &ast: &ast::Expr,
884-
mut &generics: []&ast::Generic, mut &ignored: []&Type, mut &recheckNeed: []recheckableType): &Type {
884+
mut useGenerics: []&TypeAlias, mut &ignoreGenerics: []&ast::Generic, mut &ignored: []&Type, mut &recheckNeed: []recheckableType): &Type {
885885
mut tc := &typeChecker{
886886
s: self,
887887
rootLookup: self,
888888
lookup: self,
889-
ignoreGenerics: generics,
889+
useGenerics: useGenerics,
890+
ignoreGenerics: ignoreGenerics,
890891
ignoredGenerics: &ignored,
891892
recheckNeed: &recheckNeed,
892893
}
893894
ret tc.checkDecl(ast)
894895
}
895896

896897
fn buildFuncNonGenericTypes(mut &self, mut f: &FuncIns, mut &ignored: []&Type, mut &recheckNeed: []recheckableType): (ok: bool) {
897-
let mut generics: []&ast::Generic = nil
898-
if f.Decl.IsMethod() {
899-
generics = append(f.Decl.Generics, f.Decl.Owner.Generics...)
900-
} else {
901-
generics = f.Decl.Generics
902-
}
903-
ret self.basicFuncEnvironment(f, fn(mut &sema: &sema): (ok: bool) {
898+
// Check with funcEnvironment, we need to generics of owner, if any.
899+
// If owner generics are ignored, we cannot resolve them with type inference.
900+
// Resolve owner generics in time, only ignore generics of the function.
901+
ret self.funcEnvironment(f, fn(mut &sema: &sema, mut &generics: []&TypeAlias): (ok: bool) {
904902
ok = true
905903
for (_, mut p) in f.Params {
906904
if !p.Decl.IsSelf() {
907-
p.Type = sema.buildNonGenericType(p.Decl.TypeSym.Decl, generics, unsafe { ignored }, unsafe { recheckNeed })
905+
p.Type = sema.buildNonGenericType(p.Decl.TypeSym.Decl, generics, f.Decl.Generics, unsafe { ignored }, unsafe { recheckNeed })
908906
ok = ok && p.Type != nil
909907
}
910908
}
911909
if !f.Decl.IsVoid() {
912-
f.Result = sema.buildNonGenericType(f.Decl.Result.TypeSym.Decl, generics, unsafe { ignored }, unsafe { recheckNeed })
910+
f.Result = sema.buildNonGenericType(f.Decl.Result.TypeSym.Decl, generics, f.Decl.Generics, unsafe { ignored }, unsafe { recheckNeed })
913911
ok = ok && f.Result != nil
914912
}
915913
ret

0 commit comments

Comments
 (0)