@@ -4,15 +4,16 @@ local await = require 'await'
44local conv = require ' proto.converter'
55local getRef = require ' core.reference'
66
7- --- @type codeLens
8- local latestCodeLens
7+ --- @class parser.state
8+ --- @field package _codeLens codeLens
99
1010--- @class codeLens.resolving
1111--- @field mode ' reference'
1212--- @field source parser.object
1313
1414--- @class codeLens.result
1515--- @field position integer
16+ --- @field uri uri
1617--- @field id integer
1718
1819--- @class codeLens
6465--- @async
6566function mt :collectReferences ()
6667 await .delay ()
68+ --- @async
6769 guide .eachSourceType (self .state .ast , ' function' , function (src )
68- local assign = src .parent
69- if not guide .isSet (assign ) then
70+ local parent = src .parent
71+ if guide .isSet (parent ) then
72+ src = parent
73+ elseif parent .type == ' return' then
74+ else
7075 return
7176 end
77+ await .delay ()
7278 self :addResult (src .start , {
7379 mode = ' reference' ,
74- source = assign ,
80+ source = src ,
7581 })
7682 end )
7783end
8086--- @param source parser.object
8187--- @return proto.command ?
8288function mt :resolveReference (source )
83- local refs = getRef (self .uri , source .start , false )
89+ local refs = getRef (self .uri , source .finish , false )
8490 local count = refs and # refs or 0
8591 local command = conv .command (
8692 (' %d个引用' ):format (count ),
87- ' editor.action.showReferences' ,
88- {
89- self .uri ,
90- conv .packPosition (self .state , source .start ),
91- }
93+ ' ' ,
94+ {}
9295 )
9396 return command
9497end
9598
9699--- @async
97100--- @param uri uri
98101--- @return codeLens.result[] ?
99- local function codeLens (uri )
100- latestCodeLens = setmetatable ({}, mt )
101- local suc = latestCodeLens :init (uri )
102+ local function getCodeLens (uri )
103+ local state = files .getState (uri )
104+ if not state then
105+ return nil
106+ end
107+ local codeLens = setmetatable ({}, mt )
108+ local suc = codeLens :init (uri )
102109 if not suc then
103110 return nil
104111 end
112+ state ._codeLens = codeLens
105113
106- latestCodeLens :collectReferences ()
114+ codeLens :collectReferences ()
107115
108- if # latestCodeLens .results == 0 then
116+ if # codeLens .results == 0 then
109117 return nil
110118 end
111119
112- return latestCodeLens .results
120+ return codeLens .results
113121end
114122
115123--- @async
116124--- @param id integer
117125--- @return proto.command ?
118- local function resolve (id )
119- if not latestCodeLens then
126+ local function resolve (uri , id )
127+ local state = files .getState (uri )
128+ if not state then
129+ return nil
130+ end
131+ local codeLens = state ._codeLens
132+ if not codeLens then
120133 return nil
121134 end
122- local command = latestCodeLens :resolve (id )
135+ local command = codeLens :resolve (id )
123136 return command
124137end
125138
126139return {
127- codeLens = codeLens ,
140+ codeLens = getCodeLens ,
128141 resolve = resolve ,
129142}
0 commit comments