53 lines
1.6 KiB
Lua
53 lines
1.6 KiB
Lua
local files = require 'files'
|
|
local lang = require 'language'
|
|
local guide = require 'parser.guide'
|
|
local await = require 'await'
|
|
|
|
---@async
|
|
return function (uri, callback)
|
|
local state = files.getState(uri)
|
|
local text = files.getText(uri)
|
|
if not state or not text then
|
|
return
|
|
end
|
|
local lines = state.lines
|
|
for i = 0, #lines do
|
|
await.delay()
|
|
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 guide.isInString(state.ast, lastPos)
|
|
or guide.isInComment(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
|
|
if firstOffset == startOffset then
|
|
callback {
|
|
start = firstPos,
|
|
finish = lastPos,
|
|
message = lang.script.DIAG_LINE_ONLY_SPACE,
|
|
}
|
|
else
|
|
callback {
|
|
start = firstPos,
|
|
finish = lastPos,
|
|
message = lang.script.DIAG_LINE_POST_SPACE,
|
|
}
|
|
end
|
|
::NEXT_LINE::
|
|
end
|
|
end
|