summaryrefslogtreecommitdiff
path: root/server-beta
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-10-10 16:03:28 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-10-10 16:03:28 +0800
commitc80ebc80ec68909cb890cccba05ba5fded59b645 (patch)
tree3687a0438d81b2aebb013557798b773076e922fa /server-beta
parent63f8fe059b3b429baf0e10969a259beecaddbaad (diff)
downloadlua-language-server-c80ebc80ec68909cb890cccba05ba5fded59b645.zip
支持_G
Diffstat (limited to 'server-beta')
-rw-r--r--server-beta/src/core/_G.lua34
-rw-r--r--server-beta/src/core/engineer.lua92
-rw-r--r--server-beta/src/core/getglobal.lua31
-rw-r--r--server-beta/src/core/local.lua15
-rw-r--r--server-beta/src/parser/guide.lua7
-rw-r--r--server-beta/test/definition/set.lua18
6 files changed, 87 insertions, 110 deletions
diff --git a/server-beta/src/core/_G.lua b/server-beta/src/core/_G.lua
deleted file mode 100644
index 3a28c7ac..00000000
--- a/server-beta/src/core/_G.lua
+++ /dev/null
@@ -1,34 +0,0 @@
-local m = {}
-
-function m:def(source, callback)
- local parent = source.parent
- if parent.type == 'setfield'
- or parent.type == 'setindex'
- or parent.type == 'setmethod' then
- callback(parent, 'set')
- elseif parent.type == 'getfield'
- or parent.type == 'getindex' then
- self:search(parent, 'special', 'def', callback)
- elseif parent.type == 'callargs' then
- self:search(parent.parent, 'special', 'def', callback)
- end
-end
-
-function m:ref(source, callback)
- local parent = source.parent
- if parent.type == 'setfield'
- or parent.type == 'setindex'
- or parent.type == 'setmethod' then
- callback(parent, 'set')
- elseif parent.type == 'getfield'
- or parent.type == 'getindex'
- or parent.type == 'getmethod' then
- callback(parent, 'get')
- elseif parent.type == 'getfield' then
- self:search(parent, 'special', 'ref', callback)
- elseif parent.type == 'callargs' then
- self:search(parent.parent, 'special', 'ref', callback)
- end
-end
-
-return m
diff --git a/server-beta/src/core/engineer.lua b/server-beta/src/core/engineer.lua
index 05976c76..24a83151 100644
--- a/server-beta/src/core/engineer.lua
+++ b/server-beta/src/core/engineer.lua
@@ -2,7 +2,6 @@ local guide = require 'parser.guide'
local require = require
local setmetatable = setmetatable
-local ipairs = ipairs
_ENV = nil
---@class engineer
@@ -13,7 +12,6 @@ mt.type = 'engineer'
mt['local'] = require 'core.local'
mt['getlocal'] = require 'core.getlocal'
mt['setlocal'] = mt['getlocal']
-mt['_G'] = require 'core._G'
mt['getglobal'] = require 'core.getglobal'
mt['setglobal'] = mt['getglobal']
mt['field'] = require 'core.field'
@@ -23,43 +21,33 @@ mt['boolean'] = require 'core.boolean'
mt['string'] = require 'core.string'
mt['table'] = require 'core.table'
---mt['special'] = function (self, source, mode, callback)
--- local name = self:getSpecial(source)
--- if not name then
--- return
--- end
--- if mode == 'def' then
--- if name == 's|_G' then
--- self:search(source, '_G', mode, callback)
--- elseif name == 's|rawset' then
--- callback(source.parent, 'set')
--- end
--- end
---end
---mt['call'] = function (self, source, mode, callback)
--- local name = self:getSpecial(source)
--- if not name then
--- return
--- end
--- local parent = source.parent
--- if name == 's|setmetatable' then
--- if parent.index ~= 1 then
--- return
--- end
--- self:eachField(source.args[2], 's|__index', 'def', function (src)
--- self:eachField(src, nil, 'ref', callback)
--- end)
--- return
--- end
---end
-
-function mt:getSpecial(source)
+function mt:getSpecialName(source)
local node = source.node
if node.tag ~= '_ENV' then
return nil
end
local name = guide.getKeyName(source)
- return name
+ if name:sub(1, 2) ~= 's|' then
+ return nil
+ end
+ return name:sub(3)
+end
+
+function mt:eachSpecial(callback)
+ local env = guide.getENV(self.ast)
+ if not env then
+ return
+ end
+ local refs = env.ref
+ if not refs then
+ return
+ end
+ for i = 1, #refs do
+ local ref = refs[i]
+ if ref.type == 'getglobal' then
+ callback(ref[1], ref)
+ end
+ end
end
function mt:eachField(source, key, callback)
@@ -101,13 +89,39 @@ function mt:eachDef(source, callback)
f(self, source, callback)
end
+function mt:childDef(source, callback)
+ local tp = source.type
+ if tp == 'setfield' then
+ callback(source.field, 'set')
+ elseif tp == 'setmethod' then
+ callback(source.field, 'set')
+ elseif tp == 'setindex' then
+ callback(source.index, 'set')
+ end
+end
+
+function mt:childRef(source, callback)
+ local tp = source.type
+ if tp == 'setfield' then
+ callback(source.field, 'set')
+ elseif tp == 'setmethod' then
+ callback(source.field, 'set')
+ elseif tp == 'setindex' then
+ callback(source.index, 'set')
+ elseif tp == 'getfield' then
+ callback(source.field, 'get')
+ elseif tp == 'getmethod' then
+ callback(source.method, 'get')
+ elseif tp == 'getindex' then
+ callback(source.index, 'get')
+ end
+end
+
return function (ast)
local self = setmetatable({
- step = 0,
- ast = ast.ast,
+ step = 0,
+ ast = ast.ast,
+ cache = {},
}, mt)
- if not ast.vm then
- ast.vm = {}
- end
return self
end
diff --git a/server-beta/src/core/getglobal.lua b/server-beta/src/core/getglobal.lua
index 74c05e29..5cac5bdd 100644
--- a/server-beta/src/core/getglobal.lua
+++ b/server-beta/src/core/getglobal.lua
@@ -10,6 +10,14 @@ function m:def(source, callback)
callback(src, mode)
end
end)
+ self:eachSpecial(function (name, src)
+ if name == '_G' then
+ local parent = src.parent
+ if guide.getKeyName(parent) == key then
+ self:childDef(parent, callback)
+ end
+ end
+ end)
end
function m:ref(source, callback)
@@ -20,6 +28,14 @@ function m:ref(source, callback)
callback(src, mode)
end
end)
+ self:eachSpecial(function (name, src)
+ if name == '_G' then
+ local parent = src.parent
+ if guide.getKeyName(parent) == key then
+ self:childRef(parent, callback)
+ end
+ end
+ end)
end
function m:field(source, key, callback)
@@ -28,20 +44,7 @@ function m:field(source, key, callback)
if mode == 'get' then
local parent = src.parent
if key == guide.getKeyName(parent) then
- local tp = parent.type
- if tp == 'getfield' then
- callback(parent.field, 'get')
- elseif tp == 'getmethod' then
- callback(parent.method, 'get')
- elseif tp == 'getindex' then
- callback(parent.index, 'get')
- elseif tp == 'setfield' then
- callback(parent.field, 'set')
- elseif tp == 'setmethod' then
- callback(parent.method, 'set')
- elseif tp == 'setindex' then
- callback(parent.index, 'set')
- end
+ self:childRef(parent)
end
end
end)
diff --git a/server-beta/src/core/local.lua b/server-beta/src/core/local.lua
index 040da822..b9f12259 100644
--- a/server-beta/src/core/local.lua
+++ b/server-beta/src/core/local.lua
@@ -46,20 +46,7 @@ function m:field(source, key, callback)
if ref.type == 'getlocal' then
local parent = ref.parent
if key == guide.getKeyName(parent) then
- local tp = parent.type
- if tp == 'setfield' then
- callback(parent.field, 'set')
- elseif tp == 'setmethod' then
- callback(parent.method, 'set')
- elseif tp == 'setindex' then
- callback(parent.index, 'set')
- elseif tp == 'getfield' then
- callback(parent.field, 'get')
- elseif tp == 'getmethod' then
- callback(parent.method, 'get')
- elseif tp == 'getindex' then
- callback(parent.index, 'get')
- end
+ self:childRef(parent, callback)
end
elseif ref.type == 'setlocal' then
self:eachField(ref.value, key, callback)
diff --git a/server-beta/src/parser/guide.lua b/server-beta/src/parser/guide.lua
index 2120fe48..9530f9ce 100644
--- a/server-beta/src/parser/guide.lua
+++ b/server-beta/src/parser/guide.lua
@@ -405,4 +405,11 @@ function m.getKeyName(obj)
return nil
end
+function m.getENV(ast)
+ if ast.type ~= 'main' then
+ return nil
+ end
+ return ast.locals[1]
+end
+
return m
diff --git a/server-beta/test/definition/set.lua b/server-beta/test/definition/set.lua
index ccb44438..b1d9dc70 100644
--- a/server-beta/test/definition/set.lua
+++ b/server-beta/test/definition/set.lua
@@ -44,12 +44,12 @@ _ENV.<!x!> = 1
print(<?x?>)
]]
---TEST [[
---<!_G.x!> = 1
---print(<?x?>)
---]]
---
---TEST [[
---<!rawset(_G, 'x', 1)!>
---print(<?x?>)
---]]
+TEST [[
+_G.<!x!> = 1
+print(<?x?>)
+]]
+
+TEST [[
+<!rawset(_G, 'x', 1)!>
+print(<?x?>)
+]]