Skip to content

Commit 831eb97

Browse files
committed
fix #388 try to map the range
1 parent 02b4c6a commit 831eb97

File tree

3 files changed

+73
-22
lines changed

3 files changed

+73
-22
lines changed

Diff for: changelog.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* `CHG` hint: disabled by default, see [#380](https://github.com/sumneko/lua-language-server/issues/380)
55
* `FIX` [#381](https://github.com/sumneko/lua-language-server/issues/381)
66
* `FIX` [#382](https://github.com/sumneko/lua-language-server/issues/382)
7+
* `FIX` [#388](https://github.com/sumneko/lua-language-server/issues/388)
78

89
## 1.14.2
910
`2021-2-4`

Diff for: script/files.lua

+28-14
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,9 @@ end
505505
--- 获取 position 对应的光标位置
506506
---@param uri uri
507507
---@param position position
508+
---@param isFinish? boolean
508509
---@return integer
509-
function m.offset(uri, position)
510+
function m.offset(uri, position, isFinish)
510511
local file = m.getFile(uri)
511512
local lines = m.getLines(uri)
512513
local text = m.getText(uri)
@@ -526,7 +527,12 @@ function m.offset(uri, position)
526527
offset = utf8.offset(text, position.character + 1, start) or #text
527528
end
528529
if file._diffInfo then
529-
offset = smerger.getOffset(file._diffInfo, offset)
530+
local start, finish = smerger.getOffset(file._diffInfo, offset)
531+
if isFinish then
532+
offset = finish
533+
else
534+
offset = start
535+
end
530536
end
531537
return offset
532538
end
@@ -567,29 +573,31 @@ end
567573
--- 将应用差异前的offset转换为应用差异后的offset
568574
---@param uri uri
569575
---@param offset integer
570-
---@return integer
576+
---@return integer start
577+
---@return integer finish
571578
function m.diffedOffset(uri, offset)
572579
local file = m.getFile(uri)
573580
if not file then
574-
return offset
581+
return offset, offset
575582
end
576583
if not file._diffInfo then
577-
return offset
584+
return offset, offset
578585
end
579586
return smerger.getOffset(file._diffInfo, offset)
580587
end
581588

582589
--- 将应用差异后的offset转换为应用差异前的offset
583590
---@param uri uri
584591
---@param offset integer
585-
---@return integer
592+
---@return integer start
593+
---@return integer finish
586594
function m.diffedOffsetBack(uri, offset)
587595
local file = m.getFile(uri)
588596
if not file then
589-
return offset
597+
return offset, offset
590598
end
591599
if not file._diffInfo then
592-
return offset
600+
return offset, offset
593601
end
594602
return smerger.getOffsetBack(file._diffInfo, offset)
595603
end
@@ -608,8 +616,9 @@ end
608616
--- 将光标位置转化为 position
609617
---@param uri uri
610618
---@param offset integer
619+
---@param isFinish? boolean
611620
---@return position
612-
function m.position(uri, offset)
621+
function m.position(uri, offset, isFinish)
613622
local file = m.getFile(uri)
614623
local lines = m.getLines(uri)
615624
local text = m.getText(uri)
@@ -620,7 +629,12 @@ function m.position(uri, offset)
620629
}
621630
end
622631
if file._diffInfo then
623-
offset = smerger.getOffsetBack(file._diffInfo, offset)
632+
local start, finish = smerger.getOffsetBack(file._diffInfo, offset)
633+
if isFinish then
634+
offset = finish
635+
else
636+
offset = start
637+
end
624638
lines = m.getOriginLines(uri)
625639
text = m.getOriginText(uri)
626640
end
@@ -658,8 +672,8 @@ end
658672
---@param offset2 integer
659673
function m.range(uri, offset1, offset2)
660674
local range = {
661-
start = m.position(uri, offset1),
662-
['end'] = m.position(uri, offset2),
675+
start = m.position(uri, offset1, false),
676+
['end'] = m.position(uri, offset2, true),
663677
}
664678
if range.start.character > 0 then
665679
range.start.character = range.start.character - 1
@@ -673,8 +687,8 @@ end
673687
---@return integer start
674688
---@return integer finish
675689
function m.unrange(uri, range)
676-
local start = m.offset(uri, range.start)
677-
local finish = m.offset(uri, range['end'])
690+
local start = m.offset(uri, range.start, true)
691+
local finish = m.offset(uri, range['end'], false)
678692
return start, finish
679693
end
680694

Diff for: script/string-merger.lua

+44-8
Original file line numberDiff line numberDiff line change
@@ -78,31 +78,67 @@ end
7878
---根据转换前的位置获取转换后的位置
7979
---@param info string.merger.infos
8080
---@param offset integer
81-
---@return integer
81+
---@return integer start
82+
---@return integer finish
8283
function m.getOffset(info, offset)
8384
local diff = getNearDiff(info, offset, 'start')
8485
if not diff then
85-
return offset
86+
return offset, offset
8687
end
8788
if offset <= diff.finish then
88-
return diff.cstart
89+
local start, finish
90+
if offset == diff.start then
91+
start = diff.cstart
92+
end
93+
if offset == diff.finish then
94+
finish = diff.cfinish
95+
end
96+
if not start or not finish then
97+
local soff = offset - diff.start
98+
local pos = math.min(diff.cstart + soff, diff.cfinish)
99+
start = start or pos
100+
finish = finish or pos
101+
end
102+
if start > finish then
103+
start = finish
104+
end
105+
return start, finish
89106
end
90-
return offset - diff.finish + diff.cfinish
107+
local pos = offset - diff.finish + diff.cfinish
108+
return pos, pos
91109
end
92110

93111
---根据转换后的位置获取转换前的位置
94112
---@param info string.merger.infos
95113
---@param offset integer
96-
---@return integer
114+
---@return integer start
115+
---@return integer finish
97116
function m.getOffsetBack(info, offset)
98117
local diff = getNearDiff(info, offset, 'cstart')
99118
if not diff then
100-
return offset
119+
return offset, offset
101120
end
102121
if offset <= diff.cfinish then
103-
return diff.start
122+
local start, finish
123+
if offset == diff.cstart then
124+
start = diff.start
125+
end
126+
if offset == diff.cfinish then
127+
finish = diff.finish
128+
end
129+
if not start or not finish then
130+
local soff = offset - diff.cstart
131+
local pos = math.min(diff.start + soff, diff.finish)
132+
start = start or pos
133+
finish = finish or pos
134+
end
135+
if start > finish then
136+
start = finish
137+
end
138+
return start, finish
104139
end
105-
return offset - diff.cfinish + diff.finish
140+
local pos = offset - diff.cfinish + diff.finish
141+
return pos, pos
106142
end
107143

108144
return m

0 commit comments

Comments
 (0)