summaryrefslogtreecommitdiff
path: root/script-beta/provider
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2020-11-02 20:51:42 +0800
committer最萌小汐 <sumneko@hotmail.com>2020-11-02 20:51:42 +0800
commitd2555c83e1e4338f52a740cbd163fed043219888 (patch)
tree1fa03cf6ae92594d2fbb7cf9ce11ad2e40612da8 /script-beta/provider
parentededf909f340f582195ba2f88b85787fa3142be1 (diff)
downloadlua-language-server-d2555c83e1e4338f52a740cbd163fed043219888.zip
分步给出诊断结果
Diffstat (limited to 'script-beta/provider')
-rw-r--r--script-beta/provider/diagnostic.lua83
1 files changed, 56 insertions, 27 deletions
diff --git a/script-beta/provider/diagnostic.lua b/script-beta/provider/diagnostic.lua
index b33bd933..c53f4635 100644
--- a/script-beta/provider/diagnostic.lua
+++ b/script-beta/provider/diagnostic.lua
@@ -133,22 +133,19 @@ function m.syntaxErrors(uri, ast)
return results
end
-function m.diagnostics(uri)
+function m.diagnostics(uri, diags)
if not m._start then
- return m.cache[uri]
- end
-
- local diags = core(uri)
- if not diags then
- return nil
- end
-
- local results = {}
- for _, diag in ipairs(diags) do
- results[#results+1] = buildDiagnostic(uri, diag)
+ return
end
- return results
+ core(uri, function (results)
+ if #results == 0 then
+ return
+ end
+ for i = 1, #results do
+ diags[#diags+1] = buildDiagnostic(uri, results[i])
+ end
+ end)
end
function m.doDiagnostic(uri)
@@ -163,22 +160,45 @@ function m.doDiagnostic(uri)
end
local syntax = m.syntaxErrors(uri, ast)
- local diagnostics = m.diagnostics(uri)
- local full = merge(syntax, diagnostics)
- if not full then
- m.clear(uri)
- return
+ local diags = {}
+ if syntax then
+ for _, err in ipairs(syntax) do
+ diags[#diags+1] = err
+ end
end
- if util.equal(m.cache[uri], full) then
- return
+ local function pushResult()
+ local full = merge(syntax, diags)
+ if not full then
+ m.clear(uri)
+ return
+ end
+
+ if util.equal(m.cache, full) then
+ return
+ end
+ m.cache[uri] = full
+
+ proto.notify('textDocument/publishDiagnostics', {
+ uri = files.getOriginUri(uri),
+ diagnostics = full,
+ })
end
- m.cache[uri] = full
- proto.notify('textDocument/publishDiagnostics', {
- uri = files.getOriginUri(uri),
- diagnostics = full,
- })
+ if await.hasID 'diagnosticsAll' then
+ m.checkStepResult = nil
+ else
+ local clock = os.clock()
+ m.checkStepResult = function ()
+ if os.clock() - clock >= 0.2 then
+ pushResult()
+ clock = os.clock()
+ end
+ end
+ end
+
+ m.diagnostics(uri, diags)
+ pushResult()
end
function m.refresh(uri)
@@ -219,7 +239,13 @@ function m.start()
m.diagnosticsAll()
end
-function m.onDelay()
+function m.checkStepResult()
+ if await.hasID 'diagnosticsAll' then
+ return
+ end
+end
+
+function m.checkWorkspaceDiag()
if not await.hasID 'diagnosticsAll' then
return
end
@@ -255,7 +281,10 @@ end)
await.watch(function (ev, co)
if ev == 'delay' then
- return m.onDelay()
+ if m.checkStepResult then
+ m.checkStepResult()
+ end
+ return m.checkWorkspaceDiag()
end
end)