summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/core/global.lua6
-rw-r--r--server/src/method/textDocument/documentSymbol.lua1
-rw-r--r--server/src/method/textDocument/references.lua1
-rw-r--r--server/src/service.lua2
-rw-r--r--server/src/vm/chain.lua49
-rw-r--r--server/src/vm/function.lua14
-rw-r--r--server/src/vm/vm.lua46
7 files changed, 74 insertions, 45 deletions
diff --git a/server/src/core/global.lua b/server/src/core/global.lua
index 007f0fd9..5e466fc8 100644
--- a/server/src/core/global.lua
+++ b/server/src/core/global.lua
@@ -1,12 +1,6 @@
local mt = {}
mt.__index = mt
-function mt:compileVM(uri)
- if not self.set[uri] and not self.get[uri] then
- return
- end
-end
-
function mt:markSet(uri)
if not uri then
return
diff --git a/server/src/method/textDocument/documentSymbol.lua b/server/src/method/textDocument/documentSymbol.lua
index f9823385..201137c8 100644
--- a/server/src/method/textDocument/documentSymbol.lua
+++ b/server/src/method/textDocument/documentSymbol.lua
@@ -48,6 +48,7 @@ return function (lsp, params)
end
t:remove()
+ timerCache[uri] = nil
local symbols = core.documentSymbol(vm)
if not symbols then
diff --git a/server/src/method/textDocument/references.lua b/server/src/method/textDocument/references.lua
index c5a3ebf3..f21625c8 100644
--- a/server/src/method/textDocument/references.lua
+++ b/server/src/method/textDocument/references.lua
@@ -23,6 +23,7 @@ return function (lsp, params)
return
end
t:remove()
+ LastTask = nil
vm, lines = lsp:getVM(uri)
local positions = core.references(vm, position, declarat)
diff --git a/server/src/service.lua b/server/src/service.lua
index abac804c..dcf8b2e2 100644
--- a/server/src/service.lua
+++ b/server/src/service.lua
@@ -11,6 +11,7 @@ local buildVM = require 'vm'
local sourceMgr = require 'vm.source'
local localMgr = require 'vm.local'
local valueMgr = require 'vm.value'
+local chainMgr = require 'vm.chain'
local ErrorCodes = {
-- Defined by JSON RPC
@@ -708,5 +709,6 @@ return function ()
_version = 0,
}, mt)
session.global = core.global(session)
+ session.chain = chainMgr()
return session
end
diff --git a/server/src/vm/chain.lua b/server/src/vm/chain.lua
new file mode 100644
index 00000000..23b38a75
--- /dev/null
+++ b/server/src/vm/chain.lua
@@ -0,0 +1,49 @@
+local valueMgr = require 'vm.value'
+local sourceMgr = require 'vm.source'
+
+local mt = {}
+mt.__index = mt
+mt.type = 'chain'
+
+mt.min = 100
+mt.max = 100
+mt.count = 0
+
+function mt:clearCache()
+ if self.count <= self.max then
+ return
+ end
+ local n = 0
+ for uri, value in pairs(self.cache) do
+ local ok = value:eachInfo(function ()
+ return true
+ end)
+ if ok then
+ n = n + 1
+ else
+ self.cache[uri] = nil
+ end
+ end
+ self.count = n
+ self.max = self.count * 2
+ if self.max < self.min then
+ self.max = self.min
+ end
+end
+
+function mt:get(uri)
+ if not self.cache[uri] then
+ self.count = self.count + 1
+ self:clearCache()
+ self.cache[uri] = valueMgr.create('any', sourceMgr.dummy())
+ self.cache[uri]:markGlobal()
+ self.cache[uri].uri = uri
+ end
+ return self.cache[uri]
+end
+
+return function ()
+ return setmetatable({
+ cache = {},
+ }, mt)
+end
diff --git a/server/src/vm/function.lua b/server/src/vm/function.lua
index 2ca12e2b..5b7d8682 100644
--- a/server/src/vm/function.lua
+++ b/server/src/vm/function.lua
@@ -101,6 +101,20 @@ function mt:setReturn(index, value)
end
end
+function mt:mergeReturn(index, value)
+ self:set('hasReturn', true)
+ if not self.returns then
+ self.returns = createMulti()
+ end
+ if value then
+ if self.returns[index] then
+ self.returns[index]:mergeValue(value)
+ else
+ self.returns[index] = value
+ end
+ end
+end
+
function mt:getReturn(index)
if self.maxReturns and index and self.maxReturns < index then
return nil
diff --git a/server/src/vm/vm.lua b/server/src/vm/vm.lua
index c519ad72..940e822f 100644
--- a/server/src/vm/vm.lua
+++ b/server/src/vm/vm.lua
@@ -153,31 +153,6 @@ function mt:callSetMetaTable(func, values, source)
values[1]:setMetaTable(values[2])
end
-function mt:getRequire(strValue, destVM)
- -- 取出对方的主函数
- local main = destVM.main
- -- 获取主函数返回值
- local mainValue = main:getFunction():getReturn(1)
- if mainValue then
- mainValue:markGlobal()
- else
- mainValue = self:createValue('any', self:getDefaultSource())
- mainValue.uri = destVM.uri
- end
-
- return mainValue
-end
-
-function mt:getLoadFile(strValue, destVM)
- -- 取出对方的主函数
- local main = destVM.main
- -- loadfile 的返回值就是对方的主函数
- local mainValue = main
- mainValue:markGlobal()
-
- return mainValue
-end
-
function mt:tryRequireOne(strValue, mode)
if not self.lsp or not self.lsp.workspace then
return nil
@@ -203,18 +178,8 @@ function mt:tryRequireOne(strValue, mode)
end
strSource:set('target uri', uri)
- -- 如果取不到VM(不编译),则做个标记,之后再取一次
- local destVM = self.lsp:getVM(uri)
self.lsp:compileChain(self:getUri(), uri)
- if destVM then
- if mode == 'require' then
- return self:getRequire(strValue, destVM)
- elseif mode == 'loadfile' then
- return self:getLoadFile(strValue, destVM)
- elseif mode == 'dofile' then
- return self:getRequire(strValue, destVM)
- end
- end
+ return self.lsp.chain:get(uri)
end
return nil
end
@@ -236,7 +201,7 @@ function mt:callRequire(func, values)
else
local requireValue = self:tryRequireOne(values[1], 'require')
if not requireValue then
- requireValue = self:createValue('boolean', self:getDefaultSource())
+ requireValue = self:createValue('any', self:getDefaultSource())
requireValue:set('cross file', true)
end
func:setReturn(1, requireValue)
@@ -330,7 +295,7 @@ function mt:call(value, values, source)
self:runFunction(func)
end
else
- func:setReturn(1, self:createValue('any', source))
+ func:mergeReturn(1, self:createValue('any', source))
end
end
@@ -734,7 +699,7 @@ function mt:doReturn(action)
local func = self:getCurrentFunction()
values:eachValue(function (n, value)
value.uri = self:getUri()
- func:setReturn(n, value)
+ func:mergeReturn(n, value)
local source = action[n] or value:getSource()
if not source or source.start == 0 then
source = self:getDefaultSource()
@@ -1147,6 +1112,9 @@ function mt:createEnvironment(ast)
-- 整个文件是一个函数
self.main = self:createFunction(ast)
self:setCurrentFunction(self.main:getFunction())
+ if self.lsp then
+ self.main:getFunction():mergeReturn(1, self.lsp.chain:get(self.uri))
+ end
-- 全局变量`_G`
local global = buildGlobal(self.lsp)
-- 隐藏的上值`_ENV`