diff options
-rw-r--r-- | script/parser/guide.lua | 33 | ||||
-rw-r--r-- | script/vm/compiler.lua | 38 | ||||
-rw-r--r-- | script/vm/getDef.lua | 27 | ||||
-rw-r--r-- | script/vm/global-manager.lua | 18 | ||||
-rw-r--r-- | test/definition/luadoc.lua | 2 |
5 files changed, 78 insertions, 40 deletions
diff --git a/script/parser/guide.lua b/script/parser/guide.lua index 10b2badb..730a099d 100644 --- a/script/parser/guide.lua +++ b/script/parser/guide.lua @@ -809,20 +809,25 @@ function m.getLineRange(state, row) end local isSetMap = { - ['setglobal'] = true, - ['local'] = true, - ['setlocal'] = true, - ['setfield'] = true, - ['setmethod'] = true, - ['setindex'] = true, - ['tablefield'] = true, - ['tableindex'] = true, - ['tableexp'] = true, - ['doc.class.name'] = true, - ['doc.alias.name'] = true, - ['doc.field.name'] = true, - ['doc.field'] = true, - ['doc.type.field'] = true, + ['setglobal'] = true, + ['local'] = true, + ['setlocal'] = true, + ['setfield'] = true, + ['setmethod'] = true, + ['setindex'] = true, + ['tablefield'] = true, + ['tableindex'] = true, + ['tableexp'] = true, + ['label'] = true, + ['doc.class'] = true, + ['doc.alias'] = true, + ['doc.field'] = true, + ['doc.type.function'] = true, + ['doc.type.table'] = true, + ['doc.class.name'] = true, + ['doc.alias.name'] = true, + ['doc.field.name'] = true, + ['doc.type.field'] = true, } function m.isSet(source) local tp = source.type diff --git a/script/vm/compiler.lua b/script/vm/compiler.lua index 84de7058..7053e61c 100644 --- a/script/vm/compiler.lua +++ b/script/vm/compiler.lua @@ -238,6 +238,13 @@ local function bindDocs(source) m.setNode(source, m.compileNode(doc)) end end + if doc.type == 'doc.class' then + if source.type == 'local' + or (source._globalNode and guide.isSet(source)) then + hasFounded = true + m.setNode(source, m.compileNode(doc)) + end + end if doc.type == 'doc.param' then if isParam and source[1] == doc.param[1] then hasFounded = true @@ -360,26 +367,10 @@ local compilerMap = util.switch() m.setNode(source, m.compileNode(typeUnit)) end end) - : case 'doc.type.name' - : call(function (source) - local name = source[1] - local uri = guide.getUri(source) - local type = globalMgr.declareGlobal('type', name, uri) - type:addGet(uri, source) - m.setNode(source, type) - end) : case 'doc.field' : call(function (source) m.setNode(source, m.compileNode(source.extends)) end) - : case 'doc.extends.name' - : call(function (source) - local name = source[1] - local uri = guide.getUri(source) - local type = globalMgr.declareGlobal('type', name, uri) - type:addGet(uri, source) - m.setNode(source, type) - end) : case 'doc.param' : call(function (source) m.setNode(source, m.compileNode(source.extends)) @@ -410,6 +401,13 @@ local compilerMap = util.switch() : call(function (source) m.setNode(source, m.compileNode(source.overload)) end) + : case 'doc.see.name' + : call(function (source) + local type = globalMgr.getGlobal('type', source[1]) + if type then + m.setNode(source, m.compileNode(type)) + end + end) : getMap() ---@param source parser.object @@ -428,9 +426,11 @@ local function compileByGlobal(source) end if source._globalNode then m.setNode(source, source._globalNode) - for _, set in ipairs(source._globalNode:getSets()) do - if set.value then - m.setNode(source, m.compileNode(set.value)) + if source._globalNode.cate == 'variable' then + for _, set in ipairs(source._globalNode:getSets()) do + if set.value then + m.setNode(source, m.compileNode(set.value)) + end end end return diff --git a/script/vm/getDef.lua b/script/vm/getDef.lua index 9ba90eb1..b454ad48 100644 --- a/script/vm/getDef.lua +++ b/script/vm/getDef.lua @@ -127,14 +127,26 @@ local nodeMap = util.switch() : case 'getindex' : case 'setindex' : call(function (source, pushResult) - local node = compiler.compileNode(source.node) - if not node then + local parentNode = compiler.compileNode(source.node) + if not parentNode then return end local key = guide.getKeyName(source) - for n in compiler.eachNode(node) do - if searchFieldMap[n.type] then - searchFieldMap[n.type](n, key, pushResult) + for pn in compiler.eachNode(parentNode) do + if searchFieldMap[pn.type] then + searchFieldMap[pn.type](pn, key, pushResult) + end + end + end) + : case 'doc.see.field' + : call(function (source, pushResult) + local parentNode = compiler.compileNode(source.parent.name) + if not parentNode then + return + end + for pn in compiler.eachNode(parentNode) do + if searchFieldMap[pn.type] then + searchFieldMap[pn.type](pn, source[1], pushResult) end end end) @@ -216,7 +228,10 @@ function vm.getDefs(source) end if not mark[src] then mark[src] = true - results[#results+1] = src + if guide.isSet(src) + or guide.isLiteral(src) then + results[#results+1] = src + end end end diff --git a/script/vm/global-manager.lua b/script/vm/global-manager.lua index bda7b744..a225be87 100644 --- a/script/vm/global-manager.lua +++ b/script/vm/global-manager.lua @@ -141,6 +141,7 @@ local compilerGlobalMap = util.switch() local name = guide.getKeyName(source) local class = m.declareGlobal('type', name, uri) class:addSet(uri, source) + source._globalNode = class end) : case 'doc.alias' : call(function (source) @@ -148,6 +149,23 @@ local compilerGlobalMap = util.switch() local name = guide.getKeyName(source) local alias = m.declareGlobal('type', name, uri) alias:addSet(uri, source) + source._globalNode = alias + end) + : case 'doc.type.name' + : call(function (source) + local uri = guide.getUri(source) + local name = source[1] + local type = m.declareGlobal('type', name, uri) + type:addGet(uri, source) + source._globalNode = type + end) + : case 'doc.extends.name' + : call(function (source) + local uri = guide.getUri(source) + local name = source[1] + local class = m.declareGlobal('type', name, uri) + class:addGet(uri, source) + source._globalNode = class end) : getMap() diff --git a/test/definition/luadoc.lua b/test/definition/luadoc.lua index 118eff5e..58260849 100644 --- a/test/definition/luadoc.lua +++ b/test/definition/luadoc.lua @@ -192,7 +192,7 @@ y.<?a?> TEST [[ ---@class <!loli!> -local <!unit!> +local unit function unit:pants() end |