1
1
package api
2
2
3
3
import (
4
+ "context"
4
5
"encoding/json"
5
6
"errors"
6
7
"fmt"
@@ -129,7 +130,7 @@ func (api *API) IsWatchEnabled() bool {
129
130
return false
130
131
}
131
132
132
- func (api * API ) HandleRequest (id int , method string , payload []byte ) ([]byte , error ) {
133
+ func (api * API ) HandleRequest (ctx context. Context , method string , payload []byte ) ([]byte , error ) {
133
134
params , err := unmarshalPayload (method , payload )
134
135
if err != nil {
135
136
return nil , err
@@ -155,27 +156,27 @@ func (api *API) HandleRequest(id int, method string, payload []byte) ([]byte, er
155
156
return encodeJSON (api .LoadProject (params .(* LoadProjectParams ).ConfigFileName ))
156
157
case MethodGetSymbolAtPosition :
157
158
params := params .(* GetSymbolAtPositionParams )
158
- return encodeJSON (api .GetSymbolAtPosition (params .Project , params .FileName , int (params .Position )))
159
+ return encodeJSON (api .GetSymbolAtPosition (ctx , params .Project , params .FileName , int (params .Position )))
159
160
case MethodGetSymbolsAtPositions :
160
161
params := params .(* GetSymbolsAtPositionsParams )
161
162
return encodeJSON (core .TryMap (params .Positions , func (position uint32 ) (any , error ) {
162
- return api .GetSymbolAtPosition (params .Project , params .FileName , int (position ))
163
+ return api .GetSymbolAtPosition (ctx , params .Project , params .FileName , int (position ))
163
164
}))
164
165
case MethodGetSymbolAtLocation :
165
166
params := params .(* GetSymbolAtLocationParams )
166
- return encodeJSON (api .GetSymbolAtLocation (params .Project , params .Location ))
167
+ return encodeJSON (api .GetSymbolAtLocation (ctx , params .Project , params .Location ))
167
168
case MethodGetSymbolsAtLocations :
168
169
params := params .(* GetSymbolsAtLocationsParams )
169
170
return encodeJSON (core .TryMap (params .Locations , func (location Handle [ast.Node ]) (any , error ) {
170
- return api .GetSymbolAtLocation (params .Project , location )
171
+ return api .GetSymbolAtLocation (ctx , params .Project , location )
171
172
}))
172
173
case MethodGetTypeOfSymbol :
173
174
params := params .(* GetTypeOfSymbolParams )
174
- return encodeJSON (api .GetTypeOfSymbol (params .Project , params .Symbol ))
175
+ return encodeJSON (api .GetTypeOfSymbol (ctx , params .Project , params .Symbol ))
175
176
case MethodGetTypesOfSymbols :
176
177
params := params .(* GetTypesOfSymbolsParams )
177
178
return encodeJSON (core .TryMap (params .Symbols , func (symbol Handle [ast.Symbol ]) (any , error ) {
178
- return api .GetTypeOfSymbol (params .Project , symbol )
179
+ return api .GetTypeOfSymbol (ctx , params .Project , symbol )
179
180
}))
180
181
default :
181
182
return nil , fmt .Errorf ("unhandled API method %q" , method )
@@ -223,12 +224,14 @@ func (api *API) LoadProject(configFileName string) (*ProjectResponse, error) {
223
224
return data , nil
224
225
}
225
226
226
- func (api * API ) GetSymbolAtPosition (projectId Handle [project.Project ], fileName string , position int ) (* SymbolResponse , error ) {
227
+ func (api * API ) GetSymbolAtPosition (ctx context. Context , projectId Handle [project.Project ], fileName string , position int ) (* SymbolResponse , error ) {
227
228
project , ok := api .projects [projectId ]
228
229
if ! ok {
229
230
return nil , errors .New ("project not found" )
230
231
}
231
- symbol , err := project .LanguageService ().GetSymbolAtPosition (fileName , position )
232
+ languageService , done := project .GetLanguageServiceForRequest (ctx )
233
+ defer done ()
234
+ symbol , err := languageService .GetSymbolAtPosition (ctx , fileName , position )
232
235
if err != nil || symbol == nil {
233
236
return nil , err
234
237
}
@@ -239,7 +242,7 @@ func (api *API) GetSymbolAtPosition(projectId Handle[project.Project], fileName
239
242
return data , nil
240
243
}
241
244
242
- func (api * API ) GetSymbolAtLocation (projectId Handle [project.Project ], location Handle [ast.Node ]) (* SymbolResponse , error ) {
245
+ func (api * API ) GetSymbolAtLocation (ctx context. Context , projectId Handle [project.Project ], location Handle [ast.Node ]) (* SymbolResponse , error ) {
243
246
project , ok := api .projects [projectId ]
244
247
if ! ok {
245
248
return nil , errors .New ("project not found" )
@@ -262,7 +265,9 @@ func (api *API) GetSymbolAtLocation(projectId Handle[project.Project], location
262
265
if node == nil {
263
266
return nil , fmt .Errorf ("node of kind %s not found at position %d in file %q" , kind .String (), pos , sourceFile .FileName ())
264
267
}
265
- symbol := project .LanguageService ().GetSymbolAtLocation (node )
268
+ languageService , done := project .GetLanguageServiceForRequest (ctx )
269
+ defer done ()
270
+ symbol := languageService .GetSymbolAtLocation (ctx , node )
266
271
if symbol == nil {
267
272
return nil , nil
268
273
}
@@ -273,7 +278,7 @@ func (api *API) GetSymbolAtLocation(projectId Handle[project.Project], location
273
278
return data , nil
274
279
}
275
280
276
- func (api * API ) GetTypeOfSymbol (projectId Handle [project.Project ], symbolHandle Handle [ast.Symbol ]) (* TypeResponse , error ) {
281
+ func (api * API ) GetTypeOfSymbol (ctx context. Context , projectId Handle [project.Project ], symbolHandle Handle [ast.Symbol ]) (* TypeResponse , error ) {
277
282
project , ok := api .projects [projectId ]
278
283
if ! ok {
279
284
return nil , errors .New ("project not found" )
@@ -284,7 +289,9 @@ func (api *API) GetTypeOfSymbol(projectId Handle[project.Project], symbolHandle
284
289
if ! ok {
285
290
return nil , fmt .Errorf ("symbol %q not found" , symbolHandle )
286
291
}
287
- t := project .LanguageService ().GetTypeOfSymbol (symbol )
292
+ languageService , done := project .GetLanguageServiceForRequest (ctx )
293
+ defer done ()
294
+ t := languageService .GetTypeOfSymbol (ctx , symbol )
288
295
if t == nil {
289
296
return nil , nil
290
297
}
0 commit comments