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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
---@type vm
local vm = require 'vm.vm'
local files = require 'files'
local ws = require 'workspace'
local searcher = require 'core.searcher'
local await = require 'await'
local config = require 'config'
local m = {}
function m.searchFileReturn(results, ast, index)
local returns = ast.returns
if not returns then
return
end
for _, ret in ipairs(returns) do
local exp = ret[index]
if exp then
vm.mergeResults(results, { exp })
end
end
end
function m.require(args, index)
local reqName = args and args[1] and args[1][1]
if not reqName then
return nil
end
local results = {}
local myUri = searcher.getUri(args[1])
local uris = ws.findUrisByRequirePath(reqName)
for _, uri in ipairs(uris) do
if not files.eq(myUri, uri) then
local ast = files.getState(uri)
if ast then
m.searchFileReturn(results, ast.ast, index)
end
end
end
return results
end
function m.dofile(args, index)
local reqName = args and args[1] and args[1][1]
if not reqName then
return
end
local results = {}
local myUri = searcher.getUri(args[1])
local uris = ws.findUrisByFilePath(reqName)
for _, uri in ipairs(uris) do
if not files.eq(myUri, uri) then
local ast = files.getState(uri)
if ast then
m.searchFileReturn(results, ast.ast, index)
end
end
end
return results
end
vm.interface = {}
-- 向前寻找引用的层数限制,一般情况下都为0
-- 在自动完成/漂浮提示等情况时设置为5(需要清空缓存)
-- 在查找引用时设置为10(需要清空缓存)
vm.interface.searchLevel = 0
function vm.interface.call(func, args, index)
if func.special == 'require' and index == 1 then
await.delay()
return m.require(args, index)
end
if func.special == 'dofile' then
await.delay()
return m.dofile(args, index)
end
end
function vm.interface.global(name, onlyDef)
await.delay()
if onlyDef then
return vm.getGlobalSets(name)
else
return vm.getGlobals(name)
end
end
function vm.interface.doc(name, type)
await.delay()
return vm.getDocNames(name, type)
end
function vm.interface.link(uri)
await.delay()
return vm.getLinksTo(uri)
end
function vm.interface.index(obj)
return nil
end
function vm.interface.cache()
await.delay()
return vm.getCache('cache')
end
function vm.interface.getSearchDepth()
return config.config.intelliSense.searchDepth
end
function vm.interface.pulse()
await.delay()
end
|