Skip to content

Commit

Permalink
fix #388 try to map the range
Browse files Browse the repository at this point in the history
  • Loading branch information
sumneko committed Feb 8, 2021
1 parent 02b4c6a commit 831eb97
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 22 deletions.
1 change: 1 addition & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* `CHG` hint: disabled by default, see [#380](https://github.com/sumneko/lua-language-server/issues/380)
* `FIX` [#381](https://github.com/sumneko/lua-language-server/issues/381)
* `FIX` [#382](https://github.com/sumneko/lua-language-server/issues/382)
* `FIX` [#388](https://github.com/sumneko/lua-language-server/issues/388)

## 1.14.2
`2021-2-4`
Expand Down
42 changes: 28 additions & 14 deletions script/files.lua
Original file line number Diff line number Diff line change
Expand Up @@ -505,8 +505,9 @@ end
--- 获取 position 对应的光标位置
---@param uri uri
---@param position position
---@param isFinish? boolean
---@return integer
function m.offset(uri, position)
function m.offset(uri, position, isFinish)
local file = m.getFile(uri)
local lines = m.getLines(uri)
local text = m.getText(uri)
Expand All @@ -526,7 +527,12 @@ function m.offset(uri, position)
offset = utf8.offset(text, position.character + 1, start) or #text
end
if file._diffInfo then
offset = smerger.getOffset(file._diffInfo, offset)
local start, finish = smerger.getOffset(file._diffInfo, offset)
if isFinish then
offset = finish
else
offset = start
end
end
return offset
end
Expand Down Expand Up @@ -567,29 +573,31 @@ end
--- 将应用差异前的offset转换为应用差异后的offset
---@param uri uri
---@param offset integer
---@return integer
---@return integer start
---@return integer finish
function m.diffedOffset(uri, offset)
local file = m.getFile(uri)
if not file then
return offset
return offset, offset
end
if not file._diffInfo then
return offset
return offset, offset
end
return smerger.getOffset(file._diffInfo, offset)
end

--- 将应用差异后的offset转换为应用差异前的offset
---@param uri uri
---@param offset integer
---@return integer
---@return integer start
---@return integer finish
function m.diffedOffsetBack(uri, offset)
local file = m.getFile(uri)
if not file then
return offset
return offset, offset
end
if not file._diffInfo then
return offset
return offset, offset
end
return smerger.getOffsetBack(file._diffInfo, offset)
end
Expand All @@ -608,8 +616,9 @@ end
--- 将光标位置转化为 position
---@param uri uri
---@param offset integer
---@param isFinish? boolean
---@return position
function m.position(uri, offset)
function m.position(uri, offset, isFinish)
local file = m.getFile(uri)
local lines = m.getLines(uri)
local text = m.getText(uri)
Expand All @@ -620,7 +629,12 @@ function m.position(uri, offset)
}
end
if file._diffInfo then
offset = smerger.getOffsetBack(file._diffInfo, offset)
local start, finish = smerger.getOffsetBack(file._diffInfo, offset)
if isFinish then
offset = finish
else
offset = start
end
lines = m.getOriginLines(uri)
text = m.getOriginText(uri)
end
Expand Down Expand Up @@ -658,8 +672,8 @@ end
---@param offset2 integer
function m.range(uri, offset1, offset2)
local range = {
start = m.position(uri, offset1),
['end'] = m.position(uri, offset2),
start = m.position(uri, offset1, false),
['end'] = m.position(uri, offset2, true),
}
if range.start.character > 0 then
range.start.character = range.start.character - 1
Expand All @@ -673,8 +687,8 @@ end
---@return integer start
---@return integer finish
function m.unrange(uri, range)
local start = m.offset(uri, range.start)
local finish = m.offset(uri, range['end'])
local start = m.offset(uri, range.start, true)
local finish = m.offset(uri, range['end'], false)
return start, finish
end

Expand Down
52 changes: 44 additions & 8 deletions script/string-merger.lua
Original file line number Diff line number Diff line change
Expand Up @@ -78,31 +78,67 @@ end
---根据转换前的位置获取转换后的位置
---@param info string.merger.infos
---@param offset integer
---@return integer
---@return integer start
---@return integer finish
function m.getOffset(info, offset)
local diff = getNearDiff(info, offset, 'start')
if not diff then
return offset
return offset, offset
end
if offset <= diff.finish then
return diff.cstart
local start, finish
if offset == diff.start then
start = diff.cstart
end
if offset == diff.finish then
finish = diff.cfinish
end
if not start or not finish then
local soff = offset - diff.start
local pos = math.min(diff.cstart + soff, diff.cfinish)
start = start or pos
finish = finish or pos
end
if start > finish then
start = finish
end
return start, finish
end
return offset - diff.finish + diff.cfinish
local pos = offset - diff.finish + diff.cfinish
return pos, pos
end

---根据转换后的位置获取转换前的位置
---@param info string.merger.infos
---@param offset integer
---@return integer
---@return integer start
---@return integer finish
function m.getOffsetBack(info, offset)
local diff = getNearDiff(info, offset, 'cstart')
if not diff then
return offset
return offset, offset
end
if offset <= diff.cfinish then
return diff.start
local start, finish
if offset == diff.cstart then
start = diff.start
end
if offset == diff.cfinish then
finish = diff.finish
end
if not start or not finish then
local soff = offset - diff.cstart
local pos = math.min(diff.start + soff, diff.finish)
start = start or pos
finish = finish or pos
end
if start > finish then
start = finish
end
return start, finish
end
return offset - diff.cfinish + diff.finish
local pos = offset - diff.cfinish + diff.finish
return pos, pos
end

return m

0 comments on commit 831eb97

Please sign in to comment.