summaryrefslogtreecommitdiff
path: root/script/core/command
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2021-09-24 15:08:02 +0800
committer最萌小汐 <sumneko@hotmail.com>2021-09-24 15:08:02 +0800
commit4b085b8aea5f33ec114baa31d2b9d72341383c32 (patch)
treefe35a326408e762711a31d3e803464f0c1a8468d /script/core/command
parent0c8c6bbf23082d0b858646846a47a3001f718ae2 (diff)
parent35ce57976db3b4c42193279dd55972ea013fecad (diff)
downloadlua-language-server-4b085b8aea5f33ec114baa31d2b9d72341383c32.zip
Merge branch 'newparser'
Diffstat (limited to 'script/core/command')
-rw-r--r--script/core/command/autoRequire.lua24
-rw-r--r--script/core/command/jsonToLua.lua15
-rw-r--r--script/core/command/removeSpace.lua51
-rw-r--r--script/core/command/solve.lua14
4 files changed, 59 insertions, 45 deletions
diff --git a/script/core/command/autoRequire.lua b/script/core/command/autoRequire.lua
index 2cb6a8f8..d711fb16 100644
--- a/script/core/command/autoRequire.lua
+++ b/script/core/command/autoRequire.lua
@@ -4,20 +4,22 @@ local config = require 'config'
local rpath = require 'workspace.require-path'
local client = require 'client'
local lang = require 'language'
+local guide = require 'parser.guide'
-local function findInsertOffset(uri)
- local lines = files.getLines(uri)
+local function findInsertRow(uri)
local text = files.getText(uri)
+ local state = files.getState(uri)
+ local lines = state.lines
local fmt = {
pair = false,
quot = '"',
col = nil,
}
- for i = 1, #lines do
+ for i = 0, #lines do
local ln = lines[i]
- local lnText = text:sub(ln.start, ln.finish)
+ local lnText = text:match('[^\r\n]*', ln)
if not lnText:find('require', 1, true) then
- return ln.start, fmt
+ return i, fmt
else
local lpPos = lnText:find '%('
if lpPos then
@@ -33,7 +35,7 @@ local function findInsertOffset(uri)
end
end
end
- return 1, fmt
+ return 0, fmt
end
local function askAutoRequire(visiblePaths)
@@ -70,7 +72,7 @@ local function askAutoRequire(visiblePaths)
return nameMap[result]
end
-local function applyAutoRequire(uri, offset, name, result, fmt)
+local function applyAutoRequire(uri, row, name, result, fmt)
local quotedResult = ('%q'):format(result)
if fmt.quot == "'" then
quotedResult = ([['%s']]):format(quotedResult:sub(2, -2)
@@ -88,11 +90,11 @@ local function applyAutoRequire(uri, offset, name, result, fmt)
if fmt.col and fmt.col > #text then
sp = (' '):rep(fmt.col - #text - 1)
end
- text = ('\nlocal %s%s= require%s\n'):format(name, sp, quotedResult)
+ text = ('local %s%s= require%s\n'):format(name, sp, quotedResult)
client.editText(uri, {
{
- start = offset,
- finish = offset - 1,
+ start = guide.positionOf(row, 0),
+ finish = guide.positionOf(row, 0),
text = text,
}
})
@@ -121,6 +123,6 @@ return function (data)
return
end
- local offset, fmt = findInsertOffset(uri)
+ local offset, fmt = findInsertRow(uri)
applyAutoRequire(uri, offset, name, result, fmt)
end
diff --git a/script/core/command/jsonToLua.lua b/script/core/command/jsonToLua.lua
index c4f001ff..8a493b5e 100644
--- a/script/core/command/jsonToLua.lua
+++ b/script/core/command/jsonToLua.lua
@@ -1,9 +1,10 @@
-local files = require 'files'
-local json = require 'json'
-local util = require 'utility'
-local proto = require 'proto'
-local define = require 'proto.define'
-local lang = require 'language'
+local files = require 'files'
+local json = require 'json'
+local util = require 'utility'
+local proto = require 'proto'
+local define = require 'proto.define'
+local lang = require 'language'
+local converter = require 'proto.converter'
return function (data)
local text = files.getText(data.uri)
@@ -26,7 +27,7 @@ return function (data)
changes = {
[data.uri] = {
{
- range = files.range(data.uri, data.start, data.finish),
+ range = converter.packRange(data.uri, data.start, data.finish),
newText = luaStr,
}
}
diff --git a/script/core/command/removeSpace.lua b/script/core/command/removeSpace.lua
index b94f9788..3021d4a4 100644
--- a/script/core/command/removeSpace.lua
+++ b/script/core/command/removeSpace.lua
@@ -1,7 +1,8 @@
-local files = require 'files'
-local guide = require 'parser.guide'
-local proto = require 'proto'
-local lang = require 'language'
+local files = require 'files'
+local guide = require 'parser.guide'
+local proto = require 'proto'
+local lang = require 'language'
+local converter = require 'proto.converter'
local function isInString(ast, offset)
return guide.eachSourceContain(ast.ast, offset, function (source)
@@ -13,29 +14,39 @@ end
return function (data)
local uri = data.uri
- local lines = files.getLines(uri)
local text = files.getText(uri)
- local ast = files.getState(uri)
- if not lines then
+ local state = files.getState(uri)
+ if not state then
return
end
+ local lines = state.lines
local textEdit = {}
- for i = 1, #lines do
- local line = guide.lineContent(lines, text, i, true)
- local pos = line:find '[ \t]+$'
- if pos then
- local start, finish = guide.lineRange(lines, i, true)
- start = start + pos
- if isInString(ast, start) then
- goto NEXT_LINE
- end
- textEdit[#textEdit+1] = {
- range = files.range(uri, start, finish),
- newText = '',
- }
+ for i = 0, #lines do
+ local startOffset = lines[i]
+ local finishOffset = text:find('[\r\n]', startOffset) or (#text + 1)
+ local lastOffset = finishOffset - 1
+ local lastChar = text:sub(lastOffset, lastOffset)
+ if lastChar ~= ' ' and lastChar ~= '\t' then
+ goto NEXT_LINE
+ end
+ local lastPos = guide.offsetToPosition(state, lastOffset)
+ if isInString(state.ast, lastPos) then
goto NEXT_LINE
end
+ local firstOffset = startOffset
+ for n = lastOffset - 1, startOffset, -1 do
+ local char = text:sub(n, n)
+ if char ~= ' ' and char ~= '\t' then
+ firstOffset = n + 1
+ break
+ end
+ end
+ local firstPos = guide.offsetToPosition(state, firstOffset) - 1
+ textEdit[#textEdit+1] = {
+ range = converter.packRange(uri, firstPos, lastPos),
+ newText = '',
+ }
::NEXT_LINE::
end
diff --git a/script/core/command/solve.lua b/script/core/command/solve.lua
index a493de24..9428d065 100644
--- a/script/core/command/solve.lua
+++ b/script/core/command/solve.lua
@@ -1,7 +1,8 @@
-local files = require 'files'
-local guide = require 'parser.guide'
-local proto = require 'proto'
-local lang = require 'language'
+local files = require 'files'
+local guide = require 'parser.guide'
+local proto = require 'proto'
+local lang = require 'language'
+local converter = require 'proto.converter'
local opMap = {
['+'] = true,
@@ -34,8 +35,7 @@ return function (data)
return
end
- local start = files.offsetOfWord(uri, data.range.start)
- local finish = files.offsetOfWord(uri, data.range['end'])
+ local start, finish = converter.unpackRange(uri, data.range)
local result = guide.eachSourceContain(ast.ast, start, function (source)
if source.start ~= start
@@ -85,7 +85,7 @@ return function (data)
changes = {
[uri] = {
{
- range = files.range(uri, result.start, result.finish),
+ range = converter.packRange(uri, result.start, result.finish),
newText = ('(%s)'):format(text:sub(result.start, result.finish)),
}
},