diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2022-04-03 05:43:58 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-03 05:43:58 +0800 |
commit | db2771b51110f1c0c6ebe12de5ac002b4268fb32 (patch) | |
tree | a93187ceeb70ae9062a28ee4e55173959540aa2e /script | |
parent | 01f8679a3435d95c250e0a2a9713091031d13a00 (diff) | |
parent | 0173906aec91baa04cd1c8fcbdd2c4da0a058240 (diff) | |
download | lua-language-server-db2771b51110f1c0c6ebe12de5ac002b4268fb32.zip |
Merge pull request #1011 from Cassolette/patch-evtemitter-fix
Event emitter support fix
Diffstat (limited to 'script')
-rw-r--r-- | script/core/completion/completion.lua | 49 | ||||
-rw-r--r-- | script/core/noder.lua | 28 |
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 |