summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changelog.md1
-rw-r--r--script/core/matchkey.lua76
-rw-r--r--test/completion/common.lua25
3 files changed, 63 insertions, 39 deletions
diff --git a/changelog.md b/changelog.md
index f5f9eac0..16c31605 100644
--- a/changelog.md
+++ b/changelog.md
@@ -14,6 +14,7 @@
* `CHG` only search first file by `require`
* `CHG` no longer ignore file names case in Windows
* `CHG` watching library changes
+* `CHG` completion: improve misspelling results
* `FIX` runtime errors
* `FIX` hint: may show param-2 as `self`
diff --git a/script/core/matchkey.lua b/script/core/matchkey.lua
index 83977496..eb67dac6 100644
--- a/script/core/matchkey.lua
+++ b/script/core/matchkey.lua
@@ -1,25 +1,44 @@
+local lowers = {}
+local uppers = {}
+for c in ('abcdefghijklmnopqrstuvwxyz'):gmatch '.' do
+ lowers[c] = true
+ uppers[c:upper()] = true
+end
+
---@param input string
---@param other string
----@param fast boolean
----@return boolean isMatch
----@return number deviation
-return function (input, other, fast)
- if input == other then
- return true, 0
+local function isValidFirstChar(input, other)
+ local first = input:sub(1, 1):upper()
+ if first == other:sub(1, 1):upper() then
+ return true
end
- if input == '' then
- return true, 0
+ local pos, char = other:find(first, 2, true)
+ if not pos and uppers[first] then
+ -- word after symbol?
+ if other:find('%A' .. first:lower(), 2) then
+ return true
+ end
end
- if #input > #other then
- return false, 0
+ if not char then
+ return false
+ end
+ -- symbol?
+ if not uppers[char] then
+ return true
+ end
+ -- word boundary?
+ local beforeChar = other:sub(pos - 1, pos - 1)
+ if not uppers[beforeChar] then
+ return true
end
+ return false
+end
+
+local function isAlmostSame(input, other)
local lMe = input:lower()
local lOther = other:lower()
if lMe == lOther:sub(1, #lMe) then
- return true, 0
- end
- if fast and input:sub(1, 1) ~= other:sub(1, 1) then
- return false, 0
+ return true
end
local chars = {}
for i = 1, #lOther do
@@ -31,8 +50,35 @@ return function (input, other, fast)
if chars[c] and chars[c] > 0 then
chars[c] = chars[c] - 1
else
- return false, 0
+ return false
end
end
+ return true
+end
+
+---@param input string
+---@param other string
+---@param fast boolean
+---@return boolean isMatch
+---@return number deviation
+return function (input, other, fast)
+ if input == other then
+ return true, 0
+ end
+ if input == '' then
+ return true, 0
+ end
+ if #input > #other then
+ return false, 0
+ end
+ if fast and input:sub(1, 1) ~= other:sub(1, 1) then
+ return false, 0
+ end
+ if not isValidFirstChar(input, other) then
+ return false, 0
+ end
+ if not isAlmostSame(input, other) then
+ return false, 0
+ end
return true, 1
end
diff --git a/test/completion/common.lua b/test/completion/common.lua
index f2bbe542..b3a2a36a 100644
--- a/test/completion/common.lua
+++ b/test/completion/common.lua
@@ -4,6 +4,7 @@ local config = require 'config'
config.set('Lua.completion.callSnippet', 'Both')
config.set('Lua.completion.keywordSnippet', 'Both')
config.set('Lua.completion.workspaceWord', false)
+config.set('Lua.completion.showWord', 'Enable')
TEST [[
local zabcde
@@ -215,14 +216,6 @@ loc$
label = 'local function',
kind = define.CompletionItemKind.Snippet,
},
- {
- label = 'collectgarbage(opt, ...)',
- kind = define.CompletionItemKind.Function,
- },
- {
- label = 'collectgarbage(opt, ...)',
- kind = define.CompletionItemKind.Snippet,
- },
}
IgnoreFunction = true
@@ -1443,22 +1436,6 @@ 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 [[