summaryrefslogtreecommitdiff
path: root/script/core/command/removeSpace.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/core/command/removeSpace.lua')
-rw-r--r--script/core/command/removeSpace.lua42
1 files changed, 27 insertions, 15 deletions
diff --git a/script/core/command/removeSpace.lua b/script/core/command/removeSpace.lua
index 3d7795a1..d92fee79 100644
--- a/script/core/command/removeSpace.lua
+++ b/script/core/command/removeSpace.lua
@@ -15,27 +15,39 @@ end
return function (data)
local uri = data.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 = {}
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 = converter.packRange(uri, start, finish),
- newText = '',
- }
+ for i = 0, #lines do
+ local startPos = lines[i]
+ local startOffset = guide.positionToOffset(state, startPos)
+ 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