summaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
Diffstat (limited to 'script')
-rw-r--r--script/core/completion/completion.lua49
-rw-r--r--script/core/noder.lua28
-rw-r--r--script/core/semantic-tokens.lua24
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]