summaryrefslogtreecommitdiff
path: root/script/core
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2022-04-03 05:43:58 +0800
committerGitHub <noreply@github.com>2022-04-03 05:43:58 +0800
commitdb2771b51110f1c0c6ebe12de5ac002b4268fb32 (patch)
treea93187ceeb70ae9062a28ee4e55173959540aa2e /script/core
parent01f8679a3435d95c250e0a2a9713091031d13a00 (diff)
parent0173906aec91baa04cd1c8fcbdd2c4da0a058240 (diff)
downloadlua-language-server-db2771b51110f1c0c6ebe12de5ac002b4268fb32.zip
Merge pull request #1011 from Cassolette/patch-evtemitter-fix
Event emitter support fix
Diffstat (limited to 'script/core')
-rw-r--r--script/core/completion/completion.lua49
-rw-r--r--script/core/noder.lua28
2 files changed, 44 insertions, 33 deletions
diff --git a/script/core/completion/completion.lua b/script/core/completion/completion.lua
index 969de95a..30df047c 100644
--- a/script/core/completion/completion.lua
+++ b/script/core/completion/completion.lua
@@ -1380,34 +1380,37 @@ local function getCallEnumsAndFuncs(source, index, oop, call)
return
end
local results = {}
- if currentIndex == 1 then
- for _, doc in ipairs(class.fields) do
- if doc.field ~= source
- and doc.field[1] == source[1] then
- local eventName = noder.getFieldEventName(doc)
- if eventName then
- results[#results+1] = {
- label = ('%q'):format(eventName),
- description = doc.comment,
- kind = define.CompletionItemKind.EnumMember,
- }
+ local valueBeforeIndex = index > 1 and call.args[index - 1][1]
+
+ for _, doc in ipairs(class.fields) do
+ if doc.field ~= source
+ and doc.field[1] == source[1] then
+ local indexType = currentIndex
+ if not oop then
+ local args = noder.getFieldArgs(doc)
+ -- offset if doc's first arg is `self`
+ if args and args[1] and args[1].name[1] == 'self' then
+ indexType = indexType - 1
end
end
- end
- elseif currentIndex == 2 then
- local myEventName = call.args[index - 1][1]
- for _, doc in ipairs(class.fields) do
- if doc.field ~= source
- and doc.field[1] == source[1] then
- local eventName = noder.getFieldEventName(doc)
- if eventName and eventName == myEventName then
- local docFunc = doc.extends.types[1].args[2].extends.types[1]
+ local eventName = noder.getFieldEventName(doc)
+ if eventName then
+ if indexType == 1 then
results[#results+1] = {
- label = infer.viewDocFunction(docFunc),
+ label = ('%q'):format(eventName),
description = doc.comment,
- kind = define.CompletionItemKind.Function,
- insertText = buildInsertDocFunction(docFunc),
+ kind = define.CompletionItemKind.EnumMember,
}
+ elseif indexType == 2 then
+ if eventName == valueBeforeIndex then
+ local docFunc = doc.extends.types[1].args[index].extends.types[1]
+ results[#results+1] = {
+ label = infer.viewDocFunction(docFunc),
+ description = doc.comment,
+ kind = define.CompletionItemKind.Function,
+ insertText = buildInsertDocFunction(docFunc),
+ }
+ end
end
end
end
diff --git a/script/core/noder.lua b/script/core/noder.lua
index fcc6b6f4..2a60baee 100644
--- a/script/core/noder.lua
+++ b/script/core/noder.lua
@@ -140,11 +140,7 @@ local function getMethodNode(source)
end
end
-local function getFieldEventName(field)
- if field._eventName then
- return field._eventName or nil
- end
- field._eventName = false
+local function getFieldArgs(field)
local fieldType = field.extends
if not fieldType then
return nil
@@ -153,19 +149,29 @@ local function getFieldEventName(field)
if not docFunc or docFunc.type ~= 'doc.type.function' then
return nil
end
- local firstArg = docFunc.args and docFunc.args[1]
+ return docFunc.args
+end
+
+local function getFieldEventName(field)
+ if field._eventName then
+ return field._eventName or nil
+ end
+ field._eventName = false
+
+ local args = getFieldArgs(field)
+ local firstArg = args and args[1]
if not firstArg then
return nil
end
local secondArg
if firstArg.name[1] == 'self' then
- firstArg = docFunc.args[2]
+ firstArg = args[2]
if not firstArg then
return nil
end
- secondArg = docFunc.args[3]
+ secondArg = args[3]
else
- secondArg = docFunc.args[2]
+ secondArg = args[2]
end
if not secondArg then
return
@@ -881,7 +887,8 @@ local function compileCallParam(noders, call, sourceID)
local eventNodeID
for firstIndex, callArg in ipairs(call.args) do
firstIndex = firstIndex - fixIndex
- if firstIndex == 1 and callArg.type == 'string' then
+ if (firstIndex == 1 or firstIndex == 2)
+ and callArg.type == 'string' then
if callArg[1] then
eventNodeID = sformat('%s%s%s'
, nodeID
@@ -1685,6 +1692,7 @@ function m.eachID(noders)
return next, noders.source
end
+m.getFieldArgs = getFieldArgs
m.getFieldEventName = getFieldEventName
---获取对象的noders