summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/matcher/completion.lua8
-rw-r--r--server/src/matcher/init.lua1
-rw-r--r--server/src/method/init.lua1
-rw-r--r--server/src/method/initialize.lua5
-rw-r--r--server/src/method/textDocument/completion.lua39
-rw-r--r--server/test/completion/init.lua85
-rw-r--r--server/test/main.lua1
7 files changed, 140 insertions, 0 deletions
diff --git a/server/src/matcher/completion.lua b/server/src/matcher/completion.lua
new file mode 100644
index 00000000..66b993a4
--- /dev/null
+++ b/server/src/matcher/completion.lua
@@ -0,0 +1,8 @@
+local findResult = require 'matcher.find_result'
+
+return function (vm, pos)
+ local result = findResult(vm, pos)
+ if not result then
+ return nil
+ end
+end
diff --git a/server/src/matcher/init.lua b/server/src/matcher/init.lua
index 9174d839..27adbbea 100644
--- a/server/src/matcher/init.lua
+++ b/server/src/matcher/init.lua
@@ -7,6 +7,7 @@ local api = {
diagnostics = require 'matcher.diagnostics',
findResult = require 'matcher.find_result',
findLib = require 'matcher.find_lib',
+ completion = require 'matcher.completion',
vm = require 'matcher.vm',
}
diff --git a/server/src/method/init.lua b/server/src/method/init.lua
index 80619cbe..2aaa2b24 100644
--- a/server/src/method/init.lua
+++ b/server/src/method/init.lua
@@ -8,6 +8,7 @@ init 'exit'
init 'initialize'
init 'initialized'
init 'shutdown'
+init 'textDocument/completion'
init 'textDocument/definition'
init 'textDocument/didOpen'
init 'textDocument/didChange'
diff --git a/server/src/method/initialize.lua b/server/src/method/initialize.lua
index 8b71e8fd..8daa2ae6 100644
--- a/server/src/method/initialize.lua
+++ b/server/src/method/initialize.lua
@@ -19,6 +19,11 @@ return function (lsp)
-- 文本改变时完全通知 TODO 支持差量更新(2)
change = 1,
},
+ -- 自动完成
+ --completionProvider = {
+ -- resolveProvider = false,
+ --},
+ -- 工作目录
workspace = {
workspaceFolders = {
supported = true,
diff --git a/server/src/method/textDocument/completion.lua b/server/src/method/textDocument/completion.lua
new file mode 100644
index 00000000..9b040f17
--- /dev/null
+++ b/server/src/method/textDocument/completion.lua
@@ -0,0 +1,39 @@
+local CompletionItemKind = {
+ Text = 1,
+ Method = 2,
+ Function = 3,
+ Constructor = 4,
+ Field = 5,
+ Variable = 6,
+ Class = 7,
+ Interface = 8,
+ Module = 9,
+ Property = 10,
+ Unit = 11,
+ Value = 12,
+ Enum = 13,
+ Keyword = 14,
+ Snippet = 15,
+ Color = 16,
+ File = 17,
+ Reference = 18,
+ Folder = 19,
+ EnumMember = 20,
+ Constant = 21,
+ Struct = 22,
+ Event = 23,
+ Operator = 24,
+ TypeParameter = 25,
+}
+
+return function (lsp, params)
+ return {
+ isIncomplete = true,
+ items = {
+ {
+ label = 'xxxx',
+ kind = CompletionItemKind.Method,
+ }
+ }
+ }
+end
diff --git a/server/test/completion/init.lua b/server/test/completion/init.lua
new file mode 100644
index 00000000..684a8fe7
--- /dev/null
+++ b/server/test/completion/init.lua
@@ -0,0 +1,85 @@
+local matcher = require 'matcher'
+local parser = require 'parser'
+
+local CompletionItemKind = {
+ Text = 1,
+ Method = 2,
+ Function = 3,
+ Constructor = 4,
+ Field = 5,
+ Variable = 6,
+ Class = 7,
+ Interface = 8,
+ Module = 9,
+ Property = 10,
+ Unit = 11,
+ Value = 12,
+ Enum = 13,
+ Keyword = 14,
+ Snippet = 15,
+ Color = 16,
+ File = 17,
+ Reference = 18,
+ Folder = 19,
+ EnumMember = 20,
+ Constant = 21,
+ Struct = 22,
+ Event = 23,
+ Operator = 24,
+ TypeParameter = 25,
+}
+
+local function eq(a, b)
+ local tp1, tp2 = type(a), type(b)
+ if tp1 ~= tp2 then
+ return false
+ end
+ if tp1 == 'table' then
+ local mark = {}
+ for k in pairs(a) do
+ if not eq(a[k], b[k]) then
+ return false
+ end
+ mark[k] = true
+ end
+ for k in pairs(b) do
+ if not mark[k] then
+ return false
+ end
+ end
+ return true
+ end
+ return a == b
+end
+
+rawset(_G, 'TEST', true)
+
+function TEST(script)
+ return function (expect)
+ local pos = script:find('@', 1, true)
+ local new_script = script:gsub('@', '')
+ local ast = parser:ast(new_script)
+ local vm = matcher.vm(ast)
+ assert(vm)
+ local result = matcher.completion(vm, pos)
+ assert(result)
+ assert(eq(expect, result))
+ end
+end
+
+TEST [[
+local abcde
+a@
+]]
+{
+ {
+ label = 'abcde',
+ kind = CompletionItemKind.Variable,
+ }
+}
+
+TEST [[
+local abcde
+abcde
+]]
+{}
diff --git a/server/test/main.lua b/server/test/main.lua
index c866b7a5..2739a650 100644
--- a/server/test/main.lua
+++ b/server/test/main.lua
@@ -31,6 +31,7 @@ local function main()
test 'type_inference'
test 'find_lib'
test 'hover'
+ test 'completion'
print('测试完成')
end