Skip to content

Commit 2aa1b0f

Browse files
authored
Fixes a crash in inline hints where the char is out of bounds (#244)
1 parent d6f9525 commit 2aa1b0f

File tree

2 files changed

+54
-17
lines changed

2 files changed

+54
-17
lines changed

ls.nim

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -820,8 +820,11 @@ proc maybeRequestConfigurationFromClient*(ls: LanguageServer) =
820820
debug "Client does not support workspace/configuration"
821821
ls.workspaceConfiguration.complete(newJArray())
822822

823-
proc getCharacter*(ls: LanguageServer, uri: string, line: int, character: int): int =
824-
return ls.openFiles[uri].fingerTable[line].utf16to8(character)
823+
proc getCharacter*(ls: LanguageServer, uri: string, line: int, character: int): Option[int] =
824+
if uri in ls.openFiles and line < ls.openFiles[uri].fingerTable.len:
825+
return some ls.openFiles[uri].fingerTable[line].utf16to8(character)
826+
else:
827+
return none(int)
825828

826829
proc stopNimsuggestProcesses*(ls: LanguageServer) {.async.} =
827830
if not ls.childNimsuggestProcessesStopped:

routes.nim

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,14 @@ proc completion*(
142142
let nimsuggest = await ls.tryGetNimsuggest(uri)
143143
if nimsuggest.isNone():
144144
return @[]
145+
let ch = ls.getCharacter(uri, line, character)
146+
if ch.isNone:
147+
return @[]
145148
let completions = await nimsuggest.get.sug(
146149
uriToPath(uri),
147150
ls.uriToStash(uri),
148151
line + 1,
149-
ls.getCharacter(uri, line, character),
152+
ch.get,
150153
)
151154
result = completions.map(toCompletionItem)
152155

@@ -171,12 +174,15 @@ proc definition*(
171174
let ns = await ls.tryGetNimsuggest(uri)
172175
if ns.isNone:
173176
return @[]
177+
let ch = ls.getCharacter(uri, line, character)
178+
if ch.isNone:
179+
return @[]
174180
result = ns.get
175181
.def(
176182
uriToPath(uri),
177183
ls.uriToStash(uri),
178184
line + 1,
179-
ls.getCharacter(uri, line, character),
185+
ch.get,
180186
)
181187
.await()
182188
.map(toLocation)
@@ -189,12 +195,15 @@ proc declaration*(
189195
let ns = await ls.tryGetNimsuggest(uri)
190196
if ns.isNone:
191197
return @[]
198+
let ch = ls.getCharacter(uri, line, character)
199+
if ch.isNone:
200+
return @[]
192201
result = ns.get
193202
.declaration(
194203
uriToPath(uri),
195204
ls.uriToStash(uri),
196205
line + 1,
197-
ls.getCharacter(uri, line, character),
206+
ch.get,
198207
)
199208
.await()
200209
.map(toLocation)
@@ -206,13 +215,15 @@ proc expandAll*(
206215
let ns = await ls.tryGetNimsuggest(uri)
207216
if ns.isNone:
208217
return ExpandResult() #TODO make it optional
209-
218+
let ch = ls.getCharacter(uri, line, character)
219+
if ch.isNone:
220+
return ExpandResult()
210221
let expand = ns.get
211222
.expand(
212223
uriToPath(uri),
213224
ls.uriToStash(uri),
214225
line + 1,
215-
ls.getCharacter(uri, line, character),
226+
ch.get,
216227
)
217228
.await()
218229

@@ -244,12 +255,15 @@ proc expand*(
244255
ns = await ls.tryGetNimsuggest(uri)
245256
if ns.isNone:
246257
return ExpandResult()
258+
let ch = ls.getCharacter(uri, line, character)
259+
if ch.isNone:
260+
return ExpandResult()
247261
let expand = ns.get
248262
.expand(
249263
uriToPath(uri),
250264
ls.uriToStash(uri),
251265
line + 1,
252-
ls.getCharacter(uri, line, character),
266+
ch.get,
253267
fmt " {tag}",
254268
)
255269
.await()
@@ -316,12 +330,15 @@ proc typeDefinition*(
316330
let ns = await ls.tryGetNimSuggest(uri)
317331
if ns.isNone:
318332
return @[]
333+
let ch = ls.getCharacter(uri, line, character)
334+
if ch.isNone:
335+
return @[]
319336
result = ns.get
320337
.`type`(
321338
uriToPath(uri),
322339
ls.uriToStash(uri),
323340
line + 1,
324-
ls.getCharacter(uri, line, character),
341+
ch.get,
325342
)
326343
.await()
327344
.map(toLocation)
@@ -395,11 +412,14 @@ proc hover*(
395412
let nimsuggest = await ls.tryGetNimsuggest(uri)
396413
if nimsuggest.isNone:
397414
return none(Hover)
415+
let ch = ls.getCharacter(uri, line, character)
416+
if ch.isNone:
417+
return none(Hover)
398418
let suggestions = await nimsuggest.get().def(
399419
uriToPath(uri),
400420
ls.uriToStash(uri),
401421
line + 1,
402-
ls.getCharacter(uri, line, character),
422+
ch.get,
403423
)
404424
if suggestions.len == 0:
405425
return none[Hover]()
@@ -413,11 +433,14 @@ proc references*(
413433
let nimsuggest = await ls.tryGetNimsuggest(uri)
414434
if nimsuggest.isNone:
415435
return @[]
436+
let ch = ls.getCharacter(uri, line, character)
437+
if ch.isNone:
438+
return @[]
416439
let refs = await nimsuggest.get.use(
417440
uriToPath(uri),
418441
ls.uriToStash(uri),
419442
line + 1,
420-
ls.getCharacter(uri, line, character),
443+
ch.get,
421444
)
422445
result = refs.filter(suggest => suggest.section != ideDef or includeDeclaration).map(
423446
toLocation
@@ -430,12 +453,15 @@ proc prepareRename*(
430453
asyncSpawn ls.addProjectFileToPendingRequest(id.uint, uri)
431454
let nimsuggest = await ls.tryGetNimsuggest(uri)
432455
if nimsuggest.isNone:
456+
return newJNull()
457+
let ch = ls.getCharacter(uri, line, character)
458+
if ch.isNone:
433459
return newJNull()
434460
let def = await nimsuggest.get.def(
435461
uriToPath(uri),
436462
ls.uriToStash(uri),
437463
line + 1,
438-
ls.getCharacter(uri, line, character),
464+
ch.get,
439465
)
440466
if def.len == 0:
441467
return newJNull()
@@ -530,13 +556,16 @@ proc inlayHint*(
530556
if nimsuggest.isNone or nimsuggest.get.protocolVersion < 4 or
531557
not configuration.inlayHintsEnabled:
532558
return @[]
559+
let ch = ls.getCharacter(uri, start.line, start.character)
560+
if ch.isNone:
561+
return @[]
533562
let suggestions = await nimsuggest.get.inlayHints(
534563
uriToPath(uri),
535564
ls.uriToStash(uri),
536565
start.line + 1,
537-
ls.getCharacter(uri, start.line, start.character),
566+
ch.get,
538567
`end`.line + 1,
539-
ls.getCharacter(uri, `end`.line, `end`.character),
568+
ch.get,
540569
" +exceptionHints +parameterHints",
541570
)
542571
result = suggestions
@@ -660,12 +689,14 @@ proc signatureHelp*(
660689
if nsCon notin nimSuggest.get.capabilities:
661690
#support signatureHelp only if the current version of NimSuggest supports it.
662691
return none[SignatureHelp]()
663-
692+
let ch = ls.getCharacter(uri, line, character)
693+
if ch.isNone:
694+
return none[SignatureHelp]()
664695
let completions = await nimsuggest.get.con(
665696
uriToPath(uri),
666697
ls.uriToStash(uri),
667698
line + 1,
668-
ls.getCharacter(uri, line, character),
699+
ch.get,
669700
)
670701
let signatures = completions.map(toSignatureInformation)
671702
if signatures.len() > 0:
@@ -735,11 +766,14 @@ proc documentHighlight*(
735766
let nimsuggest = await ls.tryGetNimsuggest(uri)
736767
if nimsuggest.isNone:
737768
return @[]
769+
let ch = ls.getCharacter(uri, line, character)
770+
if ch.isNone:
771+
return @[]
738772
let suggestLocations = await nimsuggest.get.highlight(
739773
uriToPath(uri),
740774
ls.uriToStash(uri),
741775
line + 1,
742-
ls.getCharacter(uri, line, character),
776+
ch.get,
743777
)
744778
result = suggestLocations.map(toDocumentHighlight)
745779

0 commit comments

Comments
 (0)