Skip to content

Commit c34237a

Browse files
authored
adds a tick function and adds more information into PendingRequests (#237)
* adds a tick function and adds more information into PendingRequests * only tick ls when in main module
1 parent dc9a4ce commit c34237a

File tree

5 files changed

+55
-20
lines changed

5 files changed

+55
-20
lines changed

ls.nim

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,17 @@ type
8888
onMainReadSignal*: ThreadSignalPtr #used by the main thread to notify it read the value from the signal
8989
value*: cstring
9090

91+
PendingRequestState* = enum
92+
prsOnGoing = "OnGoing", prsCancelled = "Cancelled", prsComplete = "Complete"
93+
9194
PendingRequest* = object
9295
id*: uint
9396
name*: string
9497
request*: Future[JsonString]
9598
projectFile*: Option[string]
96-
time*: DateTime
99+
startTime*: DateTime
100+
endTime*: DateTime
101+
state*: PendingRequestState
97102

98103
LanguageServer* = ref object
99104
clientCapabilities*: ClientCapabilities
@@ -271,6 +276,16 @@ proc showMessage*(ls: LanguageServer, message: string, typ: MessageType) {.raise
271276
except CatchableError:
272277
discard
273278

279+
proc toPendingRequestStatus(pr: PendingRequest): PendingRequestStatus =
280+
result.time = case pr.state:
281+
of prsOnGoing:
282+
$(now() - pr.startTime)
283+
else:
284+
$(pr.endTime - pr.startTime)
285+
result.name = pr.name
286+
result.projectFile = pr.projectFile.get("")
287+
result.state = $pr.state
288+
274289
proc getLspStatus*(ls: LanguageServer): NimLangServerStatus {.raises: [].} =
275290
result.version = LSPVersion
276291
result.extensionCapabilities = ls.extensionCapabilities.toSeq
@@ -295,14 +310,7 @@ proc getLspStatus*(ls: LanguageServer): NimLangServerStatus {.raises: [].} =
295310
let openFilePath = openFile.uriToPath
296311
result.openFiles.add openFilePath
297312

298-
result.pendingRequests = ls.pendingRequests.values.toSeq
299-
.mapIt(
300-
PendingRequestStatus(
301-
name: it.name,
302-
projectFile: it.projectFile.get(""),
303-
time: $(now() - it.time)
304-
)
305-
)
313+
result.pendingRequests = ls.pendingRequests.values.toSeq.map(toPendingRequestStatus)
306314

307315
proc sendStatusChanged*(ls: LanguageServer) {.raises: [].} =
308316
let status: NimLangServerStatus = ls.getLspStatus()
@@ -794,4 +802,19 @@ proc checkFile*(ls: LanguageServer, uri: string): Future[void] {.async.} =
794802
ls.sendDiagnostics(diagnostics, path)
795803
else:
796804
ls.progress(token, "end")
797-
805+
806+
proc removeCompletedPendingRequests(ls: LanguageServer, maxTimeAfterRequestWasCompleted = initDuration(seconds = 10)) =
807+
var toRemove = newSeq[uint]()
808+
for id, pr in ls.pendingRequests:
809+
if pr.state != prsOnGoing:
810+
let passedTime = now() - pr.endTime
811+
if passedTime > maxTimeAfterRequestWasCompleted:
812+
toRemove.add id
813+
814+
for id in toRemove:
815+
ls.pendingRequests.del id
816+
817+
proc tick*(ls: LanguageServer): Future[void] {.async.} =
818+
# debug "Ticking at ", now = now(), prs = ls.pendingRequests.len
819+
ls.removeCompletedPendingRequests()
820+
ls.sendStatusChanged

lstransports.nim

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,17 @@ proc addRpcToCancellable*(ls: LanguageServer, rpc: Rpc): Rpc =
7070
try:
7171
let idRequest = get[uint](params, "idRequest")
7272
let name = get[string](params, "method")
73-
ls.pendingRequests[idRequest] = PendingRequest(id: idRequest, name: name, time: now())
73+
ls.pendingRequests[idRequest] = PendingRequest(id: idRequest, name: name, startTime: now(), state: prsOnGoing)
7474
ls.sendStatusChanged
7575
var fut = rpc(params)
7676
ls.pendingRequests[idRequest].request = fut #we need to add it before because the rpc may access to the pendingRequest to set the projectFile
7777
fut.addCallback proc (d: pointer) =
78-
ls.pendingRequests.del idRequest
79-
ls.sendStatusChanged
78+
try:
79+
ls.pendingRequests[idRequest].state = prsComplete
80+
ls.pendingRequests[idRequest].endTime = now()
81+
ls.sendStatusChanged
82+
except KeyError:
83+
error "Error completing pending requests. Id not found in pending requests"
8084
return fut
8185
except KeyError as ex:
8286
error "IdRequest not found in the request params"

nimlangserver.nim

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ proc registerProcMonitor(ls: LanguageServer) =
100100

101101
hookAsyncProcMonitor(ls.cmdLineClientProcessId.get, onCmdLineClientProcessExit)
102102

103+
104+
proc tickLs(ls: LanguageServer, time = 1.seconds) {.async.} =
105+
await ls.tick()
106+
await sleepAsync(time)
107+
await ls.tickLs()
108+
103109
proc main*(cmdLineParams: CommandLineParams): LanguageServer =
104110
debug "Starting nimlangserver", version = LSPVersion, params = cmdLineParams
105111
#[
@@ -119,6 +125,8 @@ proc main*(cmdLineParams: CommandLineParams): LanguageServer =
119125
when isMainModule:
120126
try:
121127
let ls = main(handleParams())
128+
asyncSpawn ls.tickLs()
129+
122130
when defined(posix):
123131
onSignal(SIGINT, SIGTERM, SIGHUP, SIGQUIT, SIGPIPE):
124132
debug "Terminated via signal", sig

protocol/types.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,7 @@ type
981981
name*: string
982982
projectFile*: string
983983
time*: string
984+
state*: string
984985

985986
NimSuggestStatus* = object
986987
projectFile*: string

routes.nim

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import macros, strformat, chronos,
22
json_rpc/server, os, sugar, sequtils,
33
suggestapi, protocol/enums, protocol/types, with, tables, strutils,
44
./utils, chronicles,
5-
asyncprocmonitor, std/strscans, json_serialization,
6-
std/json, std/parseutils, ls
5+
asyncprocmonitor, json_serialization,
6+
std/[strscans, times, json, parseutils], ls
77

88
#routes
99
proc initialize*(p: tuple[ls: LanguageServer, onExit: OnExitCallback], params: InitializeParams):
@@ -322,7 +322,6 @@ proc scheduleFileCheck(ls: LanguageServer, uri: string) {.gcsafe, raises: [].} =
322322
# except Exception:
323323
# discard
324324

325-
326325
proc toMarkedStrings(suggest: Suggest): seq[MarkedStringOption] =
327326
var label = suggest.qualifiedPath.join(".")
328327
if suggest.forth != "":
@@ -672,11 +671,11 @@ proc cancelRequest*(ls: LanguageServer, params: CancelParams):
672671
let id = params.id.get.getInt.uint
673672
if id notin ls.pendingRequests: return
674673
let pendingRequest = ls.pendingRequests[id]
675-
if pendingRequest.request != nil:
674+
if ls.pendingRequests[id].request != nil:
676675
debug "Cancelling: ", id = id
677-
await pendingRequest.request.cancelAndWait()
678-
ls.pendingRequests.del id
679-
ls.sendStatusChanged
676+
await ls.pendingRequests[id].request.cancelAndWait()
677+
ls.pendingRequests[id].state = prsCancelled
678+
ls.pendingRequests[id].endTime = now()
680679
681680
proc setTrace*(ls: LanguageServer, params: SetTraceParams) {.async.} =
682681
debug "setTrace", value = params.value

0 commit comments

Comments
 (0)