diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2021-08-19 17:39:27 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2021-08-19 17:39:27 +0800 |
commit | 0ec4d69bc4e34c3c11c85d17edc0e98e9a719c7e (patch) | |
tree | fa17e6e406c96d88204c093af450fb41866d4174 | |
parent | 5e0624bcb55e1a7c2edece6e661dc3cb056ded7e (diff) | |
download | lua-language-server-0ec4d69bc4e34c3c11c85d17edc0e98e9a719c7e.zip |
always incomplete
-rw-r--r-- | script/provider/provider.lua | 2 | ||||
-rw-r--r-- | test/completion/common.lua | 2662 | ||||
-rw-r--r-- | test/completion/continue.lua | 32 | ||||
-rw-r--r-- | test/completion/init.lua | 2676 |
4 files changed, 2706 insertions, 2666 deletions
diff --git a/script/provider/provider.lua b/script/provider/provider.lua index aebf733e..fe044fc5 100644 --- a/script/provider/provider.lua +++ b/script/provider/provider.lua @@ -470,7 +470,7 @@ proto.on('textDocument/completion', function (params) items[i] = item end return { - isIncomplete = false, + isIncomplete = true, items = items, } end) diff --git a/test/completion/common.lua b/test/completion/common.lua new file mode 100644 index 00000000..f2bbe542 --- /dev/null +++ b/test/completion/common.lua @@ -0,0 +1,2662 @@ +local define = require 'proto.define' +local config = require 'config' + +config.set('Lua.completion.callSnippet', 'Both') +config.set('Lua.completion.keywordSnippet', 'Both') +config.set('Lua.completion.workspaceWord', false) + +TEST [[ +local zabcde +za$ +]] +{ + { + label = 'zabcde', + kind = define.CompletionItemKind.Variable, + } +} + +TEST [[ +local zabcdefg +local zabcde +zabcde$ +]] +{ + { + label = 'zabcde', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'zabcdefg', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST [[ +local zabcdefg +za$ +local zabcde +]] +{ + { + label = 'zabcdefg', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'zabcde', + kind = define.CompletionItemKind.Text, + }, +} + +TEST [[ +local zabcde +zace$ +]] +{ + { + label = 'zabcde', + kind = define.CompletionItemKind.Variable, + } +} + +TEST [[ +ZABC = x +local zabc +zac$ +]] +{ + { + label = 'zabc', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'ZABC', + kind = define.CompletionItemKind.Field, + }, +} + +TEST [[ +ass$ +]] +{ + { + label = 'assert(v, message)', + kind = define.CompletionItemKind.Function, + }, + { + label = 'assert(v, message)', + kind = define.CompletionItemKind.Snippet, + }, +} + +TEST [[ +local assert = 1 +ass$ +]] +{ + { + label = 'assert', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST [[ +local assert = 1 +_G.ass$ +]] +{ + { + label = 'assert(v, message)', + kind = define.CompletionItemKind.Function, + }, + { + label = 'assert(v, message)', + kind = define.CompletionItemKind.Snippet, + }, +} + +TEST [[ +local function ffff(a, b) +end +ff$ +]] +{ + { + label = 'ffff(a, b)', + kind = define.CompletionItemKind.Function, + }, + { + label = 'ffff(a, b)', + kind = define.CompletionItemKind.Snippet, + } +} + +TEST [[ +local zabc = 1 +z$ +]] +{ + { + label = 'zabc', + kind = define.CompletionItemKind.Variable, + } +} + +TEST [[ +local zabc = 1.0 +z$ +]] +{ + { + label = 'zabc', + kind = define.CompletionItemKind.Variable, + } +} + +TEST [[ +local t = { + abc = 1, +} +t.ab$ +]] +{ + { + label = 'abc', + kind = define.CompletionItemKind.Enum, + } +} + +TEST [[ +local t = { + abc = 1, +} +local n = t.abc +t.ab$ +]] +{ + { + label = 'abc', + kind = define.CompletionItemKind.Enum, + } +} + +TEST [[ +local mt = {} +mt.ggg = 1 +function mt:get(a, b) + return 1 +end +mt:g$ +]] +{ + { + label = 'get(a, b)', + kind = define.CompletionItemKind.Method, + }, + { + label = 'get(a, b)', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'ggg', + kind = define.CompletionItemKind.Text, + } +} + +TEST [[ +loc$ +]] +{ + { + label = 'local', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'local function', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'collectgarbage(opt, ...)', + kind = define.CompletionItemKind.Function, + }, + { + label = 'collectgarbage(opt, ...)', + kind = define.CompletionItemKind.Snippet, + }, +} + +IgnoreFunction = true +TEST [[ +do$ +]] +{ + { + label = 'do', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'do .. end', + kind = define.CompletionItemKind.Snippet, + }, +} + +TEST [[ +while true d$ +]] +{ + { + label = 'do', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'do .. end', + kind = define.CompletionItemKind.Snippet, + }, +} + +TEST [[ +results$ +]] +(nil) + +TEST [[ +result$ +local results +]] +(EXISTS) + +TEST [[ +local a$ + +local function f(fff) + fff = ast + fff = ast + fff = ast + fff = ast + fff = ast + fff = ast +end +]] +{ + { + label = 'ast', + kind = define.CompletionItemKind.Variable, + } +} + +TEST [[ +t.a = {} +t.b = {} +t.$ +]] +{ + { + label = 'a', + kind = define.CompletionItemKind.Field, + }, + { + label = 'b', + kind = define.CompletionItemKind.Field, + }, +} + +TEST [[ +t.a = {} +t.b = {} +t. $ +]] +{ + { + label = 'a', + kind = define.CompletionItemKind.Field, + }, + { + label = 'b', + kind = define.CompletionItemKind.Field, + }, +} + +IgnoreFunction = false +TEST [[ +t.a = {} +function t:b() +end +t:$ +]] +{ + { + label = 'b()', + kind = define.CompletionItemKind.Method, + }, + { + label = 'b()', + kind = define.CompletionItemKind.Snippet, + }, +} + +TEST [[ +local t = { + a = {}, +} +t.$ +xxx() +]] +{ + { + label = 'a', + kind = define.CompletionItemKind.Field, + }, +} + +TEST [[ +(''):$ +]] +(EXISTS) + +TEST [[ +local zzz + +return 'aa' .. zz$ +]] +{ + { + label = 'zzz', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST 'local s = "a:$"' (nil) + +TEST 'debug.$' +(EXISTS) + +IgnoreFunction = true +TEST [[ +local xxxx = { + xxyy = 1, + xxzz = 2, +} + +local t = { + x$ +} +]] +{ + { + label = 'xxxx', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'xxyy', + kind = define.CompletionItemKind.Property, + }, + { + label = 'xxzz', + kind = define.CompletionItemKind.Property, + }, +} + +TEST [[ +print(ff2) +local faa +local f$ +print(fff) +]] +{ + { + label = 'function', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'function ()', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'fff', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'ff2', + kind = define.CompletionItemKind.Text, + }, + { + label = 'faa', + kind = define.CompletionItemKind.Text, + }, +} + +TEST [[ +local function f(ff$) + print(fff) +end +]] +{ + { + label = 'fff', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST [[ +collectgarbage($) +]] +(EXISTS) + +TEST [[ +collectgarbage('$') +]] +{ + { + label = "'collect'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'collect'", + }, + }, + { + label = "'stop'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'stop'", + }, + }, + { + label = "'restart'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'restart'", + }, + }, + { + label = "'count'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'count'", + }, + }, + { + label = "'step'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'step'", + }, + }, + { + label = "'isrunning'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'isrunning'", + }, + }, + { + label = "'incremental'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'incremental'", + }, + }, + { + label = "'generational'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + start = 16, + finish = 17, + newText = "'generational'", + }, + }, +} + +TEST [[ +io.read($) +]] +{ + { + label = '"n"', + kind = define.CompletionItemKind.EnumMember, + }, + { + label = '"a"', + kind = define.CompletionItemKind.EnumMember, + }, + { + label = '"l"', + kind = define.CompletionItemKind.EnumMember, + }, + { + label = '"L"', + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +io.open('', $) +]] +(EXISTS) + +TEST [[ +local function f(a, $) +end +]] +(nil) + +TEST [[ +self.results.list[#$] +]] +{ + { + label = '#self.results.list+1', + kind = define.CompletionItemKind.Snippet, + textEdit = { + start = 19, + finish = 20, + newText = '#self.results.list+1] = ', + }, + }, +} + +TEST [[ +self.results.list[#$] +local n = 1 +]] +{ + { + label = '#self.results.list+1', + kind = define.CompletionItemKind.Snippet, + textEdit = { + start = 19, + finish = 20, + newText = '#self.results.list+1] = ', + }, + }, +} + +TEST [[ +self.results.list[#$] = 1 +]] +{ + { + label = '#self.results.list+1', + kind = define.CompletionItemKind.Snippet, + textEdit = { + start = 19, + finish = 20, + newText = '#self.results.list+1]', + }, + }, +} + +TEST [[ +self.results.list[#self.re$] +]] +{ + { + label = '#self.results.list+1', + kind = define.CompletionItemKind.Snippet, + textEdit = { + start = 19, + finish = 27, + newText = '#self.results.list+1] = ', + }, + }, + { + label = 'results', + kind = define.CompletionItemKind.Field, + }, +} + +TEST [[ +fff[#ff$] +]] +{ + { + label = '#fff+1', + kind = define.CompletionItemKind.Snippet, + textEdit = { + start = 5, + finish = 8, + newText = '#fff+1] = ', + }, + }, + { + label = 'fff', + kind = define.CompletionItemKind.Text, + } +} + +TEST [[ +local _ = fff.kkk[#$] +]] +{ + { + label = '#fff.kkk', + kind = define.CompletionItemKind.Snippet, + textEdit = { + start = 19, + finish = 20, + newText = '#fff.kkk]', + }, + }, +} + +TEST [[ +fff.kkk[#$].yy +]] +{ + { + label = '#fff.kkk', + kind = define.CompletionItemKind.Snippet, + textEdit = { + start = 9, + finish = 10, + newText = '#fff.kkk]', + }, + }, +} + +TEST [[ +local t = { + a = 1, +} + +t . $ +]] +(EXISTS) + +TEST [[ +local t = { + a = 1, +} + +t . $ b +]] +(EXISTS) + +TEST [[ +local t = { + a = 1, +} + +t $ +]] +(nil) + +TEST [[ +local t = { + a = 1, +} + +t $. +]] +(nil) + +TEST [[ +local xxxx +xxxx$ +]] +{ + { + label = 'xxxx', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST [[ +local xxxx +local XXXX +xxxx$ +]] +{ + { + label = 'XXXX', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'xxxx', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST [[ +local t = { + xxxxx = 1, +} +xx$ +]] +{ + { + label = 'xxxxx', + kind = define.CompletionItemKind.Text, + }, +} + +TEST [[ +local index +tbl[inde$] +]] +{ + { + label = 'index', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST [[ +return function () + local t = { + a = {}, + b = {}, + } + t.$ +end +]] +{ + { + label = 'a', + kind = define.CompletionItemKind.Field, + }, + { + label = 'b', + kind = define.CompletionItemKind.Field, + }, +} + +TEST [[ +local ast = 1 +local t = 'as$' +local ask = 1 +]] +(EXISTS) + +TEST [[ +local add + +function f(ad$) + local _ = add +end +]] +{ + { + label = 'add', + kind = define.CompletionItemKind.Variable, + }, +} + +TEST [[ +function table.i$ +]] +(EXISTS) + +TEST [[ +do + xx.$ +end +]] +(nil) + +TEST [[ +print(io.$) +]] +(EXISTS) + +require 'config'.set('Lua.runtime.version', 'Lua 5.4') +--TEST [[ +--local $ +--]] +--{ +-- { +-- label = '<toclose>', +-- kind = define.CompletionItemKind.Keyword, +-- }, +-- { +-- label = '<const>', +-- kind = define.CompletionItemKind.Keyword, +-- }, +--} +-- +--TEST [[ +--local <toc$ +--]] +--{ +-- { +-- label = '<toclose>', +-- kind = define.CompletionItemKind.Keyword, +-- } +--} + +TEST [[ +local mt = {} +mt.__index = mt +local t = setmetatable({}, mt) + +t.$ +]] +{ + { + label = '__index', + kind = define.CompletionItemKind.Field, + } +} + +TEST [[ +local elseaaa +ELSE = 1 +if a then +else$ +]] +{ + { + label = 'else', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'elseif', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'elseif .. then', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'elseaaa', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'ELSE', + kind = define.CompletionItemKind.Enum, + }, +} + +Cared['insertText'] = true +IgnoreFunction = false +TEST [[ +local xpcal +xpcal$ +]] +{ + { + label = 'xpcal', + kind = define.CompletionItemKind.Variable, + }, + { + label = 'xpcall(f, msgh, arg1, ...)', + kind = define.CompletionItemKind.Function, + insertText = EXISTS, + }, + { + label = 'xpcall(f, msgh, arg1, ...)', + kind = define.CompletionItemKind.Snippet, + insertText = EXISTS, + }, +} + +TEST [[ +function mt:f(a, b, c) +end + +mt:f$ +]] +{ + { + label = 'f(a, b, c)', + kind = define.CompletionItemKind.Method, + insertText = EXISTS, + }, + { + label = 'f(a, b, c)', + kind = define.CompletionItemKind.Snippet, + insertText = 'f(${1:a: any}, ${2:b: any}, ${3:c: any})', + }, +} + +TEST [[ +function$ +]] +{ + { + label = 'function', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'function ()', + kind = define.CompletionItemKind.Snippet, + insertText = "\z +function $1($2)\ +\t$0\ +end", + }, +} + +TEST [[ +local t = function$ +]] +{ + { + label = 'function', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'function ()', + kind = define.CompletionItemKind.Snippet, + insertText = "\z +function ($1)\ +\t$0\ +end", + }, +} +Cared['insertText'] = false +IgnoreFunction = true + +TEST [[ +local function f() + if a then + else$ +end +]] +{ + { + label = 'else', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'elseif', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'elseif .. then', + kind = define.CompletionItemKind.Snippet, + }, +} + +TEST [[ +local t = { + ['a.b.c'] = {} +} + +t.$ +]] +{ + { + label = 'a.b.c', + kind = define.CompletionItemKind.Field, + textEdit = { + start = 37, + finish = 36, + newText = '["a.b.c"]', + }, + additionalTextEdits = { + { + start = 36, + finish = 36, + newText = '', + }, + }, + } +} + +TEST [[ +local t = { + ['a.b.c'] = {} +} + +t. $ +]] +{ + { + label = 'a.b.c', + kind = define.CompletionItemKind.Field, + textEdit = { + start = 40, + finish = 39, + newText = '["a.b.c"]', + }, + additionalTextEdits = { + { + start = 36, + finish = 36, + newText = '', + }, + }, + } +} + +TEST [[ +local t = { + ['a.b.c'] = {} +} + +t['$'] +]] +{ + { + label = 'a.b.c', + kind = define.CompletionItemKind.Field, + textEdit = { + start = 38, + finish = 37, + newText = 'a.b.c', + } + } +} + +TEST [[ +_ENV['z.b.c'] = {} + +z$ +]] +{ + { + label = 'z.b.c', + kind = define.CompletionItemKind.Field, + textEdit = { + start = 21, + finish = 21, + newText = '_ENV["z.b.c"]', + }, + }, +} + +TEST [[ +io.close(1, $) +]] +(nil) + +TEST [[ +io$ +]] +(EXISTS) + +IgnoreFunction = false +TEST [[ +loadstring$ +]] +{ + { + label = 'loadstring(text, chunkname)', + kind = define.CompletionItemKind.Function, + deprecated = true, + }, + { + label = 'loadstring(text, chunkname)', + kind = define.CompletionItemKind.Snippet, + deprecated = true, + }, +} + +--TEST [[ +--bit32$ +--]] +--{ +-- { +-- label = 'bit32', +-- kind = define.CompletionItemKind.Field, +-- deprecated = true, +-- }, +--} + +TEST [[ +function loadstring() +end +loadstring$ +]] +{ + { + label = 'loadstring()', + kind = define.CompletionItemKind.Function, + }, + { + label = 'loadstring()', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'loadstring(text, chunkname)', + deprecated = true, + kind = define.CompletionItemKind.Function, + }, + { + label = 'loadstring(text, chunkname)', + deprecated = true, + kind = define.CompletionItemKind.Snippet, + }, +} + +TEST [[ +debug.setcsta$ +]] +{ + { + label = 'setcstacklimit(limit)', + kind = define.CompletionItemKind.Function, + deprecated = true, + }, + { + label = 'setcstacklimit(limit)', + kind = define.CompletionItemKind.Snippet, + deprecated = true, + }, +} + +TEST [[ +---@$ +]] +(EXISTS) + +TEST [[ +---@cl$ +]] +{ + { + label = 'class', + kind = define.CompletionItemKind.Event + } +} + +TEST [[ +---@class ZABC +---@class ZBBC : Z$ +]] +{ + { + label = 'ZABC', + kind = define.CompletionItemKind.Class, + }, +} + +TEST [[ +---@class ZABC +---@class ZBBC : $ +]] +(EXISTS) + +TEST [[ +---@class zabc +local abcd +---@type za$ +]] +{ + { + label = 'zabc', + kind = define.CompletionItemKind.Class, + }, +} + +TEST [[ +---@class abc +local abcd +---@type $ +]] +(EXISTS) + +TEST [[ +---@class zabc +local abcd +---@type zxxx|z$ +]] +{ + { + label = 'zabc', + kind = define.CompletionItemKind.Class, + } +} + +TEST [[ +---@alias zabc zabb +---@type za$ +]] +{ + { + label = 'zabc', + kind = define.CompletionItemKind.Class, + }, +} + +TEST [[ +---@class ZClass +---@param x ZC$ +]] +{ + { + label = 'ZClass', + kind = define.CompletionItemKind.Class, + }, +} + +Cared['insertText'] = true +TEST [[ +---@param $ +function f(a, b, c) +end +]] +{ + { + label = 'a, b, c', + kind = define.CompletionItemKind.Snippet, + insertText = [[ +a ${1:any} +---@param b ${2:any} +---@param c ${3:any}]] + }, + { + label = 'a', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'b', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'c', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +---@param $ +function f(a, b, c) end + +function f2(a) end +]] +{ + { + label = 'a, b, c', + kind = define.CompletionItemKind.Snippet, + insertText = [[ +a ${1:any} +---@param b ${2:any} +---@param c ${3:any}]] + }, + { + label = 'a', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'b', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'c', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +---@param aa$ +function f(aaa, bbb, ccc) +end +]] +{ + { + label = 'aaa', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +local function f() + ---@param $ + function f(a, b, c) + end +end +]] +{ + { + label = 'a, b, c', + kind = define.CompletionItemKind.Snippet, + insertText = [[ +a ${1:any} +---@param b ${2:any} +---@param c ${3:any}]] + }, + { + label = 'a', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'b', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'c', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +---@param $ +function mt:f(a, b, c, ...) +end +]] +{ + { + label = 'a, b, c', + kind = define.CompletionItemKind.Snippet, + insertText = [[ +a ${1:any} +---@param b ${2:any} +---@param c ${3:any}]], + }, + { + label = 'self', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'a', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'b', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'c', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +---@param aaa $ +function f(aaa, bbb, ccc) +end +]] +(EXISTS) + +TEST [[ +---@param xyz Class +---@param xxx Class +function f(x$) +]] +{ + { + label = 'xyz, xxx', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'xyz', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'xxx', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +---@param xyz Class +---@param xxx Class +function f($ +]] +{ + { + label = 'xyz, xxx', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'xyz', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'xxx', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +---@param xyz Class +---@param xxx Class +function f($) +]] +{ + { + label = 'xyz, xxx', + kind = define.CompletionItemKind.Snippet, + }, + { + label = 'xyz', + kind = define.CompletionItemKind.Interface, + }, + { + label = 'xxx', + kind = define.CompletionItemKind.Interface, + }, +} + +TEST [[ +local function f() + ---@t$ +end +]] +{ + { + label = 'type', + kind = define.CompletionItemKind.Event, + }, + { + label = 'return', + kind = define.CompletionItemKind.Event, + }, + { + label = 'deprecated', + kind = define.CompletionItemKind.Event, + }, + { + label = 'meta', + kind = define.CompletionItemKind.Event, + }, + { + label = 'diagnostic', + kind = define.CompletionItemKind.Event, + } +} + +TEST [[ +---@class Class +---@field name string +---@field id integer +local mt = {} +mt.$ +]] +{ + { + label = 'id', + kind = define.CompletionItemKind.Field, + }, + { + label = 'name', + kind = define.CompletionItemKind.Field, + }, +} + +TEST [[ +---@param x string | "'AAA'" | "'BBB'" | "'CCC'" +function f(y, x) +end + +f(1, $) +]] +{ + { + label = "'AAA'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'BBB'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'CCC'", + kind = define.CompletionItemKind.EnumMember, + } +} + +TEST [[ +---@param x string | "'AAA'" | "'BBB'" | "'CCC'" +function f(y, x) +end + +f(1,$) +]] +{ + { + label = "'AAA'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'BBB'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'CCC'", + kind = define.CompletionItemKind.EnumMember, + } +} + +TEST [[ +---@param x string | "'AAA'" | "'BBB'" | "'CCC'" +function f(x) +end + +f($) +]] +{ + { + label = "'AAA'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'BBB'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'CCC'", + kind = define.CompletionItemKind.EnumMember, + } +} + +TEST [[ +---@alias Option string | "'AAA'" | "'BBB'" | "'CCC'" +---@param x Option +function f(x) +end + +f($) +]] +{ + { + label = "'AAA'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'BBB'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'CCC'", + kind = define.CompletionItemKind.EnumMember, + } +} + +TEST [[ +---@param x string | "'AAA'" | "'BBB'" | "'CCC'" +function f(x) +end + +f('$') +]] +{ + { + label = "'AAA'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, + { + label = "'BBB'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, + { + label = "'CCC'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + } +} + +TEST [[ +---this is +---a multi line +---comment +---@alias XXXX +---comment 1 +---comment 1 +---| '1' +---comment 2 +---comment 2 +---| '2' + +---@param x XXXX +local function f(x) +end + +f($) +]] +{ + { + label = '1', + kind = define.CompletionItemKind.EnumMember, + }, + { + label = '2', + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +---this is +---a multi line +---comment +---@alias XXXX +---comment 1 +---comment 1 +---| '1' +---comment 2 +---comment 2 +---| '2' +---@param x XXXX +local function f(x) +end + + +---comment 3 +---comment 3 +---| '3' + +f($) +]] +{ + { + label = '1', + kind = define.CompletionItemKind.EnumMember, + }, + { + label = '2', + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +---@param x function | 'function () end' +function f(x) +end + +f(function () + $ +end) +]] +(nil) + +TEST [[ +--- JustTest +---@param list table +---@param sep string +---@param i number +---@param j number +---@return string +local function zzzzz(list, sep, i, j) end + +zzz$ +]] +{ + { + label = 'zzzzz(list, sep, i, j)', + kind = define.CompletionItemKind.Function, + insertText = EXISTS, + }, + { + label = 'zzzzz(list, sep, i, j)', + kind = define.CompletionItemKind.Snippet, + insertText = EXISTS, + } +} + +Cared['detail'] = true +Cared['description'] = true +TEST [[ +--- abc +zzz = 1 +zz$ +]] +{ + { + label = 'zzz', + kind = define.CompletionItemKind.Enum, + detail = 'integer = 1', + description = [[ +```lua +global zzz: integer = 1 +``` + +--- + abc]], + } +} + +TEST [[ +---@param x string +---| "'选项1'" # 注释1 +---| "'选项2'" # 注释2 +function f(x) end + +f($) +]] +{ + { + label = "'选项1'", + kind = define.CompletionItemKind.EnumMember, + description = '注释1', + }, + { + label = "'选项2'", + kind = define.CompletionItemKind.EnumMember, + description = '注释2', + }, +} + +TEST [[ +utf8.charpatter$ +]] +{ + { + label = 'charpattern', + detail = 'string', + kind = define.CompletionItemKind.Field, + description = EXISTS, + } +} + +TEST [[ +---@type "'a'"|"'b'"|"'c'" +local x + +print(x == $) +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +---@type "'a'"|"'b'"|"'c'" +local x + +x = $ +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +---@type "'a'"|"'b'"|"'c'" +local x + +print(x == '$') +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, +} + +TEST [[ +---@type "'a'"|"'b'"|"'c'" +local x + +x = '$' +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + textEdit = EXISTS, + }, +} + +TEST [[ +local t = type() + +print(t == $) +]] +(EXISTS) + +TEST [[ +if type(arg) == '$' +]] +(EXISTS) + +TEST [[ +if type(arg) == $ +]] +(EXISTS) + +TEST [[ +---@type string +local s +s.$ +]] +(EXISTS) + +TEST [[ +---@class C +local t + +local vvv = assert(t) +vvv$ +]] +{ + { + label = 'vvv', + detail = 'C', + kind = define.CompletionItemKind.Variable, + description = EXISTS, + }, +} + +Cared['insertText'] = true +TEST [[ +---@param callback fun(x: number, y: number):string +local function f(callback) end + +f($) +]] +{ + { + label = 'fun(x: number, y: number):string', + kind = define.CompletionItemKind.Function, + insertText = "\z +function (${1:x}, ${2:y})\ +\t$0\ +end", + }, +} + +TEST [[ +---$ +local function f(a, b, c) + return a + 1, b .. '', c[1] +end +]] +{ + { + label = '@param;@return', + kind = define.CompletionItemKind.Snippet, + insertText = "\z +${1:comment}\ +---@param a ${2:number}\ +---@param b ${3:string}\ +---@param c ${4:table}\ +---@return ${5:number}\ +---@return ${6:string}\ +---@return ${7:any}", + }, +} + +Cared['insertText'] = nil + +TEST [[ +--$ +]] +{ + { + label = '#region', + kind = define.CompletionItemKind.Snippet, + }, + { + label = '#endregion', + kind = define.CompletionItemKind.Snippet, + } +} + +Cared['description'] = nil +Cared['detail'] = nil +TEST [[ +---@class cc +---@field aaa number # a1 +---@field bbb number # a2 + +---@param x cc +local function f(x) end + +f({ + $ +}) +]] +{ + { + label = 'aaa', + kind = define.CompletionItemKind.Property, + }, + { + label = 'bbb', + kind = define.CompletionItemKind.Property, + }, +} + +TEST [[ +---@class cc +---@field aaa number # a1 +---@field bbb number # a2 + +---@param x cc +local function f(x) end + +f({ + aaa = 1, + $ +}) +]] +{ + { + label = 'bbb', + kind = define.CompletionItemKind.Property, + }, +} + +TEST [[ +---@class cc +---@field aaa number # a1 +---@field bbb number # a2 + +---@param x cc +local function f(x) end + +f({aaa = 1,$}) +]] +{ + { + label = 'bbb', + kind = define.CompletionItemKind.Property, + }, +} + +TEST [[ +---@class cc +---@field aaa number # a1 +---@field bbb number # a2 + +---@param x cc +local function f(x) end + +f({aaa $}) +]] +(nil) + +TEST [[ +---@class cc +---@field iffff number # a1 + +---@param x cc +local function f(x) end + +f({if$}) +]] +{ + include = true, + { + label = 'iffff', + kind = define.CompletionItemKind.Property, + }, +} + +TEST [[ +---@class cc +---@field aaa number # a1 +---@field bbb number # a2 + +---@param x cc +local function f(x) end + +f({ + { + $ + } +}) +]] +(nil) + +TEST [[ +---@return string +local function f() end + +local s = f() + +s.$ +]] +(EXISTS) + +Cared['description'] = true +TEST [[ +---@class cc +---@field aaa number +---@field bbb number + +---@type cc +local t +print(t.aa$) +]] +{ + { + label = 'aaa', + kind = define.CompletionItemKind.Field, + description = [[ +```lua +field cc.aaa: number +```]] + }, +} +Cared['description'] = nil + +TEST [[ +---@type table<string, "'a'"|"'b'"|"'c'"> +local x + +x.a = $ +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +---@type table<string, "'a'"|"'b'"|"'c'"> +local x + +x['a'] = $ +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +---@type table<string, "'a'"|"'b'"|"'c'"> +local x = { + a = $ +} +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + }, +} + +TEST [[ +---@type table<string, "'a'"|"'b'"|"'c'"> +local x = { + ['a'] = $ +} +]] +{ + { + label = "'a'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'b'", + kind = define.CompletionItemKind.EnumMember, + }, + { + label = "'c'", + kind = define.CompletionItemKind.EnumMember, + }, +} + +Cared['insertText'] = true +TEST [[ +---@class A.B.C +local m + +function m.f() +end + +m.f$ +]]{ + { + label = "f()", + kind = define.CompletionItemKind.Function, + insertText = EXISTS, + }, + { + label = "f()", + kind = define.CompletionItemKind.Snippet, + insertText = 'f()', + }, +} +Cared['insertText'] = nil + +TEST [[ +if true then$ +]] +{ + { + label = 'then', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'then .. end', + kind = define.CompletionItemKind.Snippet, + } +} + +TEST [[ +if true then$ +end +]] +{ + { + label = 'then', + kind = define.CompletionItemKind.Keyword, + }, +} + +TEST [[ +if true then$ +else +]] +{ + { + label = 'then', + kind = define.CompletionItemKind.Keyword, + }, +} + +TEST [[ +if true then$ +elseif +]] +{ + { + label = 'then', + kind = define.CompletionItemKind.Keyword, + }, +} + +TEST [[ +do + if true then$ +end +]] +{ + { + label = 'then', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'then .. end', + kind = define.CompletionItemKind.Snippet, + } +} + +TEST [[ +---@class C +---@field x number +---@field y number + +---@vararg C +local function f(x, ...) +end + +f(1, { + $ +}) +]] +{ + { + label = 'x', + kind = define.CompletionItemKind.Property, + }, + { + label = 'y', + kind = define.CompletionItemKind.Property, + } +} + +TEST [[ +---@class C +---@field x number +---@field y number + +---@vararg C +local function f(x, ...) +end + +f(1, {}, {}, { + $ +}) +]] +{ + { + label = 'x', + kind = define.CompletionItemKind.Property, + }, + { + label = 'y', + kind = define.CompletionItemKind.Property, + } +} + +TEST [[ +---@class C +---@field x number +---@field y number + +---@type C +local t = { + $ +} + +]] +{ + { + label = 'x', + kind = define.CompletionItemKind.Property, + }, + { + label = 'y', + kind = define.CompletionItemKind.Property, + } +} + +TEST [[ +---@class C +---@field x number +---@field y number + +---@type C +local t = { + x$ +} + +]] +{ + include = true, + { + label = 'x', + kind = define.CompletionItemKind.Property, + }, +} + +TEST [[ +if $ then +]] +(nil) + +TEST [[ +elseif $ then +]] +(nil) + +TEST [[ +---@type iolib +local t = { + $ +]] +(EXISTS) + +TEST [[ +---@class A +---@field a '"hello"'|'"world"' + +---@param t A +function api(t) end + +api({$}) +]] +(EXISTS) + +TEST [[ +---@class A +---@field a '"hello"'|'"world"' + +---@param t A +function m:api(t) end + +m:api({$}) +]] +(EXISTS) + +TEST [[ +---@class AAA.BBB + +---@type AAA.$ +]] +{ + { + label = 'AAA.BBB', + kind = define.CompletionItemKind.Class, + textEdit = { + start = 29, + finish = 32, + newText = 'AAA.BBB', + }, + } +} + +Cared['insertText'] = true +TEST [[ +---@overload fun(a: any, b: any) +local function zzzz(a) end +zzzz$ +]] +{ + { + label = 'zzzz(a)', + kind = define.CompletionItemKind.Function, + insertText = 'zzzz', + }, + { + label = 'zzzz(a)', + kind = define.CompletionItemKind.Snippet, + insertText = 'zzzz(${1:a: any})', + }, + { + label = 'zzzz(a, b)', + kind = define.CompletionItemKind.Function, + insertText = 'zzzz', + }, + { + label = 'zzzz(a, b)', + kind = define.CompletionItemKind.Snippet, + insertText = 'zzzz(${1:a: any}, ${2:b: any})', + }, +} +Cared['insertText'] = false + +TEST [[ +--- @diagnostic disable: unused-local +--- @class Test2 +--- @field world integer +local Test2 = {} + +--- @type Test2 +local tdirect +--- @type Test2[] +local tarray + +-- Direct inference +local b = tdirect -- type . here, shows "world" + +-- Inferred by index +local c = tarray[1].$ -- type . here, no auto completion +]] +(EXISTS) + +TEST [[ +local function f() + if type() == '$' then + end +end +]] +(EXISTS) + +config.set('Lua.completion.callSnippet', 'Disable') + +TEST [[ +GGG = 1 +GGG = function () +end + +GGG$ +]] +{ + { + label = 'GGG', + kind = define.CompletionItemKind.Enum, + }, + { + label = 'GGG()', + kind = define.CompletionItemKind.Function, + }, +} + +TEST [[ +---@class C +---@field GGG number +local t = {} + +t.GGG = function () +end + +t.GGG$ +]] +{ + { + label = 'GGG', + kind = define.CompletionItemKind.Field, + }, + { + label = 'GGG()', + kind = define.CompletionItemKind.Function, + }, +} + +TEST [[ +---@param f fun(a: any, b: any):boolean +local function f(f) end + +f(fun$) +]] +{ + { + label = 'fun(a: any, b: any):boolean', + kind = define.CompletionItemKind.Function, + textEdit = { + newText = 'function (${1:a}, ${2:b})\n\t$0\nend', + start = 68, + finish = 70, + } + }, + { + label = 'function', + kind = define.CompletionItemKind.Keyword, + }, + { + label = 'function ()', + kind = define.CompletionItemKind.Snippet, + } +} + +TEST [[ +---@type {[1]: number} +local t + +t.$ +]] +{ + { + label = '1', + kind = define.CompletionItemKind.Field, + textEdit = { + newText = '[1]', + start = 35, + finish = 34, + }, + additionalTextEdits = { + { + start = 34, + finish = 34, + newText = '', + }, + }, + } +} + +TEST [[ +---@type {[1]: number} +local t + +t.$ +]] +{ + { + label = '1', + kind = define.CompletionItemKind.Field, + textEdit = { + newText = '[1]', + start = 35, + finish = 34, + }, + additionalTextEdits = { + { + start = 34, + finish = 34, + newText = '', + }, + }, + } +} + +TEST [[ +---@alias enum '"aaa"'|'"bbb"' + +---@param x enum +---@return enum +local function f(x) +end + +local r = f('$') +]] +{ + { + label = "'aaa'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + newText = "'aaa'", + start = 103, + finish = 104, + }, + }, + { + label = "'bbb'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + newText = "'bbb'", + start = 103, + finish = 104, + }, + }, +} + +TEST [[ +---@type fun(x: "'aaa'"|"'bbb'") +local f + +f('$') +]] +{ + { + label = "'aaa'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + newText = "'aaa'", + start = 45, + finish = 46, + }, + }, + { + label = "'bbb'", + kind = define.CompletionItemKind.EnumMember, + textEdit = { + newText = "'bbb'", + start = 45, + finish = 46, + }, + }, +} + +TEST [[ +---@class Class +---@field on fun() +local c + +c:$ +]] +{ + { + label = 'on', + kind = define.CompletionItemKind.Field, + } +} + +TEST [[ +---@class Class +---@field on fun(x: "'aaa'"|"'bbb'") +local c + +c:on($) +]] +(EXISTS) + +TEST [[ +---@class Class +---@field on fun(x: "'aaa'"|"'bbb'") +local c + +c:on('$') +]] +(EXISTS) + +TEST [[ +local m = {} + +function m.f() +end + +m.f() +m.$ +]] +{ + [1] = EXISTS, +} diff --git a/test/completion/continue.lua b/test/completion/continue.lua new file mode 100644 index 00000000..4644c745 --- /dev/null +++ b/test/completion/continue.lua @@ -0,0 +1,32 @@ +local define = require 'proto.define' +local config = require 'config' + +config.set('Lua.completion.callSnippet', 'Disable') +config.set('Lua.completion.keywordSnippet', 'Disable') +config.set('Lua.completion.workspaceWord', false) + +ContinueTyping = true + +TEST [[ +local zabcde +za$ +]] +{ + { + label = 'zabcde', + kind = define.CompletionItemKind.Variable, + } +} + +TEST [[ +-- zabcde +io.z$ +]] +{ + { + label = 'zabcde', + kind = define.CompletionItemKind.Text, + } +} + +ContinueTyping = false diff --git a/test/completion/init.lua b/test/completion/init.lua index 3536007a..24c8932f 100644 --- a/test/completion/init.lua +++ b/test/completion/init.lua @@ -1,9 +1,7 @@ local core = require 'core.completion' local files = require 'files' -local define = require 'proto.define' -local config = require 'config' -local EXISTS = {'EXISTS'} +EXISTS = {'EXISTS'} local function eq(a, b) if a == EXISTS and b ~= nil then @@ -52,7 +50,7 @@ end rawset(_G, 'TEST', true) -local Cared = { +Cared = { ['label'] = true, ['kind'] = true, ['textEdit'] = true, @@ -60,7 +58,8 @@ local Cared = { ['deprecated'] = true, } -local IgnoreFunction = false +IgnoreFunction = false +ContinueTyping = false function TEST(script) return function (expect) @@ -70,7 +69,11 @@ function TEST(script) files.setText('', new_script) core.clearCache() - local triggerCharacter = script:sub(pos - 1, pos - 1) + if ContinueTyping then + local triggerCharacter = script:sub(pos - 1, pos - 1) + core.completion('', pos - 1, triggerCharacter) + end + local triggerCharacter = script:sub(pos, pos) local result = core.completion('', pos, triggerCharacter) if not expect then assert(result == nil) @@ -112,2662 +115,5 @@ function TEST(script) end end -config.set('Lua.completion.callSnippet', 'Both') -config.set('Lua.completion.keywordSnippet', 'Both') -config.set('Lua.completion.workspaceWord', false) - -TEST [[ -local zabcde -za$ -]] -{ - { - label = 'zabcde', - kind = define.CompletionItemKind.Variable, - } -} - -TEST [[ -local zabcdefg -local zabcde -zabcde$ -]] -{ - { - label = 'zabcde', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'zabcdefg', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST [[ -local zabcdefg -za$ -local zabcde -]] -{ - { - label = 'zabcdefg', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'zabcde', - kind = define.CompletionItemKind.Text, - }, -} - -TEST [[ -local zabcde -zace$ -]] -{ - { - label = 'zabcde', - kind = define.CompletionItemKind.Variable, - } -} - -TEST [[ -ZABC = x -local zabc -zac$ -]] -{ - { - label = 'zabc', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'ZABC', - kind = define.CompletionItemKind.Field, - }, -} - -TEST [[ -ass$ -]] -{ - { - label = 'assert(v, message)', - kind = define.CompletionItemKind.Function, - }, - { - label = 'assert(v, message)', - kind = define.CompletionItemKind.Snippet, - }, -} - -TEST [[ -local assert = 1 -ass$ -]] -{ - { - label = 'assert', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST [[ -local assert = 1 -_G.ass$ -]] -{ - { - label = 'assert(v, message)', - kind = define.CompletionItemKind.Function, - }, - { - label = 'assert(v, message)', - kind = define.CompletionItemKind.Snippet, - }, -} - -TEST [[ -local function ffff(a, b) -end -ff$ -]] -{ - { - label = 'ffff(a, b)', - kind = define.CompletionItemKind.Function, - }, - { - label = 'ffff(a, b)', - kind = define.CompletionItemKind.Snippet, - } -} - -TEST [[ -local zabc = 1 -z$ -]] -{ - { - label = 'zabc', - kind = define.CompletionItemKind.Variable, - } -} - -TEST [[ -local zabc = 1.0 -z$ -]] -{ - { - label = 'zabc', - kind = define.CompletionItemKind.Variable, - } -} - -TEST [[ -local t = { - abc = 1, -} -t.ab$ -]] -{ - { - label = 'abc', - kind = define.CompletionItemKind.Enum, - } -} - -TEST [[ -local t = { - abc = 1, -} -local n = t.abc -t.ab$ -]] -{ - { - label = 'abc', - kind = define.CompletionItemKind.Enum, - } -} - -TEST [[ -local mt = {} -mt.ggg = 1 -function mt:get(a, b) - return 1 -end -mt:g$ -]] -{ - { - label = 'get(a, b)', - kind = define.CompletionItemKind.Method, - }, - { - label = 'get(a, b)', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'ggg', - kind = define.CompletionItemKind.Text, - } -} - -TEST [[ -loc$ -]] -{ - { - label = 'local', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'local function', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'collectgarbage(opt, ...)', - kind = define.CompletionItemKind.Function, - }, - { - label = 'collectgarbage(opt, ...)', - kind = define.CompletionItemKind.Snippet, - }, -} - -IgnoreFunction = true -TEST [[ -do$ -]] -{ - { - label = 'do', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'do .. end', - kind = define.CompletionItemKind.Snippet, - }, -} - -TEST [[ -while true d$ -]] -{ - { - label = 'do', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'do .. end', - kind = define.CompletionItemKind.Snippet, - }, -} - -TEST [[ -results$ -]] -(nil) - -TEST [[ -result$ -local results -]] -(EXISTS) - -TEST [[ -local a$ - -local function f(fff) - fff = ast - fff = ast - fff = ast - fff = ast - fff = ast - fff = ast -end -]] -{ - { - label = 'ast', - kind = define.CompletionItemKind.Variable, - } -} - -TEST [[ -t.a = {} -t.b = {} -t.$ -]] -{ - { - label = 'a', - kind = define.CompletionItemKind.Field, - }, - { - label = 'b', - kind = define.CompletionItemKind.Field, - }, -} - -TEST [[ -t.a = {} -t.b = {} -t. $ -]] -{ - { - label = 'a', - kind = define.CompletionItemKind.Field, - }, - { - label = 'b', - kind = define.CompletionItemKind.Field, - }, -} - -IgnoreFunction = false -TEST [[ -t.a = {} -function t:b() -end -t:$ -]] -{ - { - label = 'b()', - kind = define.CompletionItemKind.Method, - }, - { - label = 'b()', - kind = define.CompletionItemKind.Snippet, - }, -} - -TEST [[ -local t = { - a = {}, -} -t.$ -xxx() -]] -{ - { - label = 'a', - kind = define.CompletionItemKind.Field, - }, -} - -TEST [[ -(''):$ -]] -(EXISTS) - -TEST [[ -local zzz - -return 'aa' .. zz$ -]] -{ - { - label = 'zzz', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST 'local s = "a:$"' (nil) - -TEST 'debug.$' -(EXISTS) - -IgnoreFunction = true -TEST [[ -local xxxx = { - xxyy = 1, - xxzz = 2, -} - -local t = { - x$ -} -]] -{ - { - label = 'xxxx', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'xxyy', - kind = define.CompletionItemKind.Property, - }, - { - label = 'xxzz', - kind = define.CompletionItemKind.Property, - }, -} - -TEST [[ -print(ff2) -local faa -local f$ -print(fff) -]] -{ - { - label = 'function', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'function ()', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'fff', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'ff2', - kind = define.CompletionItemKind.Text, - }, - { - label = 'faa', - kind = define.CompletionItemKind.Text, - }, -} - -TEST [[ -local function f(ff$) - print(fff) -end -]] -{ - { - label = 'fff', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST [[ -collectgarbage($) -]] -(EXISTS) - -TEST [[ -collectgarbage('$') -]] -{ - { - label = "'collect'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'collect'", - }, - }, - { - label = "'stop'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'stop'", - }, - }, - { - label = "'restart'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'restart'", - }, - }, - { - label = "'count'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'count'", - }, - }, - { - label = "'step'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'step'", - }, - }, - { - label = "'isrunning'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'isrunning'", - }, - }, - { - label = "'incremental'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'incremental'", - }, - }, - { - label = "'generational'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - start = 16, - finish = 17, - newText = "'generational'", - }, - }, -} - -TEST [[ -io.read($) -]] -{ - { - label = '"n"', - kind = define.CompletionItemKind.EnumMember, - }, - { - label = '"a"', - kind = define.CompletionItemKind.EnumMember, - }, - { - label = '"l"', - kind = define.CompletionItemKind.EnumMember, - }, - { - label = '"L"', - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ -io.open('', $) -]] -(EXISTS) - -TEST [[ -local function f(a, $) -end -]] -(nil) - -TEST [[ -self.results.list[#$] -]] -{ - { - label = '#self.results.list+1', - kind = define.CompletionItemKind.Snippet, - textEdit = { - start = 19, - finish = 20, - newText = '#self.results.list+1] = ', - }, - }, -} - -TEST [[ -self.results.list[#$] -local n = 1 -]] -{ - { - label = '#self.results.list+1', - kind = define.CompletionItemKind.Snippet, - textEdit = { - start = 19, - finish = 20, - newText = '#self.results.list+1] = ', - }, - }, -} - -TEST [[ -self.results.list[#$] = 1 -]] -{ - { - label = '#self.results.list+1', - kind = define.CompletionItemKind.Snippet, - textEdit = { - start = 19, - finish = 20, - newText = '#self.results.list+1]', - }, - }, -} - -TEST [[ -self.results.list[#self.re$] -]] -{ - { - label = '#self.results.list+1', - kind = define.CompletionItemKind.Snippet, - textEdit = { - start = 19, - finish = 27, - newText = '#self.results.list+1] = ', - }, - }, - { - label = 'results', - kind = define.CompletionItemKind.Field, - }, -} - -TEST [[ -fff[#ff$] -]] -{ - { - label = '#fff+1', - kind = define.CompletionItemKind.Snippet, - textEdit = { - start = 5, - finish = 8, - newText = '#fff+1] = ', - }, - }, - { - label = 'fff', - kind = define.CompletionItemKind.Text, - } -} - -TEST [[ -local _ = fff.kkk[#$] -]] -{ - { - label = '#fff.kkk', - kind = define.CompletionItemKind.Snippet, - textEdit = { - start = 19, - finish = 20, - newText = '#fff.kkk]', - }, - }, -} - -TEST [[ -fff.kkk[#$].yy -]] -{ - { - label = '#fff.kkk', - kind = define.CompletionItemKind.Snippet, - textEdit = { - start = 9, - finish = 10, - newText = '#fff.kkk]', - }, - }, -} - -TEST [[ -local t = { - a = 1, -} - -t . $ -]] -(EXISTS) - -TEST [[ -local t = { - a = 1, -} - -t . $ b -]] -(EXISTS) - -TEST [[ -local t = { - a = 1, -} - -t $ -]] -(nil) - -TEST [[ -local t = { - a = 1, -} - -t $. -]] -(nil) - -TEST [[ -local xxxx -xxxx$ -]] -{ - { - label = 'xxxx', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST [[ -local xxxx -local XXXX -xxxx$ -]] -{ - { - label = 'XXXX', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'xxxx', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST [[ -local t = { - xxxxx = 1, -} -xx$ -]] -{ - { - label = 'xxxxx', - kind = define.CompletionItemKind.Text, - }, -} - -TEST [[ -local index -tbl[inde$] -]] -{ - { - label = 'index', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST [[ -return function () - local t = { - a = {}, - b = {}, - } - t.$ -end -]] -{ - { - label = 'a', - kind = define.CompletionItemKind.Field, - }, - { - label = 'b', - kind = define.CompletionItemKind.Field, - }, -} - -TEST [[ -local ast = 1 -local t = 'as$' -local ask = 1 -]] -(EXISTS) - -TEST [[ -local add - -function f(ad$) - local _ = add -end -]] -{ - { - label = 'add', - kind = define.CompletionItemKind.Variable, - }, -} - -TEST [[ -function table.i$ -]] -(EXISTS) - -TEST [[ -do - xx.$ -end -]] -(nil) - -TEST [[ -print(io.$) -]] -(EXISTS) - -require 'config'.set('Lua.runtime.version', 'Lua 5.4') ---TEST [[ ---local $ ---]] ---{ --- { --- label = '<toclose>', --- kind = define.CompletionItemKind.Keyword, --- }, --- { --- label = '<const>', --- kind = define.CompletionItemKind.Keyword, --- }, ---} --- ---TEST [[ ---local <toc$ ---]] ---{ --- { --- label = '<toclose>', --- kind = define.CompletionItemKind.Keyword, --- } ---} - -TEST [[ -local mt = {} -mt.__index = mt -local t = setmetatable({}, mt) - -t.$ -]] -{ - { - label = '__index', - kind = define.CompletionItemKind.Field, - } -} - -TEST [[ -local elseaaa -ELSE = 1 -if a then -else$ -]] -{ - { - label = 'else', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'elseif', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'elseif .. then', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'elseaaa', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'ELSE', - kind = define.CompletionItemKind.Enum, - }, -} - -Cared['insertText'] = true -IgnoreFunction = false -TEST [[ -local xpcal -xpcal$ -]] -{ - { - label = 'xpcal', - kind = define.CompletionItemKind.Variable, - }, - { - label = 'xpcall(f, msgh, arg1, ...)', - kind = define.CompletionItemKind.Function, - insertText = EXISTS, - }, - { - label = 'xpcall(f, msgh, arg1, ...)', - kind = define.CompletionItemKind.Snippet, - insertText = EXISTS, - }, -} - -TEST [[ -function mt:f(a, b, c) -end - -mt:f$ -]] -{ - { - label = 'f(a, b, c)', - kind = define.CompletionItemKind.Method, - insertText = EXISTS, - }, - { - label = 'f(a, b, c)', - kind = define.CompletionItemKind.Snippet, - insertText = 'f(${1:a: any}, ${2:b: any}, ${3:c: any})', - }, -} - -TEST [[ -function$ -]] -{ - { - label = 'function', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'function ()', - kind = define.CompletionItemKind.Snippet, - insertText = "\z -function $1($2)\ -\t$0\ -end", - }, -} - -TEST [[ -local t = function$ -]] -{ - { - label = 'function', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'function ()', - kind = define.CompletionItemKind.Snippet, - insertText = "\z -function ($1)\ -\t$0\ -end", - }, -} -Cared['insertText'] = false -IgnoreFunction = true - -TEST [[ -local function f() - if a then - else$ -end -]] -{ - { - label = 'else', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'elseif', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'elseif .. then', - kind = define.CompletionItemKind.Snippet, - }, -} - -TEST [[ -local t = { - ['a.b.c'] = {} -} - -t.$ -]] -{ - { - label = 'a.b.c', - kind = define.CompletionItemKind.Field, - textEdit = { - start = 37, - finish = 36, - newText = '["a.b.c"]', - }, - additionalTextEdits = { - { - start = 36, - finish = 36, - newText = '', - }, - }, - } -} - -TEST [[ -local t = { - ['a.b.c'] = {} -} - -t. $ -]] -{ - { - label = 'a.b.c', - kind = define.CompletionItemKind.Field, - textEdit = { - start = 40, - finish = 39, - newText = '["a.b.c"]', - }, - additionalTextEdits = { - { - start = 36, - finish = 36, - newText = '', - }, - }, - } -} - -TEST [[ -local t = { - ['a.b.c'] = {} -} - -t['$'] -]] -{ - { - label = 'a.b.c', - kind = define.CompletionItemKind.Field, - textEdit = { - start = 38, - finish = 37, - newText = 'a.b.c', - } - } -} - -TEST [[ -_ENV['z.b.c'] = {} - -z$ -]] -{ - { - label = 'z.b.c', - kind = define.CompletionItemKind.Field, - textEdit = { - start = 21, - finish = 21, - newText = '_ENV["z.b.c"]', - }, - }, -} - -TEST [[ -io.close(1, $) -]] -(nil) - -TEST [[ -io$ -]] -(EXISTS) - -IgnoreFunction = false -TEST [[ -loadstring$ -]] -{ - { - label = 'loadstring(text, chunkname)', - kind = define.CompletionItemKind.Function, - deprecated = true, - }, - { - label = 'loadstring(text, chunkname)', - kind = define.CompletionItemKind.Snippet, - deprecated = true, - }, -} - ---TEST [[ ---bit32$ ---]] ---{ --- { --- label = 'bit32', --- kind = define.CompletionItemKind.Field, --- deprecated = true, --- }, ---} - -TEST [[ -function loadstring() -end -loadstring$ -]] -{ - { - label = 'loadstring()', - kind = define.CompletionItemKind.Function, - }, - { - label = 'loadstring()', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'loadstring(text, chunkname)', - deprecated = true, - kind = define.CompletionItemKind.Function, - }, - { - label = 'loadstring(text, chunkname)', - deprecated = true, - kind = define.CompletionItemKind.Snippet, - }, -} - -TEST [[ -debug.setcsta$ -]] -{ - { - label = 'setcstacklimit(limit)', - kind = define.CompletionItemKind.Function, - deprecated = true, - }, - { - label = 'setcstacklimit(limit)', - kind = define.CompletionItemKind.Snippet, - deprecated = true, - }, -} - -TEST [[ ----@$ -]] -(EXISTS) - -TEST [[ ----@cl$ -]] -{ - { - label = 'class', - kind = define.CompletionItemKind.Event - } -} - -TEST [[ ----@class ZABC ----@class ZBBC : Z$ -]] -{ - { - label = 'ZABC', - kind = define.CompletionItemKind.Class, - }, -} - -TEST [[ ----@class ZABC ----@class ZBBC : $ -]] -(EXISTS) - -TEST [[ ----@class zabc -local abcd ----@type za$ -]] -{ - { - label = 'zabc', - kind = define.CompletionItemKind.Class, - }, -} - -TEST [[ ----@class abc -local abcd ----@type $ -]] -(EXISTS) - -TEST [[ ----@class zabc -local abcd ----@type zxxx|z$ -]] -{ - { - label = 'zabc', - kind = define.CompletionItemKind.Class, - } -} - -TEST [[ ----@alias zabc zabb ----@type za$ -]] -{ - { - label = 'zabc', - kind = define.CompletionItemKind.Class, - }, -} - -TEST [[ ----@class ZClass ----@param x ZC$ -]] -{ - { - label = 'ZClass', - kind = define.CompletionItemKind.Class, - }, -} - -Cared['insertText'] = true -TEST [[ ----@param $ -function f(a, b, c) -end -]] -{ - { - label = 'a, b, c', - kind = define.CompletionItemKind.Snippet, - insertText = [[ -a ${1:any} ----@param b ${2:any} ----@param c ${3:any}]] - }, - { - label = 'a', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'b', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'c', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ ----@param $ -function f(a, b, c) end - -function f2(a) end -]] -{ - { - label = 'a, b, c', - kind = define.CompletionItemKind.Snippet, - insertText = [[ -a ${1:any} ----@param b ${2:any} ----@param c ${3:any}]] - }, - { - label = 'a', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'b', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'c', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ ----@param aa$ -function f(aaa, bbb, ccc) -end -]] -{ - { - label = 'aaa', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ -local function f() - ---@param $ - function f(a, b, c) - end -end -]] -{ - { - label = 'a, b, c', - kind = define.CompletionItemKind.Snippet, - insertText = [[ -a ${1:any} ----@param b ${2:any} ----@param c ${3:any}]] - }, - { - label = 'a', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'b', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'c', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ ----@param $ -function mt:f(a, b, c, ...) -end -]] -{ - { - label = 'a, b, c', - kind = define.CompletionItemKind.Snippet, - insertText = [[ -a ${1:any} ----@param b ${2:any} ----@param c ${3:any}]], - }, - { - label = 'self', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'a', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'b', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'c', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ ----@param aaa $ -function f(aaa, bbb, ccc) -end -]] -(EXISTS) - -TEST [[ ----@param xyz Class ----@param xxx Class -function f(x$) -]] -{ - { - label = 'xyz, xxx', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'xyz', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'xxx', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ ----@param xyz Class ----@param xxx Class -function f($ -]] -{ - { - label = 'xyz, xxx', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'xyz', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'xxx', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ ----@param xyz Class ----@param xxx Class -function f($) -]] -{ - { - label = 'xyz, xxx', - kind = define.CompletionItemKind.Snippet, - }, - { - label = 'xyz', - kind = define.CompletionItemKind.Interface, - }, - { - label = 'xxx', - kind = define.CompletionItemKind.Interface, - }, -} - -TEST [[ -local function f() - ---@t$ -end -]] -{ - { - label = 'type', - kind = define.CompletionItemKind.Event, - }, - { - label = 'return', - kind = define.CompletionItemKind.Event, - }, - { - label = 'deprecated', - kind = define.CompletionItemKind.Event, - }, - { - label = 'meta', - kind = define.CompletionItemKind.Event, - }, - { - label = 'diagnostic', - kind = define.CompletionItemKind.Event, - } -} - -TEST [[ ----@class Class ----@field name string ----@field id integer -local mt = {} -mt.$ -]] -{ - { - label = 'id', - kind = define.CompletionItemKind.Field, - }, - { - label = 'name', - kind = define.CompletionItemKind.Field, - }, -} - -TEST [[ ----@param x string | "'AAA'" | "'BBB'" | "'CCC'" -function f(y, x) -end - -f(1, $) -]] -{ - { - label = "'AAA'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'BBB'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'CCC'", - kind = define.CompletionItemKind.EnumMember, - } -} - -TEST [[ ----@param x string | "'AAA'" | "'BBB'" | "'CCC'" -function f(y, x) -end - -f(1,$) -]] -{ - { - label = "'AAA'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'BBB'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'CCC'", - kind = define.CompletionItemKind.EnumMember, - } -} - -TEST [[ ----@param x string | "'AAA'" | "'BBB'" | "'CCC'" -function f(x) -end - -f($) -]] -{ - { - label = "'AAA'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'BBB'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'CCC'", - kind = define.CompletionItemKind.EnumMember, - } -} - -TEST [[ ----@alias Option string | "'AAA'" | "'BBB'" | "'CCC'" ----@param x Option -function f(x) -end - -f($) -]] -{ - { - label = "'AAA'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'BBB'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'CCC'", - kind = define.CompletionItemKind.EnumMember, - } -} - -TEST [[ ----@param x string | "'AAA'" | "'BBB'" | "'CCC'" -function f(x) -end - -f('$') -]] -{ - { - label = "'AAA'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, - { - label = "'BBB'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, - { - label = "'CCC'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - } -} - -TEST [[ ----this is ----a multi line ----comment ----@alias XXXX ----comment 1 ----comment 1 ----| '1' ----comment 2 ----comment 2 ----| '2' - ----@param x XXXX -local function f(x) -end - -f($) -]] -{ - { - label = '1', - kind = define.CompletionItemKind.EnumMember, - }, - { - label = '2', - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ ----this is ----a multi line ----comment ----@alias XXXX ----comment 1 ----comment 1 ----| '1' ----comment 2 ----comment 2 ----| '2' ----@param x XXXX -local function f(x) -end - - ----comment 3 ----comment 3 ----| '3' - -f($) -]] -{ - { - label = '1', - kind = define.CompletionItemKind.EnumMember, - }, - { - label = '2', - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ ----@param x function | 'function () end' -function f(x) -end - -f(function () - $ -end) -]] -(nil) - -TEST [[ ---- JustTest ----@param list table ----@param sep string ----@param i number ----@param j number ----@return string -local function zzzzz(list, sep, i, j) end - -zzz$ -]] -{ - { - label = 'zzzzz(list, sep, i, j)', - kind = define.CompletionItemKind.Function, - insertText = EXISTS, - }, - { - label = 'zzzzz(list, sep, i, j)', - kind = define.CompletionItemKind.Snippet, - insertText = EXISTS, - } -} - -Cared['detail'] = true -Cared['description'] = true -TEST [[ ---- abc -zzz = 1 -zz$ -]] -{ - { - label = 'zzz', - kind = define.CompletionItemKind.Enum, - detail = 'integer = 1', - description = [[ -```lua -global zzz: integer = 1 -``` - ---- - abc]], - } -} - -TEST [[ ----@param x string ----| "'选项1'" # 注释1 ----| "'选项2'" # 注释2 -function f(x) end - -f($) -]] -{ - { - label = "'选项1'", - kind = define.CompletionItemKind.EnumMember, - description = '注释1', - }, - { - label = "'选项2'", - kind = define.CompletionItemKind.EnumMember, - description = '注释2', - }, -} - -TEST [[ -utf8.charpatter$ -]] -{ - { - label = 'charpattern', - detail = 'string', - kind = define.CompletionItemKind.Field, - description = EXISTS, - } -} - -TEST [[ ----@type "'a'"|"'b'"|"'c'" -local x - -print(x == $) -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ ----@type "'a'"|"'b'"|"'c'" -local x - -x = $ -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ ----@type "'a'"|"'b'"|"'c'" -local x - -print(x == '$') -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, -} - -TEST [[ ----@type "'a'"|"'b'"|"'c'" -local x - -x = '$' -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - textEdit = EXISTS, - }, -} - -TEST [[ -local t = type() - -print(t == $) -]] -(EXISTS) - -TEST [[ -if type(arg) == '$' -]] -(EXISTS) - -TEST [[ -if type(arg) == $ -]] -(EXISTS) - -TEST [[ ----@type string -local s -s.$ -]] -(EXISTS) - -TEST [[ ----@class C -local t - -local vvv = assert(t) -vvv$ -]] -{ - { - label = 'vvv', - detail = 'C', - kind = define.CompletionItemKind.Variable, - description = EXISTS, - }, -} - -Cared['insertText'] = true -TEST [[ ----@param callback fun(x: number, y: number):string -local function f(callback) end - -f($) -]] -{ - { - label = 'fun(x: number, y: number):string', - kind = define.CompletionItemKind.Function, - insertText = "\z -function (${1:x}, ${2:y})\ -\t$0\ -end", - }, -} - -TEST [[ ----$ -local function f(a, b, c) - return a + 1, b .. '', c[1] -end -]] -{ - { - label = '@param;@return', - kind = define.CompletionItemKind.Snippet, - insertText = "\z -${1:comment}\ ----@param a ${2:number}\ ----@param b ${3:string}\ ----@param c ${4:table}\ ----@return ${5:number}\ ----@return ${6:string}\ ----@return ${7:any}", - }, -} - -Cared['insertText'] = nil - -TEST [[ ---$ -]] -{ - { - label = '#region', - kind = define.CompletionItemKind.Snippet, - }, - { - label = '#endregion', - kind = define.CompletionItemKind.Snippet, - } -} - -Cared['description'] = nil -Cared['detail'] = nil -TEST [[ ----@class cc ----@field aaa number # a1 ----@field bbb number # a2 - ----@param x cc -local function f(x) end - -f({ - $ -}) -]] -{ - { - label = 'aaa', - kind = define.CompletionItemKind.Property, - }, - { - label = 'bbb', - kind = define.CompletionItemKind.Property, - }, -} - -TEST [[ ----@class cc ----@field aaa number # a1 ----@field bbb number # a2 - ----@param x cc -local function f(x) end - -f({ - aaa = 1, - $ -}) -]] -{ - { - label = 'bbb', - kind = define.CompletionItemKind.Property, - }, -} - -TEST [[ ----@class cc ----@field aaa number # a1 ----@field bbb number # a2 - ----@param x cc -local function f(x) end - -f({aaa = 1,$}) -]] -{ - { - label = 'bbb', - kind = define.CompletionItemKind.Property, - }, -} - -TEST [[ ----@class cc ----@field aaa number # a1 ----@field bbb number # a2 - ----@param x cc -local function f(x) end - -f({aaa $}) -]] -(nil) - -TEST [[ ----@class cc ----@field iffff number # a1 - ----@param x cc -local function f(x) end - -f({if$}) -]] -{ - include = true, - { - label = 'iffff', - kind = define.CompletionItemKind.Property, - }, -} - -TEST [[ ----@class cc ----@field aaa number # a1 ----@field bbb number # a2 - ----@param x cc -local function f(x) end - -f({ - { - $ - } -}) -]] -(nil) - -TEST [[ ----@return string -local function f() end - -local s = f() - -s.$ -]] -(EXISTS) - -Cared['description'] = true -TEST [[ ----@class cc ----@field aaa number ----@field bbb number - ----@type cc -local t -print(t.aa$) -]] -{ - { - label = 'aaa', - kind = define.CompletionItemKind.Field, - description = [[ -```lua -field cc.aaa: number -```]] - }, -} -Cared['description'] = nil - -TEST [[ ----@type table<string, "'a'"|"'b'"|"'c'"> -local x - -x.a = $ -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ ----@type table<string, "'a'"|"'b'"|"'c'"> -local x - -x['a'] = $ -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ ----@type table<string, "'a'"|"'b'"|"'c'"> -local x = { - a = $ -} -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - }, -} - -TEST [[ ----@type table<string, "'a'"|"'b'"|"'c'"> -local x = { - ['a'] = $ -} -]] -{ - { - label = "'a'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'b'", - kind = define.CompletionItemKind.EnumMember, - }, - { - label = "'c'", - kind = define.CompletionItemKind.EnumMember, - }, -} - -Cared['insertText'] = true -TEST [[ ----@class A.B.C -local m - -function m.f() -end - -m.f$ -]]{ - { - label = "f()", - kind = define.CompletionItemKind.Function, - insertText = EXISTS, - }, - { - label = "f()", - kind = define.CompletionItemKind.Snippet, - insertText = 'f()', - }, -} -Cared['insertText'] = nil - -TEST [[ -if true then$ -]] -{ - { - label = 'then', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'then .. end', - kind = define.CompletionItemKind.Snippet, - } -} - -TEST [[ -if true then$ -end -]] -{ - { - label = 'then', - kind = define.CompletionItemKind.Keyword, - }, -} - -TEST [[ -if true then$ -else -]] -{ - { - label = 'then', - kind = define.CompletionItemKind.Keyword, - }, -} - -TEST [[ -if true then$ -elseif -]] -{ - { - label = 'then', - kind = define.CompletionItemKind.Keyword, - }, -} - -TEST [[ -do - if true then$ -end -]] -{ - { - label = 'then', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'then .. end', - kind = define.CompletionItemKind.Snippet, - } -} - -TEST [[ ----@class C ----@field x number ----@field y number - ----@vararg C -local function f(x, ...) -end - -f(1, { - $ -}) -]] -{ - { - label = 'x', - kind = define.CompletionItemKind.Property, - }, - { - label = 'y', - kind = define.CompletionItemKind.Property, - } -} - -TEST [[ ----@class C ----@field x number ----@field y number - ----@vararg C -local function f(x, ...) -end - -f(1, {}, {}, { - $ -}) -]] -{ - { - label = 'x', - kind = define.CompletionItemKind.Property, - }, - { - label = 'y', - kind = define.CompletionItemKind.Property, - } -} - -TEST [[ ----@class C ----@field x number ----@field y number - ----@type C -local t = { - $ -} - -]] -{ - { - label = 'x', - kind = define.CompletionItemKind.Property, - }, - { - label = 'y', - kind = define.CompletionItemKind.Property, - } -} - -TEST [[ ----@class C ----@field x number ----@field y number - ----@type C -local t = { - x$ -} - -]] -{ - include = true, - { - label = 'x', - kind = define.CompletionItemKind.Property, - }, -} - -TEST [[ -if $ then -]] -(nil) - -TEST [[ -elseif $ then -]] -(nil) - -TEST [[ ----@type iolib -local t = { - $ -]] -(EXISTS) - -TEST [[ ----@class A ----@field a '"hello"'|'"world"' - ----@param t A -function api(t) end - -api({$}) -]] -(EXISTS) - -TEST [[ ----@class A ----@field a '"hello"'|'"world"' - ----@param t A -function m:api(t) end - -m:api({$}) -]] -(EXISTS) - -TEST [[ ----@class AAA.BBB - ----@type AAA.$ -]] -{ - { - label = 'AAA.BBB', - kind = define.CompletionItemKind.Class, - textEdit = { - start = 29, - finish = 32, - newText = 'AAA.BBB', - }, - } -} - -Cared['insertText'] = true -TEST [[ ----@overload fun(a: any, b: any) -local function zzzz(a) end -zzzz$ -]] -{ - { - label = 'zzzz(a)', - kind = define.CompletionItemKind.Function, - insertText = 'zzzz', - }, - { - label = 'zzzz(a)', - kind = define.CompletionItemKind.Snippet, - insertText = 'zzzz(${1:a: any})', - }, - { - label = 'zzzz(a, b)', - kind = define.CompletionItemKind.Function, - insertText = 'zzzz', - }, - { - label = 'zzzz(a, b)', - kind = define.CompletionItemKind.Snippet, - insertText = 'zzzz(${1:a: any}, ${2:b: any})', - }, -} -Cared['insertText'] = false - -TEST [[ ---- @diagnostic disable: unused-local ---- @class Test2 ---- @field world integer -local Test2 = {} - ---- @type Test2 -local tdirect ---- @type Test2[] -local tarray - --- Direct inference -local b = tdirect -- type . here, shows "world" - --- Inferred by index -local c = tarray[1].$ -- type . here, no auto completion -]] -(EXISTS) - -TEST [[ -local function f() - if type() == '$' then - end -end -]] -(EXISTS) - -config.set('Lua.completion.callSnippet', 'Disable') - -TEST [[ -GGG = 1 -GGG = function () -end - -GGG$ -]] -{ - { - label = 'GGG', - kind = define.CompletionItemKind.Enum, - }, - { - label = 'GGG()', - kind = define.CompletionItemKind.Function, - }, -} - -TEST [[ ----@class C ----@field GGG number -local t = {} - -t.GGG = function () -end - -t.GGG$ -]] -{ - { - label = 'GGG', - kind = define.CompletionItemKind.Field, - }, - { - label = 'GGG()', - kind = define.CompletionItemKind.Function, - }, -} - -TEST [[ ----@param f fun(a: any, b: any):boolean -local function f(f) end - -f(fun$) -]] -{ - { - label = 'fun(a: any, b: any):boolean', - kind = define.CompletionItemKind.Function, - textEdit = { - newText = 'function (${1:a}, ${2:b})\n\t$0\nend', - start = 68, - finish = 70, - } - }, - { - label = 'function', - kind = define.CompletionItemKind.Keyword, - }, - { - label = 'function ()', - kind = define.CompletionItemKind.Snippet, - } -} - -TEST [[ ----@type {[1]: number} -local t - -t.$ -]] -{ - { - label = '1', - kind = define.CompletionItemKind.Field, - textEdit = { - newText = '[1]', - start = 35, - finish = 34, - }, - additionalTextEdits = { - { - start = 34, - finish = 34, - newText = '', - }, - }, - } -} - -TEST [[ ----@type {[1]: number} -local t - -t.$ -]] -{ - { - label = '1', - kind = define.CompletionItemKind.Field, - textEdit = { - newText = '[1]', - start = 35, - finish = 34, - }, - additionalTextEdits = { - { - start = 34, - finish = 34, - newText = '', - }, - }, - } -} - -TEST [[ ----@alias enum '"aaa"'|'"bbb"' - ----@param x enum ----@return enum -local function f(x) -end - -local r = f('$') -]] -{ - { - label = "'aaa'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - newText = "'aaa'", - start = 103, - finish = 104, - }, - }, - { - label = "'bbb'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - newText = "'bbb'", - start = 103, - finish = 104, - }, - }, -} - -TEST [[ ----@type fun(x: "'aaa'"|"'bbb'") -local f - -f('$') -]] -{ - { - label = "'aaa'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - newText = "'aaa'", - start = 45, - finish = 46, - }, - }, - { - label = "'bbb'", - kind = define.CompletionItemKind.EnumMember, - textEdit = { - newText = "'bbb'", - start = 45, - finish = 46, - }, - }, -} - -TEST [[ ----@class Class ----@field on fun() -local c - -c:$ -]] -{ - { - label = 'on', - kind = define.CompletionItemKind.Field, - } -} - -TEST [[ ----@class Class ----@field on fun(x: "'aaa'"|"'bbb'") -local c - -c:on($) -]] -(EXISTS) - -TEST [[ ----@class Class ----@field on fun(x: "'aaa'"|"'bbb'") -local c - -c:on('$') -]] -(EXISTS) - -TEST [[ -local m = {} - -function m.f() -end - -m.f() -m.$ -]] -{ - [1] = EXISTS, -} +require 'completion.common' +require 'completion.continue' |