@@ -846,6 +846,44 @@ function vm.compileCallArg(arg, call, index)
846846 return vm .getNode (arg )
847847end
848848
849+ --- @class parser.object
850+ --- @field _iterator ? table
851+ --- @field _iterArgs ? table
852+ --- @field _iterVars ? table<parser.object , vm.node>
853+
854+ --- @param source parser.object
855+ local function compileForVars (source )
856+ if source ._iterator then
857+ return
858+ end
859+ -- for k, v in pairs(t) do
860+ -- > for k, v in iterator, status, initValue do
861+ -- > local k, v = iterator(status, initValue)
862+ source ._iterator = {
863+ type = ' dummyfunc' ,
864+ parent = source ,
865+ }
866+ source ._iterArgs = {{},{}}
867+ source ._iterVars = {}
868+ -- iterator
869+ selectNode (source ._iterator , source .exps , 1 )
870+ -- status
871+ selectNode (source ._iterArgs [1 ], source .exps , 2 )
872+ -- initValue
873+ selectNode (source ._iterArgs [2 ], source .exps , 3 )
874+ if source .keys then
875+ for i , loc in ipairs (source .keys ) do
876+ local node = getReturn (source ._iterator , i , source ._iterArgs )
877+ if node then
878+ if i == 1 then
879+ node :removeOptional ()
880+ end
881+ source ._iterVars [loc ] = node
882+ end
883+ end
884+ end
885+ end
886+
849887--- @param source parser.object
850888--- @return vm.node
851889local function compileLocal (source )
@@ -917,12 +955,18 @@ local function compileLocal(source)
917955 end
918956 -- for x in ... do
919957 if source .parent .type == ' in' then
920- vm .compileNode (source .parent )
958+ compileForVars (source .parent )
959+ local keyNode = source .parent ._iterVars [source ]
960+ if keyNode then
961+ vm .setNode (source , keyNode )
962+ end
921963 end
922964
923965 -- for x = ... do
924966 if source .parent .type == ' loop' then
925- vm .compileNode (source .parent )
967+ if source .parent .loc == source then
968+ vm .setNode (source , vm .declareGlobal (' type' , ' integer' ))
969+ end
926970 end
927971
928972 vm .getNode (source ):setData (' hasDefined' , hasMarkDoc or hasMarkParam or hasMarkValue )
@@ -1411,42 +1455,6 @@ local compilerSwitch = util.switch()
14111455 end
14121456 vm .setNode (source , node )
14131457 end )
1414- : case ' in'
1415- : call (function (source )
1416- if not source ._iterator then
1417- -- for k, v in pairs(t) do
1418- -- > for k, v in iterator, status, initValue do
1419- -- > local k, v = iterator(status, initValue)
1420- source ._iterator = {
1421- type = ' dummyfunc' ,
1422- parent = source ,
1423- }
1424- source ._iterArgs = {{},{}}
1425- end
1426- -- iterator
1427- selectNode (source ._iterator , source .exps , 1 )
1428- -- status
1429- selectNode (source ._iterArgs [1 ], source .exps , 2 )
1430- -- initValue
1431- selectNode (source ._iterArgs [2 ], source .exps , 3 )
1432- if source .keys then
1433- for i , loc in ipairs (source .keys ) do
1434- local node = getReturn (source ._iterator , i , source ._iterArgs )
1435- if node then
1436- if i == 1 then
1437- node :removeOptional ()
1438- end
1439- vm .setNode (loc , node )
1440- end
1441- end
1442- end
1443- end )
1444- : case ' loop'
1445- : call (function (source )
1446- if source .loc then
1447- vm .setNode (source .loc , vm .declareGlobal (' type' , ' integer' ))
1448- end
1449- end )
14501458 : case ' doc.type'
14511459 : call (function (source )
14521460 for _ , typeUnit in ipairs (source .types ) do
0 commit comments