summaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2021-11-24 15:47:34 +0800
committer最萌小汐 <sumneko@hotmail.com>2021-11-24 15:47:34 +0800
commit75958614871dc316759f826d0f82b26442bbc03b (patch)
tree27c24f843a23ada283cc5bd9ef3c2ff07ae1f58c /script
parent90d2f4190567891a2497cee80186657d416b19b0 (diff)
downloadlua-language-server-75958614871dc316759f826d0f82b26442bbc03b.zip
resolve #655
Diffstat (limited to 'script')
-rw-r--r--script/config/config.lua1
-rw-r--r--script/core/completion/completion.lua19
-rw-r--r--script/core/completion/postfix.lua9
-rw-r--r--script/parser/guide.lua10
-rw-r--r--script/provider/completion.lua13
5 files changed, 36 insertions, 16 deletions
diff --git a/script/config/config.lua b/script/config/config.lua
index 2788cda7..2feb9868 100644
--- a/script/config/config.lua
+++ b/script/config/config.lua
@@ -187,6 +187,7 @@ local Template = {
['Lua.completion.autoRequire'] = Type.Boolean >> true,
['Lua.completion.showParams'] = Type.Boolean >> true,
['Lua.completion.requireSeparator'] = Type.String >> '.',
+ ['Lua.completion.postfix'] = Type.String >> '@',
['Lua.signatureHelp.enable'] = Type.Boolean >> true,
['Lua.hover.enable'] = Type.Boolean >> true,
['Lua.hover.viewString'] = Type.Boolean >> true,
diff --git a/script/core/completion/completion.lua b/script/core/completion/completion.lua
index a766cccc..dadc46ca 100644
--- a/script/core/completion/completion.lua
+++ b/script/core/completion/completion.lua
@@ -718,15 +718,6 @@ local function checkCommon(state, word, position, results)
end
end
-local function isInString(state, position)
- return guide.eachSourceContain(state.ast, position, function (source)
- if source.type == 'string'
- and source.start < position then
- return true
- end
- end)
-end
-
local function checkKeyWord(state, start, position, word, hasSpace, afterLocal, results)
local text = state.lua
local snipType = config.get 'Lua.completion.keywordSnippet'
@@ -1204,7 +1195,7 @@ local function isFuncArg(state, position)
end
local function trySpecial(state, position, results)
- if isInString(state, position) then
+ if guide.isInString(state.ast, position) then
checkUri(state, position, results)
checkEqualEnumInString(state, position, results)
return
@@ -1238,7 +1229,7 @@ local function tryWord(state, position, triggerCharacter, results)
startPos = guide.offsetToPosition(state, start - 1)
end
local hasSpace = triggerCharacter ~= nil and finish ~= offset
- if isInString(state, position) then
+ if guide.isInString(state.ast, position) then
if not hasSpace then
if #results == 0 then
checkCommon(state, word, position, results)
@@ -1284,7 +1275,7 @@ local function trySymbol(state, position, results)
if not symbol then
return nil
end
- if isInString(state, position) then
+ if guide.isInString(state.ast, position) then
return nil
end
local startPos = guide.offsetToPosition(state, start)
@@ -2045,9 +2036,7 @@ local function tryCompletions(state, position, triggerCharacter, results)
tryComment(state, position, results)
return
end
- if postfix(state, position, results) then
- return
- end
+ postfix(state, position, results)
trySpecial(state, position, results)
tryCallArg(state, position, results)
tryTable(state, position, results)
diff --git a/script/core/completion/postfix.lua b/script/core/completion/postfix.lua
index a04b5e65..a47ff070 100644
--- a/script/core/completion/postfix.lua
+++ b/script/core/completion/postfix.lua
@@ -4,6 +4,7 @@ local matchKey = require 'core.matchkey'
local subString = require 'core.substring'
local define = require 'proto.define'
local markdown = require 'provider.markdown'
+local config = require 'config'
local actions = {}
@@ -148,6 +149,9 @@ local function checkPostFix(state, word, wordPosition, position, results)
return source
end
end)
+ if not source then
+ return
+ end
for _, action in ipairs(actions) do
if matchKey(word, action.key) then
action.data[1](state, source, function (newText)
@@ -176,6 +180,9 @@ local function checkPostFix(state, word, wordPosition, position, results)
end
return function (state, position, results)
+ if guide.isInString(state.ast, position) then
+ return false
+ end
local text = state.lua
local offset = guide.positionToOffset(state, position)
local word, newOffset = lookback.findWord(text, offset)
@@ -183,7 +190,7 @@ return function (state, position, results)
offset = newOffset - 1
end
local symbol = text:sub(offset, offset)
- if symbol == '@' then
+ if symbol == config.get 'Lua.completion.postfix' then
local wordPosition = guide.offsetToPosition(state, offset - 1)
checkPostFix(state, word or '', wordPosition, position, results)
return true
diff --git a/script/parser/guide.lua b/script/parser/guide.lua
index b6cce241..54e61e7f 100644
--- a/script/parser/guide.lua
+++ b/script/parser/guide.lua
@@ -1151,4 +1151,14 @@ function m.isGlobal(source)
return false
end
+function m.isInString(ast, position)
+ return m.eachSourceContain(ast, position, function (source)
+ if source.type == 'string'
+ and source.start < position then
+ return true
+ end
+ end)
+end
+
+
return m
diff --git a/script/provider/completion.lua b/script/provider/completion.lua
index f1698249..12b1f676 100644
--- a/script/provider/completion.lua
+++ b/script/provider/completion.lua
@@ -7,9 +7,16 @@ local isEnable = false
local function allWords()
local str = '\t\n.:(\'"[,#*@|=-{/\\ '
+ local mark = {}
local list = {}
for c in str:gmatch '.' do
list[#list+1] = c
+ mark[c] = true
+ end
+ local postfix = config.get 'Lua.completion.postfix'
+ if postfix ~= '' and not mark[postfix] then
+ list[#list+1] = postfix
+ mark[postfix] = true
end
return list
end
@@ -68,6 +75,12 @@ config.watch(function (key, value)
disable()
end
end
+ if key == 'Lua.completion.postfix' then
+ if config.get 'Lua.completion.enable' then
+ disable()
+ enable()
+ end
+ end
end)
return {