From 10bd5ee96ebdd04c63ca9319a4ac71cb1b81945a Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sun, 20 Jul 2025 13:18:20 +0200 Subject: [PATCH 1/3] fix regex literal loc --- compiler/syntax/src/res_core.ml | 12 ++++++++++-- ..._file.res.expected => regex_literal.res.expected} | 6 +++++- .../super_errors/fixtures/extract_from_none_file.res | 5 ----- .../super_errors/fixtures/regex_literal.res | 3 +++ 4 files changed, 18 insertions(+), 8 deletions(-) rename tests/build_tests/super_errors/expected/{extract_from_none_file.res.expected => regex_literal.res.expected} (51%) delete mode 100644 tests/build_tests/super_errors/fixtures/extract_from_none_file.res create mode 100644 tests/build_tests/super_errors/fixtures/regex_literal.res diff --git a/compiler/syntax/src/res_core.ml b/compiler/syntax/src/res_core.ml index cb4096661e..ae8a516a86 100644 --- a/compiler/syntax/src/res_core.ml +++ b/compiler/syntax/src/res_core.ml @@ -1815,7 +1815,15 @@ and parse_constrained_expr_region p = and parse_regex p pattern flags = let start_pos = p.Parser.start_pos in Parser.next p; - let loc = mk_loc start_pos p.prev_end_pos in + let loc = + mk_loc + { + start_pos with + (* Account for the inserted leading `/` *) + pos_cnum = start_pos.pos_cnum - 1; + } + p.prev_end_pos + in let payload = Parsetree.PStr [ @@ -1826,7 +1834,7 @@ and parse_regex p pattern flags = if p.mode = ParseForTypeChecker then Some "js" else None ))); ] in - Ast_helper.Exp.extension (Location.mknoloc "re", payload) + Ast_helper.Exp.extension (Location.mkloc "re" loc, payload) (* Atomic expressions represent unambiguous expressions. * This means that regardless of the context, these expressions diff --git a/tests/build_tests/super_errors/expected/extract_from_none_file.res.expected b/tests/build_tests/super_errors/expected/regex_literal.res.expected similarity index 51% rename from tests/build_tests/super_errors/expected/extract_from_none_file.res.expected rename to tests/build_tests/super_errors/expected/regex_literal.res.expected index 18f5c95880..7154fe074c 100644 --- a/tests/build_tests/super_errors/expected/extract_from_none_file.res.expected +++ b/tests/build_tests/super_errors/expected/regex_literal.res.expected @@ -1,6 +1,10 @@ We've found a bug for you! - /.../fixtures/extract_from_none_file.res + /.../fixtures/regex_literal.res:1:7-11 + + 1 │ while /foo/ { + 2 │ () + 3 │ } This has type: RegExp.t But a while loop condition must always be of type: bool \ No newline at end of file diff --git a/tests/build_tests/super_errors/fixtures/extract_from_none_file.res b/tests/build_tests/super_errors/fixtures/extract_from_none_file.res deleted file mode 100644 index 844d286f1f..0000000000 --- a/tests/build_tests/super_errors/fixtures/extract_from_none_file.res +++ /dev/null @@ -1,5 +0,0 @@ -// This will try and extract the text from a non-existing file. -// Test is intended to check that this does not crash. -while /foo/ { - () -} diff --git a/tests/build_tests/super_errors/fixtures/regex_literal.res b/tests/build_tests/super_errors/fixtures/regex_literal.res new file mode 100644 index 0000000000..5a0193ec92 --- /dev/null +++ b/tests/build_tests/super_errors/fixtures/regex_literal.res @@ -0,0 +1,3 @@ +while /foo/ { + () +} From 666562c98acf5d1f32c067411d7961d4d5aa6aae Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sun, 20 Jul 2025 13:21:10 +0200 Subject: [PATCH 2/3] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17f81ce6e5..af5459c233 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ - Fix `--create-sourcedirs` generation with for a single project. https://github.com/rescript-lang/rescript/pull/7671 - Fix rewatch not recompiling on changes under windows. https://github.com/rescript-lang/rescript/pull/7690 +- Fix locations of regex literals. https://github.com/rescript-lang/rescript/pull/7683 # 12.0.0-beta.2 From ee43d01d94e375eae3584e028e8b38704cfd56ca Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Mon, 21 Jul 2025 18:36:11 +0200 Subject: [PATCH 3/3] more sane fix --- compiler/syntax/src/res_core.ml | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/compiler/syntax/src/res_core.ml b/compiler/syntax/src/res_core.ml index ae8a516a86..30adeea5ee 100644 --- a/compiler/syntax/src/res_core.ml +++ b/compiler/syntax/src/res_core.ml @@ -1812,18 +1812,9 @@ and parse_constrained_expr_region p = | _ -> Some expr) | _ -> None -and parse_regex p pattern flags = - let start_pos = p.Parser.start_pos in +and parse_regex ~start_pos p pattern flags = Parser.next p; - let loc = - mk_loc - { - start_pos with - (* Account for the inserted leading `/` *) - pos_cnum = start_pos.pos_cnum - 1; - } - p.prev_end_pos - in + let loc = mk_loc start_pos p.prev_end_pos in let payload = Parsetree.PStr [ @@ -1911,13 +1902,13 @@ and parse_atomic_expr p = | Forwardslash -> ( Parser.next_regex_token p; match p.token with - | Regex (pattern, flags) -> parse_regex p pattern flags + | Regex (pattern, flags) -> parse_regex ~start_pos p pattern flags | _ -> Ast_helper.Exp.extension (Location.mknoloc "re", Parsetree.PStr []) ) | ForwardslashDot -> ( Parser.next_regex_token p; match p.token with - | Regex (pattern, flags) -> parse_regex p ("." ^ pattern) flags + | Regex (pattern, flags) -> parse_regex ~start_pos p ("." ^ pattern) flags | _ -> Ast_helper.Exp.extension (Location.mknoloc "re", Parsetree.PStr []) ) | token -> (