@@ -9,14 +9,13 @@ local vm = require 'vm.vm'
99--- @class parser.object
1010--- @field _compiledNodes boolean
1111--- @field _node vm.node
12- --- @field package _globalBase table
1312--- @field cindex integer
1413--- @field func parser.object
1514
1615-- 该函数有副作用,会给source绑定node!
1716--- @param source parser.object
1817--- @return boolean
19- local function bindDocs (source )
18+ function vm . bindDocs (source )
2019 local docs = source .bindDocs
2120 if not docs then
2221 return false
@@ -76,7 +75,7 @@ local function searchFieldByLocalID(source, key, pushResult)
7675 local hasMarkDoc = {}
7776 for _ , src in ipairs (fields ) do
7877 if src .bindDocs then
79- if bindDocs (src ) then
78+ if vm . bindDocs (src ) then
8079 local skey = guide .getKeyName (src )
8180 if skey then
8281 hasMarkDoc [skey ] = true
@@ -956,7 +955,7 @@ local function compileLocal(source)
956955
957956 local hasMarkDoc
958957 if source .bindDocs then
959- hasMarkDoc = bindDocs (source )
958+ hasMarkDoc = vm . bindDocs (source )
960959 end
961960 local hasMarkParam
962961 if not hasMarkDoc then
@@ -1021,7 +1020,7 @@ local function compileLocal(source)
10211020 -- for x = ... do
10221021 if source .parent .type == ' loop' then
10231022 if source .parent .loc == source then
1024- if bindDocs (source ) then
1023+ if vm . bindDocs (source ) then
10251024 return
10261025 end
10271026 vm .setNode (source , vm .declareGlobal (' type' , ' integer' ))
@@ -1185,7 +1184,7 @@ local compilerSwitch = util.switch()
11851184 end )
11861185 : case ' setlocal'
11871186 : call (function (source )
1188- if bindDocs (source ) then
1187+ if vm . bindDocs (source ) then
11891188 return
11901189 end
11911190 local locNode = vm .compileNode (source .node )
@@ -1285,7 +1284,7 @@ local compilerSwitch = util.switch()
12851284 --- @cast key string
12861285 vm .compileByParentNode (source .node , key , function (src )
12871286 if src .value then
1288- if bindDocs (src ) then
1287+ if vm . bindDocs (src ) then
12891288 variableNode :merge (vm .compileNode (src ))
12901289 elseif src .value .type ~= ' nil' then
12911290 variableNode :merge (vm .compileNode (src .value ))
@@ -1333,7 +1332,7 @@ local compilerSwitch = util.switch()
13331332 : call (function (source )
13341333 local hasMarkDoc
13351334 if source .bindDocs then
1336- hasMarkDoc = bindDocs (source )
1335+ hasMarkDoc = vm . bindDocs (source )
13371336 end
13381337
13391338 if not hasMarkDoc then
@@ -1760,95 +1759,6 @@ local function compileByNode(source)
17601759 compilerSwitch (source .type , source )
17611760end
17621761
1763- --- @param source parser.object
1764- local function compileByGlobal (source )
1765- local global = vm .getGlobalNode (source )
1766- if not global then
1767- return
1768- end
1769- --- @cast source parser.object
1770- local root = guide .getRoot (source )
1771- local uri = guide .getUri (source )
1772- if not root ._globalBase then
1773- root ._globalBase = {}
1774- end
1775- local name = global :asKeyName ()
1776- if not root ._globalBase [name ] then
1777- root ._globalBase [name ] = {
1778- type = ' globalbase' ,
1779- parent = root ,
1780- }
1781- end
1782- local globalNode = vm .getNode (root ._globalBase [name ])
1783- if globalNode then
1784- vm .setNode (source , globalNode , true )
1785- return
1786- end
1787- --- @type vm.node
1788- globalNode = vm .createNode (global )
1789- vm .setNode (root ._globalBase [name ], globalNode , true )
1790- vm .setNode (source , globalNode , true )
1791-
1792- -- TODO:don't mix
1793- -- local sets = global.links[uri].sets or {}
1794- -- local gets = global.links[uri].gets or {}
1795- -- for _, set in ipairs(sets) do
1796- -- vm.setNode(set, globalNode, true)
1797- -- end
1798- -- for _, get in ipairs(gets) do
1799- -- vm.setNode(get, globalNode, true)
1800- -- end
1801-
1802- if global .cate == ' variable' then
1803- local hasMarkDoc
1804- for _ , set in ipairs (global :getSets (uri )) do
1805- if set .bindDocs and set .parent .type == ' main' then
1806- if bindDocs (set ) then
1807- globalNode :merge (vm .compileNode (set ))
1808- hasMarkDoc = true
1809- end
1810- if vm .getNode (set ) then
1811- globalNode :merge (vm .compileNode (set ))
1812- end
1813- end
1814- end
1815- -- Set all globals node first to avoid recursive
1816- for _ , set in ipairs (global :getSets (uri )) do
1817- vm .setNode (set , globalNode , true )
1818- end
1819- for _ , set in ipairs (global :getSets (uri )) do
1820- if set .value and set .value .type ~= ' nil' and set .parent .type == ' main' then
1821- if not hasMarkDoc or guide .isLiteral (set .value ) then
1822- globalNode :merge (vm .compileNode (set .value ))
1823- end
1824- end
1825- end
1826- for _ , set in ipairs (global :getSets (uri )) do
1827- vm .setNode (set , globalNode , true )
1828- end
1829- end
1830- if global .cate == ' type' then
1831- for _ , set in ipairs (global :getSets (uri )) do
1832- if set .type == ' doc.class' then
1833- if set .extends then
1834- for _ , ext in ipairs (set .extends ) do
1835- if ext .type == ' doc.type.table' then
1836- if not vm .getGeneric (ext ) then
1837- globalNode :merge (vm .compileNode (ext ))
1838- end
1839- end
1840- end
1841- end
1842- end
1843- if set .type == ' doc.alias' then
1844- if not vm .getGeneric (set .extends ) then
1845- globalNode :merge (vm .compileNode (set .extends ))
1846- end
1847- end
1848- end
1849- end
1850- end
1851-
18521762local nodeSwitch ;nodeSwitch = util .switch ()
18531763 : case ' field'
18541764 : case ' method'
@@ -1941,7 +1851,7 @@ function vm.compileNode(source)
19411851
19421852 --- @cast source parser.object
19431853 vm .setNode (source , vm .createNode (), true )
1944- compileByGlobal (source )
1854+ vm . compileByGlobal (source )
19451855 compileByNode (source )
19461856 compileByParentNode (source )
19471857 matchCall (source )
0 commit comments