diff options
-rw-r--r-- | .vscode/settings.json | 3 | ||||
-rw-r--r-- | server-beta/src/core/diagnostics/global-in-nil-env.lua | 2 | ||||
-rw-r--r-- | server-beta/src/core/diagnostics/init.lua | 3 | ||||
-rw-r--r-- | server-beta/src/files.lua | 3 | ||||
-rw-r--r-- | server-beta/src/parser/compile.lua | 4 | ||||
-rw-r--r-- | server-beta/src/proto/define.lua | 4 | ||||
-rw-r--r-- | server-beta/src/proto/provider.lua | 6 | ||||
-rw-r--r-- | server-beta/src/service/diagnostic.lua | 45 |
8 files changed, 56 insertions, 14 deletions
diff --git a/.vscode/settings.json b/.vscode/settings.json index 79492f79..098fc00a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -29,5 +29,6 @@ "E:/Github/test" : true, "server/src/meta" : true }, - "Lua.plugin.enable": true + "Lua.plugin.enable": true, + "Lua.zzzzzz.cat": true } diff --git a/server-beta/src/core/diagnostics/global-in-nil-env.lua b/server-beta/src/core/diagnostics/global-in-nil-env.lua index 72375ea5..d8cc0075 100644 --- a/server-beta/src/core/diagnostics/global-in-nil-env.lua +++ b/server-beta/src/core/diagnostics/global-in-nil-env.lua @@ -50,7 +50,7 @@ return function (uri, callback) finish = source.finish, uri = uri, message = lang.script.DIAG_GLOBAL_IN_NIL_ENV, - relative = { + related = { { start = ok.start, finish = ok.finish, diff --git a/server-beta/src/core/diagnostics/init.lua b/server-beta/src/core/diagnostics/init.lua index 8b6167cc..2972694d 100644 --- a/server-beta/src/core/diagnostics/init.lua +++ b/server-beta/src/core/diagnostics/init.lua @@ -7,8 +7,9 @@ local function check(uri, name, level, results) return end level = config.config.diagnostics.severity[name] or level + local severity = define.DiagnosticSeverity[level] require('core.diagnostics.' .. name)(uri, function (result) - result.level = level or result.level + result.level = severity or result.level result.code = name results[#results+1] = result end, name) diff --git a/server-beta/src/files.lua b/server-beta/src/files.lua index 78610315..47078661 100644 --- a/server-beta/src/files.lua +++ b/server-beta/src/files.lua @@ -115,6 +115,9 @@ function m.remove(uri) end m.fileMap[uri] = nil searcher.refreshCache() + + local diagnostic = require 'service.diagnostic' + diagnostic.refresh() end --- 移除所有文件 diff --git a/server-beta/src/parser/compile.lua b/server-beta/src/parser/compile.lua index 1a3e5a21..1a187e96 100644 --- a/server-beta/src/parser/compile.lua +++ b/server-beta/src/parser/compile.lua @@ -254,7 +254,7 @@ local vmMap = { type = 'REDEFINED_LABEL', start = obj.start, finish = obj.finish, - relative = { + related = { { message = 'REDEFINED_LABEL', start = label.start, @@ -460,7 +460,7 @@ local function compileGoTo(obj) info = { loc = loc[1], }, - relative = { + related = { { message = 'JUMPED_LABEL', start = label.start, diff --git a/server-beta/src/proto/define.lua b/server-beta/src/proto/define.lua index 6acd2348..ee968021 100644 --- a/server-beta/src/proto/define.lua +++ b/server-beta/src/proto/define.lua @@ -30,7 +30,7 @@ function m.position(lines, text, offset) } end ---- 将2个光标位置转化为 range +--- 将起点与终点位置转化为 range ---@alias range table ---@param lines table ---@param text string @@ -38,7 +38,7 @@ end ---@param offset2 integer function m.range(lines, text, offset1, offset2) return { - start = m.position(lines, text, offset1), + start = m.position(lines, text, offset1-1), ['end'] = m.position(lines, text, offset2), } end diff --git a/server-beta/src/proto/provider.lua b/server-beta/src/proto/provider.lua index 08229f29..ea1fb203 100644 --- a/server-beta/src/proto/provider.lua +++ b/server-beta/src/proto/provider.lua @@ -167,9 +167,9 @@ proto.on('textDocument/definition', function (params) local targetLines = files.getLines(targetUri) local targetText = files.getText(targetUri) response[i] = define.locationLink(targetUri - , define.range(targetLines, targetText, info.target.start - 1, info.target.finish) - , define.range(targetLines, targetText, info.target.start - 1, info.target.finish) - , define.range(lines, text, info.source.start - 1, info.source.finish) + , define.range(targetLines, targetText, info.target.start, info.target.finish) + , define.range(targetLines, targetText, info.target.start, info.target.finish) + , define.range(lines, text, info.source.start, info.source.finish) ) end return response diff --git a/server-beta/src/service/diagnostic.lua b/server-beta/src/service/diagnostic.lua index 6fd212a9..f6b0c1a0 100644 --- a/server-beta/src/service/diagnostic.lua +++ b/server-beta/src/service/diagnostic.lua @@ -4,6 +4,7 @@ local define = require 'proto.define' local lang = require 'language' local files = require 'files' local config = require 'config' +local core = require 'core.diagnostics' local m = {} @@ -29,11 +30,11 @@ local function buildSyntaxError(uri, err) )) end - local relative = err.info and err.info.relative + local related = err.info and err.info.related local relatedInformation - if relative then + if related then relatedInformation = {} - for _, rel in ipairs(relative) do + for _, rel in ipairs(related) do relatedInformation[#relatedInformation+1] = { message = lang.script('PARSER_'..rel.message), location = define.location(uri, define.range(lines, text, rel.start, rel.finish)), @@ -50,6 +51,34 @@ local function buildSyntaxError(uri, err) } end +local function buildDiagnostic(uri, diag) + local lines = files.getLines(uri) + local text = files.getText(uri) + + local relatedInformation + if diag.related then + relatedInformation = {} + for _, rel in ipairs(diag.related) do + local rtext = files.getText(rel.uri) + local rlines = files.getLines(rel.uri) + relatedInformation[#relatedInformation+1] = { + message = rel.message or rtext:sub(rel.start, rel.finish), + location = define.location(rel.uri, define.range(rlines, rtext, rel.start, rel.finish)) + } + end + end + + return { + range = define.range(lines, text, diag.start, diag.finish), + source = lang.script.DIAG_DIAGNOSTICS, + severity = diag.level, + message = diag.message, + code = diag.code, + tags = diag.tags, + relatedInformation = relatedInformation, + } +end + function m.doDiagnostic(uri) local ast = files.getAst(uri) if not ast then @@ -62,6 +91,12 @@ function m.doDiagnostic(uri) diagnostics[#diagnostics+1] = buildSyntaxError(uri, err) end + local diags = core(uri) + for _, diag in ipairs(diags) do + diagnostics[#diagnostics+1] = buildDiagnostic(uri, diag) + end + + proto.notify('textDocument/publishDiagnostics', { uri = uri, diagnostics = diagnostics, @@ -73,7 +108,9 @@ function m.refresh(uri) m.version = m.version + 1 local myVersion = m.version await.create(function () - m.doDiagnostic(files.getOriginUri(uri)) + if uri then + m.doDiagnostic(files.getOriginUri(uri)) + end await.sleep(1.0) if myVersion ~= m.version then return |