summaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
authorCppCXY <812125110@qq.com>2022-08-11 19:36:29 +0800
committerCppCXY <812125110@qq.com>2022-08-11 19:36:29 +0800
commit40f191a85ea21bb64c427f9dab4bc597e2a0ea1b (patch)
tree5652e32d59d6ca1314b8517a5028bd623b7130e6 /script
parente62d964ff57cc0b37eb908315f9afe3ce6a213d7 (diff)
downloadlua-language-server-40f191a85ea21bb64c427f9dab4bc597e2a0ea1b.zip
支持typeformat
Diffstat (limited to 'script')
-rw-r--r--script/core/type-formatting.lua39
-rw-r--r--script/provider/provider.lua2
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