@@ -28,7 +28,6 @@ local pub = require 'pub'
28
28
--- @field text string
29
29
--- @field version ? integer
30
30
--- @field originLines ? integer[]
31
- --- @field state ? parser.state
32
31
--- @field diffInfo ? table[]
33
32
--- @field cache table
34
33
--- @field id integer
@@ -49,7 +48,10 @@ function m.reset()
49
48
m .visible = {}
50
49
m .globalVersion = 0
51
50
m .fileCount = 0
52
- m .astCount = 0
51
+ --- @type table<uri , parser.state>
52
+ m .stateMap = setmetatable ({}, util .MODE_V )
53
+ --- @type table<parser.state , true>
54
+ m .stateTrace = setmetatable ({}, util .MODE_K )
53
55
end
54
56
55
57
m .reset ()
@@ -251,12 +253,12 @@ function m.setText(uri, text, isTrust, callback)
251
253
end
252
254
local clock = os.clock ()
253
255
local newText = pluginOnSetText (file , text )
256
+ m .stateMap [uri ] = nil
254
257
file .text = newText
255
258
file .trusted = isTrust
256
259
file .originText = text
257
260
file .rows = nil
258
261
file .words = nil
259
- file .state = nil
260
262
file .cache = {}
261
263
file .cacheActiveTime = math.huge
262
264
m .globalVersion = m .globalVersion + 1
@@ -301,10 +303,10 @@ function m.setRawText(uri, text)
301
303
if not text then
302
304
return
303
305
end
306
+ m .stateMap [uri ] = nil
304
307
local file = m .fileMap [uri ]
305
308
file .text = text
306
309
file .originText = text
307
- file .state = nil
308
310
end
309
311
310
312
function m .getCachedRows (uri )
@@ -458,6 +460,7 @@ function m.remove(uri)
458
460
return
459
461
end
460
462
m .fileMap [uri ] = nil
463
+ m .stateMap [uri ] = nil
461
464
m ._pairsCache = nil
462
465
463
466
m .fileCount = m .fileCount - 1
528
531
--- @param state parser.state
529
532
--- @param file file
530
533
function m .compileStateThen (state , file )
531
- file . state = state
532
-
534
+ m . stateTrace [ state ] = true
535
+ m . stateMap [ file . uri ] = state
533
536
state .uri = file .uri
534
537
state .lua = file .text
535
538
state .ast .uri = file .uri
@@ -553,16 +556,6 @@ function m.compileStateThen(state, file)
553
556
if passed > 0.1 then
554
557
log .warn ((' Convert lazy-table for [%s] takes [%.3f] sec, size [%.3f] kb.' ):format (file .uri , passed , # file .text / 1000 ))
555
558
end
556
- else
557
- m .astCount = m .astCount + 1
558
- local removed
559
- setmetatable (state , {__gc = function ()
560
- if removed then
561
- return
562
- end
563
- removed = true
564
- m .astCount = m .astCount - 1
565
- end })
566
559
end
567
560
end
568
561
@@ -609,8 +602,8 @@ function m.compileStateAsync(uri, callback)
609
602
callback (nil )
610
603
return
611
604
end
612
- if file . state then
613
- callback (file . state )
605
+ if m . stateMap [ uri ] then
606
+ callback (m . stateMap [ uri ] )
614
607
return
615
608
end
616
609
@@ -650,8 +643,8 @@ function m.compileState(uri)
650
643
if not file then
651
644
return
652
645
end
653
- if file . state then
654
- return file . state
646
+ if m . stateMap [ uri ] then
647
+ return m . stateMap [ uri ]
655
648
end
656
649
if not m .checkPreload (uri ) then
657
650
return
@@ -711,12 +704,10 @@ function m.getState(uri)
711
704
return state
712
705
end
713
706
707
+ --- @param uri uri
708
+ --- @return parser.state ?
714
709
function m .getLastState (uri )
715
- local file = m .fileMap [uri ]
716
- if not file then
717
- return nil
718
- end
719
- return file .state
710
+ return m .stateMap [uri ]
720
711
end
721
712
722
713
function m .getFile (uri )
@@ -873,6 +864,15 @@ function m.getDllWords(uri)
873
864
return file .words
874
865
end
875
866
867
+ --- @return integer
868
+ function m .countStates ()
869
+ local n = 0
870
+ for _ in pairs (m .stateTrace ) do
871
+ n = n + 1
872
+ end
873
+ return n
874
+ end
875
+
876
876
--- 注册事件
877
877
--- @param callback async fun ( ev : string , uri : uri )
878
878
function m .watch (callback )
0 commit comments