@@ -7,18 +7,70 @@ local rpath = require 'workspace.require-path'
7
7
local jumpSource = require ' core.jump-source'
8
8
local wssymbol = require ' core.workspace-symbol'
9
9
10
- local function sortResults (results )
10
+ --- @param s string
11
+ --- @return string[]
12
+ local function split (s )
13
+ local r = {}
14
+ s :gsub (' [^/]+' , function (w )
15
+ r [# r + 1 ] = w :gsub (" ~1" , " /" ):gsub (" ~0" , " ~" )
16
+ end )
17
+ return r
18
+ end
19
+
20
+ --- Returns the Levenshtein distance between the two given string arrays
21
+ --- @param a string[]
22
+ --- @param b string[]
23
+ --- @return number
24
+ local function levenshtein_distance (a , b )
25
+ local a_len , b_len = # a , # b
26
+ local matrix = {} --- @type integer[][]
27
+
28
+ -- Initialize the matrix
29
+ for i = 1 , a_len + 1 do
30
+ matrix [i ] = { [1 ] = i }
31
+ end
32
+
33
+ for j = 1 , b_len + 1 do
34
+ matrix [1 ][j ] = j
35
+ end
36
+
37
+ -- Compute the Levenshtein distance
38
+ for i = 1 , a_len do
39
+ for j = 1 , b_len do
40
+ local cost = (a [i ] == b [j ]) and 0 or 1
41
+ matrix [i + 1 ][j + 1 ] =
42
+ math.min (matrix [i ][j + 1 ] + 1 , matrix [i + 1 ][j ] + 1 , matrix [i ][j ] + cost )
43
+ end
44
+ end
45
+
46
+ -- Return the Levenshtein distance
47
+ return matrix [a_len + 1 ][b_len + 1 ]
48
+ end
49
+
50
+ --- @param path1 string
51
+ --- @param path2 string
52
+ --- @return number
53
+ local function path_similarity_ratio (path1 , path2 )
54
+ local parts1 = split (path1 )
55
+ local parts2 = split (path2 )
56
+ local distance = levenshtein_distance (parts1 , parts2 )
57
+ return distance * 2 / (# parts1 + # parts2 )
58
+ end
59
+
60
+ local function sortResults (results , uri )
11
61
-- 先按照顺序排序
62
+ -- Sort in order first
12
63
table.sort (results , function (a , b )
13
64
local u1 = guide .getUri (a .target )
14
65
local u2 = guide .getUri (b .target )
15
66
if u1 == u2 then
16
67
return a .target .start < b .target .start
17
68
else
18
- return u1 < u2
69
+ return path_similarity_ratio ( uri , u1 ) < path_similarity_ratio ( uri , u2 )
19
70
end
20
71
end )
21
72
-- 如果2个结果处于嵌套状态,则取范围小的那个
73
+ -- If two results are nested, take the one with the smaller range
22
74
local lf , lu
23
75
for i = # results , 1 , - 1 do
24
76
local res = results [i ].target
@@ -141,7 +193,7 @@ return function (uri, offset)
141
193
local results = {}
142
194
local uris = checkRequire (source )
143
195
if uris then
144
- for i , uri in ipairs (uris ) do
196
+ for _ , uri in ipairs (uris ) do
145
197
results [# results + 1 ] = {
146
198
uri = uri ,
147
199
source = source ,
@@ -230,7 +282,7 @@ return function (uri, offset)
230
282
return nil
231
283
end
232
284
233
- sortResults (results )
285
+ sortResults (results , uri )
234
286
jumpSource (results )
235
287
236
288
return results
0 commit comments