diff --git a/src/main/java/com/tang/intellij/lua/ty/TySubstitutor.kt b/src/main/java/com/tang/intellij/lua/ty/TySubstitutor.kt index 018949d8..51180340 100644 --- a/src/main/java/com/tang/intellij/lua/ty/TySubstitutor.kt +++ b/src/main/java/com/tang/intellij/lua/ty/TySubstitutor.kt @@ -285,6 +285,16 @@ class GenericAnalyzer( } private fun visitSig(arg: IFunSignature, par: IFunSignature) { + par.params?.let { parParams -> + arg.params?.asSequence()?.zip(parParams.asSequence())?.forEach { (argParam, parParam) -> + if (argParam.ty != null) { + warp(argParam.ty) { + accept(Ty.resolve(context, parParam.ty ?: Primitives.UNKNOWN)) + } + } + } + } + arg.returnTy?.let { warp(it) { par.returnTy?.let { diff --git a/src/test/resources/inspections/function_generics.lua b/src/test/resources/inspections/function_generics.lua index 3c86435e..74091f65 100644 --- a/src/test/resources/inspections/function_generics.lua +++ b/src/test/resources/inspections/function_generics.lua @@ -808,3 +808,25 @@ numberArray = arrayWithUnionOfGenerics(stringArray, numberArray) numberArray = arrayWithUnionOfGenerics(stringArray, numberArray) + + +---@generic R +---@param fn fun(resume: (fun(result: R): void)): void +---@return R +local function nestedFunctionParameterInference(fn) + ---@type R + local r + + fn(function(userR) + r = userR + end) + + return r +end + +nestedFunctionParameterInference( + ---@param resume fun(result: number): void + function(resume) + resume(1) + end +)