1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
local matchKey = require 'core.matchKey'
local SymbolKind = {
File = 1,
Module = 2,
Namespace = 3,
Package = 4,
Class = 5,
Method = 6,
Property = 7,
Field = 8,
Constructor = 9,
Enum = 10,
Interface = 11,
Function = 12,
Variable = 13,
Constant = 14,
String = 15,
Number = 16,
Boolean = 17,
Array = 18,
Object = 19,
Key = 20,
Null = 21,
EnumMember = 22,
Struct = 23,
Event = 24,
Operator = 25,
TypeParameter = 26,
}
local function convertRange(lines, range)
local start_row, start_col = lines:rowcol(range.start)
local finish_row, finish_col = lines:rowcol(range.finish)
local result = {
start = {
line = start_row - 1,
character = start_col - 1,
},
['end'] = {
line = finish_row - 1,
-- 这里不用-1,因为前端期待的是匹配完成后的位置
character = finish_col,
},
}
return result
end
local function searchVM(lsp, results, query, uri)
local vm, lines = lsp:getVM(uri)
if not vm then
return
end
vm:eachSource(function (src)
if src.type == 'name' then
if matchKey(query, src[1]) then
results[#results+1] = {
name = src[1],
kind = SymbolKind.Variable,
location = {
uri = uri,
range = convertRange(lines, src),
}
}
end
end
end)
end
--- @param lsp LSP
--- @param params table
return function (lsp, params)
local query = params.query
if #query <= 0 then
return {}
end
local results = {}
for uri in lsp:eachFile() do
searchVM(lsp, results, query, uri)
end
return results
end
|