From 028711ae3740bf7e49eed458c5d3c47364fa6be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= Date: Mon, 26 May 2025 12:32:15 +0100 Subject: [PATCH 1/4] Check offset >= 0 before doing text.[offset] --- analysis/src/CompletionFrontEnd.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analysis/src/CompletionFrontEnd.ml b/analysis/src/CompletionFrontEnd.ml index 2c2b49380e..09736483ec 100644 --- a/analysis/src/CompletionFrontEnd.ml +++ b/analysis/src/CompletionFrontEnd.ml @@ -373,7 +373,7 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor in let posOfDot = Pos.posOfDot text ~pos:posCursor ~offset in let charAtCursor = - if offset < String.length text then text.[offset] else '\n' + if offset >= 0 && offset < String.length text then text.[offset] else '\n' in let posBeforeCursor = Pos.posBeforeCursor posCursor in let charBeforeCursor, blankAfterCursor = From 03deb09a7ba5b2bd5171e9f73e3f7a23dab5ed2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= Date: Mon, 26 May 2025 12:40:59 +0100 Subject: [PATCH 2/4] Check offsetEnd >= offsetStart >=0 before doing `String.sub text offsetStart (offsetEnd - offsetStart)` --- analysis/src/CompletionFrontEnd.ml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/analysis/src/CompletionFrontEnd.ml b/analysis/src/CompletionFrontEnd.ml index 09736483ec..9493aa8490 100644 --- a/analysis/src/CompletionFrontEnd.ml +++ b/analysis/src/CompletionFrontEnd.ml @@ -869,7 +869,8 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor match (Pos.positionToOffset text posStart, Pos.positionToOffset text posEnd) with - | Some offsetStart, Some offsetEnd -> + | Some offsetStart, Some offsetEnd + when offsetStart >= 0 && offsetEnd >= offsetStart -> (* Can't trust the parser's location E.g. @foo. let x... gives as label @foo.let *) let label = From 816565d1d32da52c6d033ca58b5dc28bd49fa652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= Date: Mon, 26 May 2025 12:41:53 +0100 Subject: [PATCH 3/4] Ensure Pos.positionToOffset does not return negative offsets --- analysis/src/Pos.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/analysis/src/Pos.ml b/analysis/src/Pos.ml index e20af11e59..d739c9dae1 100644 --- a/analysis/src/Pos.ml +++ b/analysis/src/Pos.ml @@ -22,8 +22,8 @@ let positionToOffset text (line, character) = match offsetOfLine text line with | None -> None | Some bol -> - if bol + character <= String.length text then Some (bol + character) - else None + let offset = bol + character in + if offset >= 0 && offset <= String.length text then Some offset else None let posBeforeCursor pos = (fst pos, max 0 (snd pos - 1)) From f6944f5573018baff55f3bb15b87baafb7bc4b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= Date: Mon, 26 May 2025 13:04:41 +0100 Subject: [PATCH 4/4] Add CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6088034e6..07fedec435 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ #### :bug: Bug fix - `rescript-tools doc` no longer includes shadowed bindings in its output. https://github.com/rescript-lang/rescript/pull/7497 +- Fix `index out of bounds` exception thrown in rare cases by `rescript-editor-analysis.exe codeAction` command. https://github.com/rescript-lang/rescript/pull/7523 #### :nail_care: Polish