summaryrefslogtreecommitdiff
path: root/script-beta/src/provider
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
commit6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 (patch)
treefdc22d78150fd1c5edc46732c8b151ccfefb519f /script-beta/src/provider
parentd0ff66c9abe9d6abbca12fd811e0c3cb69c1033a (diff)
downloadlua-language-server-6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444.zip
正路目录
Diffstat (limited to 'script-beta/src/provider')
-rw-r--r--script-beta/src/provider/capability.lua42
-rw-r--r--script-beta/src/provider/completion.lua53
-rw-r--r--script-beta/src/provider/diagnostic.lua209
-rw-r--r--script-beta/src/provider/init.lua298
-rw-r--r--script-beta/src/provider/markdown.lua22
5 files changed, 0 insertions, 624 deletions
diff --git a/script-beta/src/provider/capability.lua b/script-beta/src/provider/capability.lua
deleted file mode 100644
index aa95c758..00000000
--- a/script-beta/src/provider/capability.lua
+++ /dev/null
@@ -1,42 +0,0 @@
-local m = {}
-
-m.initer = {
- -- 文本同步方式
- textDocumentSync = {
- -- 打开关闭文本时通知
- openClose = true,
- -- 文本改变时完全通知 TODO 支持差量更新(2)
- change = 1,
- },
-
- hoverProvider = true,
- definitionProvider = true,
- referencesProvider = true,
- renameProvider = {
- prepareProvider = true,
- },
- --documentSymbolProvider = true,
- documentHighlightProvider = true,
- --codeActionProvider = true,
- --signatureHelpProvider = {
- -- triggerCharacters = { '(', ',' },
- --},
- --workspace = {
- -- workspaceFolders = {
- -- supported = true,
- -- changeNotifications = true,
- -- }
- --},
- --documentOnTypeFormattingProvider = {
- -- firstTriggerCharacter = '}',
- --},
- --executeCommandProvider = {
- -- commands = {
- -- 'config',
- -- 'removeSpace',
- -- 'solve',
- -- },
- --},
-}
-
-return m
diff --git a/script-beta/src/provider/completion.lua b/script-beta/src/provider/completion.lua
deleted file mode 100644
index d2df44d2..00000000
--- a/script-beta/src/provider/completion.lua
+++ /dev/null
@@ -1,53 +0,0 @@
-local proto = require 'proto'
-
-local isEnable = false
-
-local function allWords()
- local str = [[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.:('"[,#*@| ]]
- local list = {}
- for c in str:gmatch '.' do
- list[#list+1] = c
- end
- return list
-end
-
-local function enable()
- if isEnable then
- return
- end
- isEnable = true
- log.debug('Enable completion.')
- proto.awaitRequest('client/registerCapability', {
- registrations = {
- {
- id = 'completion',
- method = 'textDocument/completion',
- registerOptions = {
- resolveProvider = false,
- triggerCharacters = allWords(),
- },
- },
- }
- })
-end
-
-local function disable()
- if not isEnable then
- return
- end
- isEnable = false
- log.debug('Disable completion.')
- proto.awaitRequest('client/unregisterCapability', {
- unregisterations = {
- {
- id = 'completion',
- method = 'textDocument/completion',
- },
- }
- })
-end
-
-return {
- enable = enable,
- disable = disable,
-}
diff --git a/script-beta/src/provider/diagnostic.lua b/script-beta/src/provider/diagnostic.lua
deleted file mode 100644
index ba95f2bf..00000000
--- a/script-beta/src/provider/diagnostic.lua
+++ /dev/null
@@ -1,209 +0,0 @@
-local await = require 'await'
-local proto = require 'proto.proto'
-local define = require 'proto.define'
-local lang = require 'language'
-local files = require 'files'
-local config = require 'config'
-local core = require 'core.diagnostics'
-local util = require 'utility'
-
-local m = {}
-m._start = false
-m.cache = {}
-
-local function concat(t, sep)
- if type(t) ~= 'table' then
- return t
- end
- return table.concat(t, sep)
-end
-
-local function buildSyntaxError(uri, err)
- local lines = files.getLines(uri)
- local text = files.getText(uri)
- local message = lang.script('PARSER_'..err.type, err.info)
-
- if err.version then
- local version = err.info and err.info.version or config.config.runtime.version
- message = message .. ('(%s)'):format(lang.script('DIAG_NEED_VERSION'
- , concat(err.version, '/')
- , version
- ))
- end
-
- local related = err.info and err.info.related
- local relatedInformation
- if related then
- relatedInformation = {}
- for _, rel in ipairs(related) do
- local rmessage
- if rel.message then
- rmessage = lang.script('PARSER_'..rel.message)
- else
- rmessage = text:sub(rel.start, rel.finish)
- end
- relatedInformation[#relatedInformation+1] = {
- message = rmessage,
- location = define.location(uri, define.range(lines, text, rel.start, rel.finish)),
- }
- end
- end
-
- return {
- range = define.range(lines, text, err.start, err.finish),
- severity = define.DiagnosticSeverity.Error,
- source = lang.script.DIAG_SYNTAX_CHECK,
- message = message,
- relatedInformation = relatedInformation,
- }
-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
-
-local function merge(a, b)
- if not a and not b then
- return nil
- end
- local t = {}
- if a then
- for i = 1, #a do
- t[#t+1] = a[i]
- end
- end
- if b then
- for i = 1, #b do
- t[#t+1] = b[i]
- end
- end
- return t
-end
-
-function m.clear(uri)
- if not m.cache[uri] then
- return
- end
- m.cache[uri] = nil
- proto.notify('textDocument/publishDiagnostics', {
- uri = uri,
- diagnostics = {},
- })
-end
-
-function m.syntaxErrors(uri, ast)
- if #ast.errs == 0 then
- return nil
- end
-
- local results = {}
-
- for _, err in ipairs(ast.errs) do
- results[#results+1] = buildSyntaxError(uri, err)
- end
-
- return results
-end
-
-function m.diagnostics(uri, syntaxOnly)
- if syntaxOnly or 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)
- end
-
- return results
-end
-
-function m.doDiagnostic(uri, syntaxOnly)
- local ast = files.getAst(uri)
- if not ast then
- m.clear(uri)
- return
- end
-
- local syntax = m.syntaxErrors(uri, ast)
- local diagnostics = m.diagnostics(uri, syntaxOnly)
- local full = merge(syntax, diagnostics)
- if not full then
- m.clear(uri)
- return
- end
-
- if util.equal(m.cache[uri], full) then
- return
- end
- m.cache[uri] = full
-
- proto.notify('textDocument/publishDiagnostics', {
- uri = uri,
- diagnostics = full,
- })
-end
-
-function m.refresh(uri)
- await.create(function ()
- await.delay(function ()
- return files.globalVersion
- end)
- if uri then
- m.doDiagnostic(uri, true)
- end
- if not m._start then
- return
- end
- local clock = os.clock()
- if uri then
- m.doDiagnostic(uri)
- end
- for destUri in files.eachFile() do
- if destUri ~= uri then
- m.doDiagnostic(files.getOriginUri(destUri))
- await.delay(function ()
- return files.globalVersion
- end)
- end
- end
- local passed = os.clock() - clock
- log.info(('Finish diagnostics, takes [%.3f] sec.'):format(passed))
- end)
-end
-
-function m.start()
- m._start = true
- m.refresh()
-end
-
-return m
diff --git a/script-beta/src/provider/init.lua b/script-beta/src/provider/init.lua
deleted file mode 100644
index 95f4b3d1..00000000
--- a/script-beta/src/provider/init.lua
+++ /dev/null
@@ -1,298 +0,0 @@
-local util = require 'utility'
-local cap = require 'provider.capability'
-local completion= require 'provider.completion'
-local await = require 'await'
-local files = require 'files'
-local proto = require 'proto.proto'
-local define = require 'proto.define'
-local workspace = require 'workspace'
-local config = require 'config'
-local library = require 'library'
-local markdown = require 'provider.markdown'
-
-local function updateConfig()
- local configs = proto.awaitRequest('workspace/configuration', {
- items = {
- {
- scopeUri = workspace.uri,
- section = 'Lua',
- },
- {
- scopeUri = workspace.uri,
- section = 'files.associations',
- },
- {
- scopeUri = workspace.uri,
- section = 'files.exclude',
- }
- },
- })
-
- local updated = configs[1]
- local other = {
- associations = configs[2],
- exclude = configs[3],
- }
-
- local oldConfig = util.deepCopy(config.config)
- local oldOther = util.deepCopy(config.other)
- config.setConfig(updated, other)
- local newConfig = config.config
- local newOther = config.other
- if not util.equal(oldConfig.runtime, newConfig.runtime) then
- library.reload()
- end
- if not util.equal(oldConfig.diagnostics, newConfig.diagnostics) then
- end
- if not util.equal(oldConfig.plugin, newConfig.plugin) then
- end
- if not util.equal(oldConfig.workspace, newConfig.workspace)
- or not util.equal(oldConfig.plugin, newConfig.plugin)
- or not util.equal(oldOther.associations, newOther.associations)
- or not util.equal(oldOther.exclude, newOther.exclude)
- then
- end
-
- if newConfig.completion.enable then
- --completion.enable()
- else
- completion.disable()
- end
-end
-
-proto.on('initialize', function (params)
- --log.debug(util.dump(params))
- if params.workspaceFolders then
- local name = params.workspaceFolders[1].name
- local uri = params.workspaceFolders[1].uri
- workspace.init(name, uri)
- end
- return {
- capabilities = cap.initer,
- }
-end)
-
-proto.on('initialized', function (params)
- updateConfig()
- proto.awaitRequest('client/registerCapability', {
- registrations = {
- -- 监视文件变化
- {
- id = '0',
- method = 'workspace/didChangeWatchedFiles',
- registerOptions = {
- watchers = {
- {
- globPattern = '**/',
- kind = 1 | 2 | 4,
- }
- },
- },
- },
- -- 配置变化
- {
- id = '1',
- method = 'workspace/didChangeConfiguration',
- }
- }
- })
- await.create(workspace.awaitPreload)
- return true
-end)
-
-proto.on('exit', function ()
- log.info('Server exited.')
- os.exit(true)
-end)
-
-proto.on('shutdown', function ()
- log.info('Server shutdown.')
- return true
-end)
-
-proto.on('workspace/configuration', function ()
- updateConfig()
-end)
-
-proto.on('workspace/didChangeWatchedFiles', function (params)
-end)
-
-proto.on('textDocument/didOpen', function (params)
- local doc = params.textDocument
- local uri = doc.uri
- local text = doc.text
- files.open(uri)
- files.setText(uri, text)
-end)
-
-proto.on('textDocument/didClose', function (params)
- local doc = params.textDocument
- local uri = doc.uri
- files.close(uri)
- if not files.isLua(uri) then
- files.remove(uri)
- end
-end)
-
-proto.on('textDocument/didChange', function (params)
- local doc = params.textDocument
- local change = params.contentChanges
- local uri = doc.uri
- local text = change[1].text
- if files.isLua(uri) or files.isOpen(uri) then
- files.setText(uri, text)
- end
-end)
-
-proto.on('textDocument/hover', function (params)
- local core = require 'core.hover'
- local doc = params.textDocument
- local uri = doc.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 hover = core(uri, offset)
- if not hover then
- return nil
- end
- local md = markdown()
- md:add('lua', hover.label)
- return {
- contents = {
- value = md:string(),
- kind = 'markdown',
- },
- range = define.range(lines, text, hover.source.start, hover.source.finish),
- }
-end)
-
-proto.on('textDocument/definition', function (params)
- local core = require 'core.definition'
- 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 i, info in ipairs(result) do
- local targetUri = info.uri
- local targetLines = files.getLines(targetUri)
- local targetText = files.getText(targetUri)
- response[i] = define.locationLink(targetUri
- , 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
-end)
-
-proto.on('textDocument/references', function (params)
- local core = require 'core.reference'
- 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 i, info in ipairs(result) do
- local targetUri = info.uri
- local targetLines = files.getLines(targetUri)
- local targetText = files.getText(targetUri)
- response[i] = define.location(targetUri
- , define.range(targetLines, targetText, info.target.start, info.target.finish)
- )
- end
- 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/rename', function (params)
- local core = require 'core.rename'
- 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.rename(uri, offset, params.newName)
- if not result then
- return nil
- end
- local workspaceEdit = {
- changes = {},
- }
- for _, info in ipairs(result) do
- local ruri = info.uri
- local rlines = files.getLines(ruri)
- local rtext = files.getText(ruri)
- if not workspaceEdit.changes[ruri] then
- workspaceEdit.changes[ruri] = {}
- end
- local textEdit = define.textEdit(define.range(rlines, rtext, info.start, info.finish), info.text)
- workspaceEdit.changes[ruri][#workspaceEdit.changes[ruri]+1] = textEdit
- end
- return workspaceEdit
-end)
-
-proto.on('textDocument/prepareRename', function (params)
- local core = require 'core.rename'
- 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.prepareRename(uri, offset)
- if not result then
- return nil
- end
- return {
- range = define.range(lines, text, result.start, result.finish),
- placeholder = result.text,
- }
-end)
-
-proto.on('textDocument/completion', function (params)
- --log.info(util.dump(params))
- return nil
-end)
diff --git a/script-beta/src/provider/markdown.lua b/script-beta/src/provider/markdown.lua
deleted file mode 100644
index 0f69ad87..00000000
--- a/script-beta/src/provider/markdown.lua
+++ /dev/null
@@ -1,22 +0,0 @@
-local mt = {}
-mt.__index = mt
-mt.__name = 'markdown'
-
-function mt:add(language, text)
- if not text then
- return
- end
- if language == 'lua' then
- self[#self+1] = ('```lua\n%s\n```'):format(text)
- else
- self[#self+1] = text:gsub('\n', '\n\n')
- end
-end
-
-function mt:string()
- return table.concat(self, '\n')
-end
-
-return function ()
- return setmetatable({}, mt)
-end