diff options
author | CppCXY <812125110@qq.com> | 2022-08-11 19:36:29 +0800 |
---|---|---|
committer | CppCXY <812125110@qq.com> | 2022-08-11 19:36:29 +0800 |
commit | 40f191a85ea21bb64c427f9dab4bc597e2a0ea1b (patch) | |
tree | 5652e32d59d6ca1314b8517a5028bd623b7130e6 /script | |
parent | e62d964ff57cc0b37eb908315f9afe3ce6a213d7 (diff) | |
download | lua-language-server-40f191a85ea21bb64c427f9dab4bc597e2a0ea1b.zip |
支持typeformat
Diffstat (limited to 'script')
-rw-r--r-- | script/core/type-formatting.lua | 39 | ||||
-rw-r--r-- | script/provider/provider.lua | 2 |
2 files changed, 38 insertions, 3 deletions
diff --git a/script/core/type-formatting.lua b/script/core/type-formatting.lua index cc305982..c6316d80 100644 --- a/script/core/type-formatting.lua +++ b/script/core/type-formatting.lua @@ -1,11 +1,15 @@ local files = require 'files' local lookBackward = require 'core.look-backward' local guide = require "parser.guide" +local codeFormat = require "code_format" local function insertIndentation(uri, position, edits) local text = files.getText(uri) local state = files.getState(uri) local row = guide.rowColOf(position) + if not state or not text then + return + end local offset = state.lines[row] local indent = text:match('^%s*', offset) for _, edit in ipairs(edits) do @@ -16,6 +20,9 @@ end local function findForward(uri, position, ...) local text = files.getText(uri) local state = files.getState(uri) + if not state or not text then + return nil + end local offset = guide.positionToOffset(state, position) local firstOffset = text:match('^[ \t]*()', offset + 1) if not firstOffset then @@ -32,6 +39,9 @@ end local function findBackward(uri, position, ...) local text = files.getText(uri) local state = files.getState(uri) + if not state or not text then + return nil + end local offset = guide.positionToOffset(state, position) local lastOffset = lookBackward.findAnyOffset(text, offset) for _, symbol in ipairs { ... } do @@ -48,7 +58,7 @@ local function checkSplitOneLine(results, uri, position, ch) end local fPosition, fSymbol = findForward(uri, position, 'end', '}') - if not fPosition then + if not fPosition or not fSymbol then return end local bPosition = findBackward(uri, position, 'then', 'do', ')', '{') @@ -77,7 +87,29 @@ local function checkSplitOneLine(results, uri, position, ch) end end -return function (uri, position, ch) +local function typeFormat(results, uri, position, ch, options) + if ch ~= '\n' then + return + end + local text = files.getOriginText(uri) + local state = files.getState(uri) + if not state then + return + end + local converter = require("proto.converter") + local pos = converter.packPosition(uri, position) + local success, result = codeFormat.type_format(uri, text, pos.line, pos.character, options) + if success then + local range = result.range + results[#results+1] = { + text = result.newText, + start = converter.unpackPosition(uri, { line = range.start.line, character = range.start.character }), + finish = converter.unpackPosition(uri, { line = range["end"].line, character = range["end"].character }), + } + end +end + +return function (uri, position, ch, options) local ast = files.getState(uri) if not ast then return nil @@ -86,6 +118,9 @@ return function (uri, position, ch) local results = {} -- split `function () $ end` checkSplitOneLine(results, uri, position, ch) + if #results == 0 then + typeFormat(results, uri, position, ch, options) + end return results end diff --git a/script/provider/provider.lua b/script/provider/provider.lua index 08b6ca93..3d012757 100644 --- a/script/provider/provider.lua +++ b/script/provider/provider.lua @@ -1107,7 +1107,7 @@ m.register 'textDocument/onTypeFormatting' { end local core = require 'core.type-formatting' local pos = converter.unpackPosition(uri, params.position) - local edits = core(uri, pos, ch) + local edits = core(uri, pos, ch, params.options) if not edits or #edits == 0 then return nil end |