summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-01-25 10:46:13 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-01-25 10:46:13 +0800
commit8860d44ef8b00355f87ccdeb82b143e999ee912e (patch)
tree1ca0508ebf36121af88e401344aca96f991924cd
parent3aaa5b8e0f0d94247f8155c3802515bcc3292619 (diff)
downloadlua-language-server-8860d44ef8b00355f87ccdeb82b143e999ee912e.zip
全局环境的实现
-rw-r--r--server/src/core/vm.lua45
1 files changed, 22 insertions, 23 deletions
diff --git a/server/src/core/vm.lua b/server/src/core/vm.lua
index a0f82458..054e111f 100644
--- a/server/src/core/vm.lua
+++ b/server/src/core/vm.lua
@@ -3,7 +3,7 @@ local library = require 'core.library'
local createValue = require 'core.value'
local DefaultSource = { start = 0, finish = 0 }
-local GlobalChild
+local GlobalValue
-- 根据赋值顺序决定遍历顺序的表
local function orderTable()
@@ -1435,36 +1435,35 @@ function mt:doActions(actions)
end
end
+function mt:getGlobalValue()
+ if GlobalValue then
+ return GlobalValue
+ end
+ GlobalValue = self:createValue('table')
+ GlobalValue.GLOBAL = true
+ for name, lib in pairs(library.global) do
+ local field = GlobalValue:createField(name)
+ local value = self:getLibValue(lib, 'global')
+ self:setValue(field, value)
+ end
+ return GlobalValue
+end
+
function mt:createEnvironment()
self.scope.block = { start = 0, finish = math.maxinteger }
-- 整个文件是一个函数
self.chunk.func = self:buildFunction()
self.results.main = self.chunk.func
-- 隐藏的上值`_ENV`
- local parent = self:createLocal('_ENV')
- parent.hide = true
- local envValue = self:setValue(parent, self:buildTable())
- -- _ENV 有个特殊标记
- envValue.ENV = true
+ local evnField = self:createLocal('_ENV')
+ evnField.hide = true
-- 隐藏的参数`...`
self:createDots(1)
-
- -- 设置全局变量
- if not GlobalChild then
- for name, lib in pairs(library.global) do
- local field = envValue:createField(name)
- local value = self:getLibValue(lib, 'global')
- value = self:setValue(field, value)
- end
- GlobalChild = envValue.child
- end
- envValue.child = readOnly(GlobalChild)
-
- -- 设置 _G 使用 _ENV 的child
- local g = envValue:getField('_G')
- local gValue = self:getValue(g)
- gValue.child = envValue.child
- self.env = envValue
+ -- 全局变量`_G`
+ local globalValue = self:getGlobalValue()
+ -- 使用_G初始化_ENV
+ self:setValue(evnField, globalValue)
+ self.env = globalValue
end
local function compile(ast, lsp, uri)