summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/core/completion.lua28
-rw-r--r--server/src/core/vm.lua35
2 files changed, 29 insertions, 34 deletions
diff --git a/server/src/core/completion.lua b/server/src/core/completion.lua
index fad75bbe..bff1bd33 100644
--- a/server/src/core/completion.lua
+++ b/server/src/core/completion.lua
@@ -472,6 +472,9 @@ end
local function searchInResult(result, word, source, vm, pos, callback)
if result.type == 'local' then
+ if result.link then
+ result = result.link
+ end
if source.isArg then
searchAsArg(vm, word, pos, result, callback)
elseif source.isLocal then
@@ -509,30 +512,13 @@ end
local function searchSpecial(vm, pos, callback)
-- 尝试 #
local result, source = findResult(vm, pos, 2)
- if source and source.type == 'index'
- and result.source and result.source.op == '#'
+ if source and source.indexSource and result.source.op == '#'
then
- local name = {}
- local var = result
- while true do
- var = var.parent
- if not var then
- break
- end
- if var.value and var.value.GLOBAL then
- break
- end
- local key = var.key
- if type(key) ~= 'string' or key == '' then
- return
- end
- table.insert(name, 1, key)
- end
- local label = table.concat(name, '.') .. '+1'
+ local label = source.indexSource.indexName .. '+1'
callback(label, CompletionItemKind.Snippet, {
textEdit = {
- start = result.source.start + 1,
- finish = source.finish,
+ start = source.start + 1,
+ finish = source.indexSource.finish,
newText = ('%s] = '):format(label),
}
})
diff --git a/server/src/core/vm.lua b/server/src/core/vm.lua
index 24d75363..42893dd2 100644
--- a/server/src/core/vm.lua
+++ b/server/src/core/vm.lua
@@ -81,11 +81,21 @@ local mt = {}
mt.__index = mt
function mt:createDummyVar(source, value)
+ if source and source.bind then
+ return source.bind
+ end
local loc = {
type = 'local',
key = '',
source = source or DefaultSource,
}
+
+ if source then
+ source.bind = loc
+ self.results.sources[#self.results.sources+1] = source
+ source.isLocal = true
+ end
+
self:setValue(loc, value, source)
return loc
end
@@ -338,7 +348,7 @@ function mt:runFunction(func)
local index = 0
if func.object then
- local var = self:createArg('self', func.object.colon, self:getValue(func.object))
+ local var = self:createArg('self', func.colon, self:getValue(func.object))
var.hide = true
var.link = func.object
self:setValue(var, func.argValues[1] or self:createValue('nil'))
@@ -354,7 +364,6 @@ function mt:runFunction(func)
index = index + 1
if arg.type == 'name' then
local var = self:createArg(arg[1], arg)
- arg.isArg = true
self:setValue(var, func.argValues[index] or self:createValue('nil'))
func.args[index] = var
elseif arg.type == '...' then
@@ -373,7 +382,7 @@ function mt:runFunction(func)
self:scopePop()
end
-function mt:buildFunction(exp, object)
+function mt:buildFunction(exp, object, colon)
if exp and exp.func then
return exp.func
end
@@ -389,6 +398,7 @@ function mt:buildFunction(exp, object)
func.built = exp
func.upvalues = {}
func.object = object
+ func.colon = colon
exp.func = func
for name, loc in pairs(self.scope.locals) do
func.upvalues[name] = loc
@@ -484,7 +494,7 @@ function mt:tryRequireOne(strValue, mode)
if type(str) == 'string' then
-- 支持 require 'xxx' 的转到定义
local strSource = strValue.source
- strSource.object = strValue
+ strSource.bind = strValue
self.results.sources[#self.results.sources+1] = strSource
strValue.isRequire = true
@@ -902,6 +912,7 @@ function mt:getSimple(simple, mode)
parentName = '?'
end
local object
+ local colon
local lastField = field
for i = 2, #simple do
local obj = simple[i]
@@ -928,6 +939,8 @@ function mt:getSimple(simple, mode)
parentName = parentName .. '(...)'
elseif tp == 'index' then
local child = obj[1]
+ child.indexSource = obj
+ obj.indexName = parentName
local index = self:getIndex(child)
if mode == 'value' or i < #simple then
field = self:getField(value, index, child) or self:createField(value, index, child)
@@ -939,10 +952,6 @@ function mt:getSimple(simple, mode)
field.parentValue = value
value = self:getValue(field)
end
- field.parent = lastField
- lastField = field
- obj.object = object
- obj.parentName = parentName
if obj[1].type == 'string' then
parentName = ('%s[%q]'):format(parentName, index)
elseif obj[1].type == 'number' or obj[1].type == 'boolean' then
@@ -968,8 +977,8 @@ function mt:getSimple(simple, mode)
parentName = parentName .. '.' .. field.key
elseif tp == ':' then
object = field
- object.colon = obj
simple[i-1].colon = obj
+ colon = colon
elseif tp == '.' then
simple[i-1].dot = obj
end
@@ -977,7 +986,7 @@ function mt:getSimple(simple, mode)
if mode == 'value' then
return value, object
elseif mode == 'field' then
- return field, object
+ return field, object, colon
end
error('Unknow simple mode: ' .. mode)
end
@@ -1332,18 +1341,18 @@ end
function mt:doFunction(action)
local name = action.name
- local var, object
+ local var, object, colon
local source
if name then
if name.type == 'simple' then
- var, object = self:getSimple(name, 'field')
+ var, object, colon = self:getSimple(name, 'field')
source = name[#name]
else
var = self:getName(name[1], name)
source = name
end
end
- local func = self:buildFunction(action, object)
+ local func = self:buildFunction(action, object, colon)
if var then
self:setValue(var, func, source)
end