@@ -1117,26 +1117,56 @@ local function compileFunctionParam(func, source)
1117
1117
end
1118
1118
--- @cast aindex integer
1119
1119
1120
- -- local call ---@type fun(f: fun(x: number));call(function (x) end) --> x -> number
1121
1120
local funcNode = vm .compileNode (func )
1122
- local found = false
1123
- for n in funcNode :eachObject () do
1124
- if n .type == ' doc.type.function' and n .args [aindex ] then
1125
- local argNode = vm .compileNode (n .args [aindex ])
1126
- for an in argNode :eachObject () do
1127
- if an .type ~= ' doc.generic.name' then
1128
- vm .setNode (source , an )
1121
+ if func .parent .type == ' callargs' then
1122
+ -- local call ---@type fun(f: fun(x: number));call(function (x) end) --> x -> number
1123
+ for n in funcNode :eachObject () do
1124
+ if n .type == ' doc.type.function' and n .args [aindex ] then
1125
+ local argNode = vm .compileNode (n .args [aindex ])
1126
+ for an in argNode :eachObject () do
1127
+ if an .type ~= ' doc.generic.name' then
1128
+ vm .setNode (source , an )
1129
+ end
1129
1130
end
1130
- end
1131
- -- NOTE: keep existing behavior for local call which only set type based on the 1st match
1132
- if func .parent .type == ' callargs' then
1131
+ -- NOTE: keep existing behavior for function as argument which only set type based on the 1st match
1133
1132
return true
1134
1133
end
1135
- found = true
1136
1134
end
1137
- end
1138
- if found then
1139
- return true
1135
+ else
1136
+ -- function declaration: use info from all `fun()`, also from the base function when overriding
1137
+ --[[
1138
+ ---@type fun ( x : string )| fun ( x : number )
1139
+ local function f1(x) end --> x -> string|number
1140
+
1141
+ ---@overload fun ( x : string )
1142
+ ---@overload fun ( x : number )
1143
+ local function f2(x) end --> x -> string|number
1144
+
1145
+ ---@class A
1146
+ local A = {}
1147
+ ---@param x number
1148
+ function A:f(x) end --> x -> number
1149
+ ---@type A
1150
+ local a = {}
1151
+ function a:f(x) end --> x -> number
1152
+ ]]
1153
+ local found = false
1154
+ for n in funcNode :eachObject () do
1155
+ if (n .type == ' doc.type.function' or n .type == ' function' )
1156
+ and n .args [aindex ] and n .args [aindex ] ~= source
1157
+ then
1158
+ local argNode = vm .compileNode (n .args [aindex ])
1159
+ for an in argNode :eachObject () do
1160
+ if an .type ~= ' doc.generic.name' then
1161
+ vm .setNode (source , an )
1162
+ end
1163
+ end
1164
+ found = true
1165
+ end
1166
+ end
1167
+ if found then
1168
+ return true
1169
+ end
1140
1170
end
1141
1171
1142
1172
local derviationParam = config .get (guide .getUri (func ), ' Lua.type.inferParamType' )
0 commit comments