@@ -58,6 +58,10 @@ local type = type
5858--- @field step parser.object
5959--- @field redundant { max : integer , passed : integer }
6060--- @field filter parser.object
61+ --- @field loc string
62+ --- @field keyword integer[]
63+ --- @field casts parser.object[]
64+ --- @field mode ? ' +' | ' -'
6165--- @field hasGoTo ? true
6266--- @field hasReturn ? true
6367--- @field hasBreak ? true
@@ -148,6 +152,8 @@ local childMap = {
148152 [' doc.version' ] = {' #versions' },
149153 [' doc.diagnostic' ] = {' #names' },
150154 [' doc.as' ] = {' as' },
155+ [' doc.cast' ] = {' loc' , ' #casts' },
156+ [' doc.cast.block' ] = {' extends' },
151157}
152158
153159--- @type table<string , fun ( obj : parser.object , list : parser.object[] ) >
@@ -420,7 +426,7 @@ function m.getUri(obj)
420426 return ' '
421427end
422428
423- --- @return parser.object
429+ --- @return parser.object ?
424430function m .getENV (source , start )
425431 if not start then
426432 start = 1
@@ -454,19 +460,17 @@ function m.getFunctionVarArgs(func)
454460end
455461
456462--- 获取指定区块中可见的局部变量
457- --- @param block table
458- --- @param name string {comment = ' 变量名' }
459- --- @param pos integer {comment = ' 可见位置' }
460- function m .getLocal (block , name , pos )
461- block = m .getBlock (block )
462- for _ = 1 , 10000 do
463- if not block then
464- return nil
465- end
466- local locals = block .locals
467- local res
463+ --- @param source parser.object
464+ --- @param name string # 变量名
465+ --- @param pos integer # 可见位置
466+ --- @return parser.object ?
467+ function m .getLocal (source , name , pos )
468+ local root = m .getRoot (source )
469+ local res
470+ m .eachSourceContain (root , pos , function (src )
471+ local locals = src .locals
468472 if not locals then
469- goto CONTINUE
473+ return
470474 end
471475 for i = 1 , # locals do
472476 local loc = locals [i ]
@@ -479,13 +483,8 @@ function m.getLocal(block, name, pos)
479483 end
480484 end
481485 end
482- if res then
483- return res , res
484- end
485- :: CONTINUE::
486- block = m .getParentBlock (block )
487- end
488- error (' guide.getLocal overstack' )
486+ end )
487+ return res
489488end
490489
491490--- 获取指定区块中所有的可见局部变量名称
@@ -610,6 +609,9 @@ local function addChilds(list, obj)
610609end
611610
612611--- 遍历所有包含position的source
612+ --- @param ast parser.object
613+ --- @param position integer
614+ --- @param callback fun ( src : parser.object )
613615function m .eachSourceContain (ast , position , callback )
614616 local list = { ast }
615617 local mark = {}
0 commit comments