@@ -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