summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/core/completion.lua8
-rw-r--r--server/src/core/hover/hover.lua2
-rw-r--r--server/src/core/signature.lua8
-rw-r--r--server/src/emmy/funcType.lua8
-rw-r--r--server/src/vm/emmy.lua27
-rw-r--r--server/src/vm/function.lua12
-rw-r--r--server/src/vm/value.lua1
-rw-r--r--server/test/hover/init.lua18
-rw-r--r--server/test/signature/init.lua37
9 files changed, 96 insertions, 25 deletions
diff --git a/server/src/core/completion.lua b/server/src/core/completion.lua
index 0c3a0c71..59a3cb3f 100644
--- a/server/src/core/completion.lua
+++ b/server/src/core/completion.lua
@@ -1,6 +1,7 @@
local findSource = require 'core.find_source'
local getFunctionHover = require 'core.hover.function'
local getFunctionHoverAsLib = require 'core.hover.lib_function'
+local getFunctionHoverAsEmmy = require 'core.hover.emmy_function'
local sourceMgr = require 'vm.source'
local config = require 'config'
local matchKey = require 'core.matchKey'
@@ -49,7 +50,12 @@ local function getDucumentation(name, value)
if lib then
hover = getFunctionHoverAsLib(name, lib)
else
- hover = getFunctionHover(name, value:getFunction())
+ local emmy = value:getEmmy()
+ if emmy and emmy.type == 'emmy.functionType' then
+ hover = getFunctionHoverAsEmmy(name, emmy)
+ else
+ hover = getFunctionHover(name, value:getFunction())
+ end
end
if not hover then
return nil
diff --git a/server/src/core/hover/hover.lua b/server/src/core/hover/hover.lua
index 31699d07..c067899e 100644
--- a/server/src/core/hover/hover.lua
+++ b/server/src/core/hover/hover.lua
@@ -182,7 +182,7 @@ local function getValueHover(source, name, value, lib)
text = ('%s %s: %s'):format(tp, name, unpackTable(value))
else
if literal == nil then
- if class then
+ if class and not OriginTypes[class] then
text = ('%s %s: %s %s'):format(tp, name, valueType, unpackTable(value))
else
text = ('%s %s: %s'):format(tp, name, valueType)
diff --git a/server/src/core/signature.lua b/server/src/core/signature.lua
index 5dcce85f..6c05be5c 100644
--- a/server/src/core/signature.lua
+++ b/server/src/core/signature.lua
@@ -1,5 +1,6 @@
local getFunctionHover = require 'core.hover.function'
local getFunctionHoverAsLib = require 'core.hover.lib_function'
+local getFunctionHoverAsEmmy = require 'core.hover.emmy_function'
local findLib = require 'core.find_lib'
local buildValueName = require 'core.hover.name'
local findSource = require 'core.find_source'
@@ -66,7 +67,12 @@ local function getHover(call, pos)
if lib then
hover = getFunctionHoverAsLib(name, lib, object, select)
else
- hover = getFunctionHover(name, value:getFunction(), object, select)
+ local emmy = value:getEmmy()
+ if emmy and emmy.type == 'emmy.functionType' then
+ hover = getFunctionHoverAsEmmy(name, emmy, object, select)
+ else
+ hover = getFunctionHover(name, value:getFunction(), object, select)
+ end
end
if hover and hover.argLabel then
return hover
diff --git a/server/src/emmy/funcType.lua b/server/src/emmy/funcType.lua
index 405de594..2acf8d28 100644
--- a/server/src/emmy/funcType.lua
+++ b/server/src/emmy/funcType.lua
@@ -39,6 +39,14 @@ function mt:getReturn()
return self._return
end
+function mt:bindFunction(func)
+ if func then
+ self._bindFunction = func
+ else
+ return self._bindFunction
+ end
+end
+
return function (manager, source)
local self = setmetatable({
source = source.id,
diff --git a/server/src/vm/emmy.lua b/server/src/vm/emmy.lua
index cdbbd3b7..7a82cfcd 100644
--- a/server/src/vm/emmy.lua
+++ b/server/src/vm/emmy.lua
@@ -1,3 +1,5 @@
+local functionMgr = require 'vm.function'
+local library = require 'vm.library'
local mt = require 'vm.manager'
function mt:clearEmmy()
@@ -267,17 +269,30 @@ function mt:doEmmyFunctionType(action)
---@type emmyMgr
local emmyMgr = self.emmyMgr
self:instantSource(action)
- local func = emmyMgr:addFunctionType(action)
+ local funcObj = emmyMgr:addFunctionType(action)
+ ---@type function
+ local func = functionMgr.create(action)
for i = 1, #action // 2 do
local nameSource = action[i*2-1]
local typeSource = action[i*2]
local paramType = self:buildEmmyAnyType(typeSource)
- func:addParam(nameSource[1], paramType)
+ funcObj:addParam(nameSource[1], paramType)
+ local value = self:createValue(paramType:getType(), typeSource)
+ value:setEmmy(paramType)
+ self:instantSource(nameSource)
+ func:addArg(nameSource[1], nameSource, value)
end
- local returnType = self:buildEmmyAnyType(action[#action])
- func:addReturn(returnType)
- self._emmy = func
- return func
+ local returnSource = action[#action]
+ if returnSource then
+ local returnType = self:buildEmmyAnyType(returnSource)
+ funcObj:addReturn(returnType)
+ local value = self:createValue(returnType:getType(), returnSource)
+ value:setEmmy(returnType)
+ func:setReturn(1, value)
+ end
+ funcObj:bindFunction(func)
+ self._emmy = funcObj
+ return funcObj
end
function mt:buildEmmyAnyType(source)
diff --git a/server/src/vm/function.lua b/server/src/vm/function.lua
index 2322fa70..e605e1c9 100644
--- a/server/src/vm/function.lua
+++ b/server/src/vm/function.lua
@@ -349,15 +349,19 @@ function mt:findEmmyParamByName(name)
return nil
end
+function mt:addArg(name, source, value)
+ local loc = localMgr.create(name, source, value)
+ self:saveUpvalue(name, loc)
+ self.args[#self.args+1] = loc
+end
+
function mt:createArg(vm, arg)
vm:instantSource(arg)
arg:set('arg', self)
if arg.type == 'name' then
+ vm:instantSource(arg)
local value = valueMgr.create('nil', arg)
- local loc = localMgr.create(arg[1], arg, value)
- self:saveUpvalue(arg[1], loc)
- self.args[#self.args+1] = loc
-
+ self:addArg(arg[1], arg, value)
elseif arg.type == '...' then
self._dots = createMulti()
end
diff --git a/server/src/vm/value.lua b/server/src/vm/value.lua
index b43530d0..bf20468d 100644
--- a/server/src/vm/value.lua
+++ b/server/src/vm/value.lua
@@ -600,6 +600,7 @@ function mt:setEmmy(emmy)
---@type EmmyFunctionType
local emmyFuncType = emmy
emmyFuncType:setValue(self)
+ self:setFunction(emmyFuncType:bindFunction())
else
return
end
diff --git a/server/test/hover/init.lua b/server/test/hover/init.lua
index baed3912..f31dfa03 100644
--- a/server/test/hover/init.lua
+++ b/server/test/hover/init.lua
@@ -730,3 +730,21 @@ local <?f?>
function f(x: number, y: number)
-> boolean
]]
+
+TEST [[
+---@type fun(x: number, y: number):boolean
+local f
+f(<?a?>)
+]]
+[[
+global a: number
+]]
+
+TEST [[
+---@type fun(x: number, y: number):boolean
+local f
+local <?r?> = f()
+]]
+[[
+local r: boolean
+]]
diff --git a/server/test/signature/init.lua b/server/test/signature/init.lua
index 91ef75c8..eb6e609a 100644
--- a/server/test/signature/init.lua
+++ b/server/test/signature/init.lua
@@ -6,8 +6,8 @@ rawset(_G, 'TEST', true)
function TEST(script)
return function (expect)
- local pos = script:find('@', 1, true)
- local new_script = script:gsub('@', '')
+ local pos = script:find('$', 1, true)
+ local new_script = script:gsub('%$', '')
local ast = parser:ast(new_script, 'lua', 'Lua 5.3')
local vm = buildVM(ast)
assert(vm)
@@ -33,7 +33,7 @@ TEST [[
local function x(a, b)
end
-x(@
+x($
]]
{
label = "function x(a: any, b: any)",
@@ -44,7 +44,7 @@ TEST [[
local function x(a, b)
end
-x(@)
+x($)
]]
{
label = "function x(a: any, b: any)",
@@ -55,7 +55,7 @@ TEST [[
local function x(a, b)
end
-x(xxx@)
+x(xxx$)
]]
{
label = "function x(a: any, b: any)",
@@ -66,7 +66,7 @@ TEST [[
local function x(a, b)
end
-x(xxx, @)
+x(xxx, $)
]]
{
label = "function x(a: any, b: any)",
@@ -77,7 +77,7 @@ TEST [[
function mt:f(a)
end
-mt:f(@
+mt:f($
]]
{
label = 'function mt:f(a: any)',
@@ -85,7 +85,7 @@ mt:f(@
}
TEST [[
-(''):sub(@
+(''):sub($
]]
{
label = [[
@@ -96,7 +96,7 @@ function *string:sub(i: integer [, j: integer(-1)])
}
TEST [[
-(''):sub(1)@
+(''):sub(1)$
]]
(nil)
@@ -104,16 +104,29 @@ TEST [[
local function f(a, b, c)
end
-f(1, 'string@')
+f(1, 'string$')
]]
(nil)
TEST [[
-pcall(function () @ end)
+pcall(function () $ end)
]]
(nil)
TEST [[
-table.unpack {@}
+table.unpack {$}
]]
(nil)
+
+TEST [[
+---@type fun(x: number, y: number):boolean
+local zzzz
+zzzz($)
+]]
+{
+ label = [[
+function zzzz(x: number, y: number)
+ -> boolean
+]],
+ arg = {15, 23},
+}