summaryrefslogtreecommitdiff
path: root/script/parser/guide.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/parser/guide.lua')
-rw-r--r--script/parser/guide.lua52
1 files changed, 31 insertions, 21 deletions
diff --git a/script/parser/guide.lua b/script/parser/guide.lua
index 0ece65fc..06169b09 100644
--- a/script/parser/guide.lua
+++ b/script/parser/guide.lua
@@ -16,6 +16,7 @@ local type = type
---@field uri uri
---@field start integer
---@field finish integer
+---@field range integer
---@field effect integer
---@field attrs string[]
---@field specials parser.object[]
@@ -56,6 +57,14 @@ local type = type
---@field init parser.object
---@field step parser.object
---@field redundant { max: integer, passed: integer }
+---@field filter parser.object
+---@field loc parser.object
+---@field keyword integer[]
+---@field casts parser.object[]
+---@field mode? '+' | '-'
+---@field hasGoTo? true
+---@field hasReturn? true
+---@field hasBreak? true
---@field _root parser.object
---@class guide
@@ -71,6 +80,7 @@ local blockTypes = {
['repeat'] = true,
['do'] = true,
['function'] = true,
+ ['if'] = true,
['ifblock'] = true,
['elseblock'] = true,
['elseifblock'] = true,
@@ -141,6 +151,9 @@ local childMap = {
['doc.see'] = {'name', 'field'},
['doc.version'] = {'#versions'},
['doc.diagnostic'] = {'#names'},
+ ['doc.as'] = {'as'},
+ ['doc.cast'] = {'loc', '#casts'},
+ ['doc.cast.block'] = {'extends'},
}
---@type table<string, fun(obj: parser.object, list: parser.object[])>
@@ -393,6 +406,7 @@ function m.getRoot(obj)
end
local parent = obj.parent
if not parent then
+ log.error('Can not find out root:', obj.type)
return nil
end
obj = parent
@@ -413,6 +427,7 @@ function m.getUri(obj)
return ''
end
+---@return parser.object?
function m.getENV(source, start)
if not start then
start = 1
@@ -446,19 +461,17 @@ function m.getFunctionVarArgs(func)
end
--- 获取指定区块中可见的局部变量
----@param block table
----@param name string {comment = '变量名'}
----@param pos integer {comment = '可见位置'}
-function m.getLocal(block, name, pos)
- block = m.getBlock(block)
- for _ = 1, 10000 do
- if not block then
- return nil
- end
- local locals = block.locals
- local res
+---@param source parser.object
+---@param name string # 变量名
+---@param pos integer # 可见位置
+---@return parser.object?
+function m.getLocal(source, name, pos)
+ local root = m.getRoot(source)
+ local res
+ m.eachSourceContain(root, pos, function (src)
+ local locals = src.locals
if not locals then
- goto CONTINUE
+ return
end
for i = 1, #locals do
local loc = locals[i]
@@ -471,13 +484,8 @@ function m.getLocal(block, name, pos)
end
end
end
- if res then
- return res, res
- end
- ::CONTINUE::
- block = m.getParentBlock(block)
- end
- error('guide.getLocal overstack')
+ end)
+ return res
end
--- 获取指定区块中所有的可见局部变量名称
@@ -602,6 +610,9 @@ local function addChilds(list, obj)
end
--- 遍历所有包含position的source
+---@param ast parser.object
+---@param position integer
+---@param callback fun(src: parser.object)
function m.eachSourceContain(ast, position, callback)
local list = { ast }
local mark = {}
@@ -922,6 +933,7 @@ function m.getKeyNameOfLiteral(obj)
end
end
+---@return string?
function m.getKeyName(obj)
if not obj then
return nil
@@ -1027,8 +1039,6 @@ function m.getKeyType(obj)
return type(obj.field[1])
elseif tp == 'doc.type.field' then
return type(obj.name[1])
- elseif tp == 'dummy' then
- return 'string'
end
if tp == 'doc.field.name' then
return type(obj[1])