diff options
Diffstat (limited to 'script')
-rw-r--r-- | script/core/completion/completion.lua | 49 | ||||
-rw-r--r-- | script/core/noder.lua | 28 | ||||
-rw-r--r-- | script/core/semantic-tokens.lua | 24 |
3 files changed, 56 insertions, 45 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 diff --git a/script/core/semantic-tokens.lua b/script/core/semantic-tokens.lua index ef426633..f16acafc 100644 --- a/script/core/semantic-tokens.lua +++ b/script/core/semantic-tokens.lua @@ -161,17 +161,7 @@ local Care = util.switch() } return end - -- 5. References to other functions - if infer.hasType(loc, 'function') then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes['function'], - modifieres = source.type == 'setlocal' and define.TokenModifiers.declaration or nil, - } - return - end - -- 6. Class declaration + -- 5. Class declaration -- only search this local if loc.bindDocs then for i, doc in ipairs(loc.bindDocs) do @@ -189,7 +179,17 @@ local Care = util.switch() end end end - -- 6. const 变量 | Const variable + -- 6. References to other functions + if infer.hasType(loc, 'function') then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes['function'], + modifieres = source.type == 'setlocal' and define.TokenModifiers.declaration or nil, + } + return + end + -- 7. const 变量 | Const variable if loc.attrs then for _, attr in ipairs(loc.attrs) do local name = attr[1] |