blob: 7d1fe0da6d66507702418b3da638504885268ea9 (
plain)
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
|
local platform = require 'bee.platform'
local pub = require 'pub'
local task = require 'task'
local m = {}
m.openMap = {}
m.fileMap = {}
--- 打开文件
function m.open(uri)
if platform.OS == 'Windows' then
uri = uri:lower()
end
m.openMap[uri] = true
end
--- 关闭文件
function m.close(uri)
if platform.OS == 'Windows' then
uri = uri:lower()
end
m.openMap[uri] = nil
end
--- 设置文件文本
function m.setText(uri, text)
if platform.OS == 'Windows' then
uri = uri:lower()
end
if not m.fileMap[uri] then
m.fileMap[uri] = {}
end
local file = m.fileMap[uri]
if file.text == text then
return
end
file.text = text
if file.compiling then
pub.removeTask(file.compiling)
end
file.compiling = pub.syncTask('compile', text, function (ast)
ast.uri = uri
file.ast = ast
file.compiling = nil
local onCompiledList = file.onCompiledList
if onCompiledList then
file.onCompiledList = nil
for _, callback in ipairs(onCompiledList) do
callback()
end
end
end)
end
--- 监听编译完成
function m.onCompiled(uri, callback)
if platform.OS == 'Windows' then
uri = uri:lower()
end
local file = m.fileMap[uri]
if not file then
return
end
if not file.onCompiledList then
file.onCompiledList = {}
end
file.onCompiledList[#file.onCompiledList+1] = callback
end
--- 获取文件文本
function m.getText(uri)
if platform.OS == 'Windows' then
uri = uri:lower()
end
local file = m.fileMap[uri]
if not file then
return nil
end
return file.text
end
--- 获取文件语法树(异步)
function m.getAst(uri)
if platform.OS == 'Windows' then
uri = uri:lower()
end
local file = m.fileMap[uri]
if not file.compiling then
return file.ast
end
pub.jumpQueue(file.compiling)
task.wait(function (waker)
m.onCompiled(file, waker)
end)
return file.ast
end
return m
|