summaryrefslogtreecommitdiff
path: root/server-beta/src
diff options
context:
space:
mode:
Diffstat (limited to 'server-beta/src')
-rw-r--r--server-beta/src/core/highlight.lua44
-rw-r--r--server-beta/src/proto/define.lua6
-rw-r--r--server-beta/src/provider/capability.lua2
-rw-r--r--server-beta/src/provider/init.lua23
4 files changed, 66 insertions, 9 deletions
diff --git a/server-beta/src/core/highlight.lua b/server-beta/src/core/highlight.lua
index 1516187e..16c82a16 100644
--- a/server-beta/src/core/highlight.lua
+++ b/server-beta/src/core/highlight.lua
@@ -1,6 +1,7 @@
local guide = require 'parser.guide'
local files = require 'files'
local searcher = require 'searcher'
+local define = require 'proto.define'
local function ofLocal(source, callback)
callback(source)
@@ -54,8 +55,10 @@ local function find(source, uri, callback)
elseif source.type == 'field'
or source.type == 'method' then
ofField(source, uri, callback)
- elseif source.type == 'string'
- or source.type == 'boolean'
+ elseif source.type == 'string' then
+ ofIndex(source, uri, callback)
+ callback(source)
+ elseif source.type == 'boolean'
or source.type == 'number' then
ofIndex(source, uri, callback)
elseif source.type == 'goto'
@@ -73,17 +76,41 @@ return function (uri, offset)
local mark = {}
guide.eachSourceContain(ast.ast, offset, function (source)
find(source, uri, function (target)
- if target.type == 'getfield'
- or target.type == 'setfield'
+ local kind
+ if target.type == 'getfield' then
+ target = target.field
+ kind = define.DocumentHighlightKind.Read
+ elseif target.type == 'setfield'
or target.type == 'tablefield' then
target = target.field
- elseif target.type == 'getmethod'
- or target.type == 'setmethod' then
+ kind = define.DocumentHighlightKind.Write
+ elseif target.type == 'getmethod' then
+ target = target.method
+ kind = define.DocumentHighlightKind.Read
+ elseif target.type == 'setmethod' then
target = target.method
- elseif target.type == 'getindex'
- or target.type == 'setindex'
+ kind = define.DocumentHighlightKind.Write
+ elseif target.type == 'getindex' then
+ target = target.index
+ kind = define.DocumentHighlightKind.Read
+ elseif target.type == 'setindex'
or target.type == 'tableindex' then
target = target.index
+ kind = define.DocumentHighlightKind.Write
+ elseif target.type == 'getlocal'
+ or target.type == 'getglobal'
+ or target.type == 'goto' then
+ kind = define.DocumentHighlightKind.Read
+ elseif target.type == 'setlocal'
+ or target.type == 'local'
+ or target.type == 'setglobal'
+ or target.type == 'label' then
+ kind = define.DocumentHighlightKind.Write
+ elseif target.type == 'string' then
+ kind = define.DocumentHighlightKind.Text
+ else
+ log.warn('Unknow target.type:', target.type)
+ return
end
if mark[target] then
return
@@ -92,6 +119,7 @@ return function (uri, offset)
results[#results+1] = {
start = target.start,
finish = target.finish,
+ kind = kind,
}
end)
end)
diff --git a/server-beta/src/proto/define.lua b/server-beta/src/proto/define.lua
index 9a890e2e..3771c726 100644
--- a/server-beta/src/proto/define.lua
+++ b/server-beta/src/proto/define.lua
@@ -114,4 +114,10 @@ m.DiagnosticTag = {
Deprecated = 2,
}
+m.DocumentHighlightKind = {
+ Text = 1,
+ Read = 2,
+ Write = 3,
+}
+
return m
diff --git a/server-beta/src/provider/capability.lua b/server-beta/src/provider/capability.lua
index c5762f0b..5cefd0c5 100644
--- a/server-beta/src/provider/capability.lua
+++ b/server-beta/src/provider/capability.lua
@@ -14,7 +14,7 @@ m.initer = {
referencesProvider = true,
--renameProvider = true,
--documentSymbolProvider = true,
- --documentHighlightProvider = true,
+ documentHighlightProvider = true,
--codeActionProvider = true,
--signatureHelpProvider = {
-- triggerCharacters = { '(', ',' },
diff --git a/server-beta/src/provider/init.lua b/server-beta/src/provider/init.lua
index 5e1a1a2a..0a70763e 100644
--- a/server-beta/src/provider/init.lua
+++ b/server-beta/src/provider/init.lua
@@ -207,6 +207,29 @@ proto.on('textDocument/references', function (params)
return response
end)
+proto.on('textDocument/documentHighlight', function (params)
+ local core = require 'core.highlight'
+ local uri = params.textDocument.uri
+ if not files.exists(uri) then
+ return nil
+ end
+ local lines = files.getLines(uri)
+ local text = files.getText(uri)
+ local offset = define.offset(lines, text, params.position)
+ local result = core(uri, offset)
+ if not result then
+ return nil
+ end
+ local response = {}
+ for _, info in ipairs(result) do
+ response[#response+1] = {
+ range = define.range(lines, text, info.start, info.finish),
+ kind = info.kind,
+ }
+ end
+ return response
+end)
+
proto.on('textDocument/completion', function (params)
--log.info(util.dump(params))
return nil