@@ -22,12 +22,26 @@ function mt:resolve(uri, args, removeGeneric)
2222 if not args then
2323 return nil
2424 end
25+
26+ --- @type table<string , vm.node>
2527 local resolved = {}
2628
27- --- @param object vm.node.object
29+ --- @param object vm.node | vm.node .object
2830 --- @param node vm.node
2931 local function resolve (object , node )
32+ if object .type == ' vm.node' then
33+ for o in object :eachObject () do
34+ resolve (o , node )
35+ end
36+ return
37+ end
38+ if object .type == ' doc.type' then
39+ --- @cast object parser.object
40+ resolve (vm .compileNode (object ), node )
41+ return
42+ end
3043 if object .type == ' doc.generic.name' then
44+ --- @type string
3145 local key = object [1 ]
3246 if object .literal then
3347 -- 'number' -> `T`
@@ -40,8 +54,21 @@ function mt:resolve(uri, args, removeGeneric)
4054 end
4155 else
4256 -- number -> T
43- resolved [key ] = vm .createNode (node , resolved [key ])
57+ for n in node :eachObject () do
58+ if n .type ~= ' doc.generic.name'
59+ and n .type ~= ' generic' then
60+ if resolved [key ] then
61+ resolved [key ]:merge (n )
62+ else
63+ resolved [key ] = vm .createNode (n )
64+ end
65+ end
66+ end
67+ if resolved [key ] and node :isOptional () then
68+ resolved [key ]:addOptional ()
69+ end
4470 end
71+ return
4572 end
4673 if object .type == ' doc.type.array' then
4774 for n in node :eachObject () do
@@ -68,6 +95,7 @@ function mt:resolve(uri, args, removeGeneric)
6895 resolve (object .node , vm .compileNode (n [1 ]))
6996 end
7097 end
98+ return
7199 end
72100 if object .type == ' doc.type.table' then
73101 for _ , ufield in ipairs (object .fields ) do
@@ -105,6 +133,34 @@ function mt:resolve(uri, args, removeGeneric)
105133 end
106134 :: CONTINUE::
107135 end
136+ return
137+ end
138+ if object .type == ' doc.type.function' then
139+ for i , arg in ipairs (object .args ) do
140+ for n in node :eachObject () do
141+ if n .type == ' function'
142+ or n .type == ' doc.type.function' then
143+ --- @cast n parser.object
144+ local farg = n .args and n .args [i ]
145+ if farg then
146+ resolve (arg .extends , vm .compileNode (farg ))
147+ end
148+ end
149+ end
150+ end
151+ for i , ret in ipairs (object .returns ) do
152+ for n in node :eachObject () do
153+ if n .type == ' function'
154+ or n .type == ' doc.type.function' then
155+ --- @cast n parser.object
156+ local fret = vm .getReturnOfFunction (n , i )
157+ if fret then
158+ resolve (ret , vm .compileNode (fret ))
159+ end
160+ end
161+ end
162+ end
163+ return
108164 end
109165 end
110166
@@ -190,9 +246,7 @@ function mt:resolve(uri, args, removeGeneric)
190246 local knownTypes , genericNames = getSignInfo (sign )
191247 if not isAllResolved (genericNames ) then
192248 local newArgNode = buildArgNode (argNode ,sign , knownTypes )
193- for n in sign :eachObject () do
194- resolve (n , newArgNode )
195- end
249+ resolve (sign , newArgNode )
196250 end
197251 end
198252
0 commit comments