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 diff --git a/compiler/syntax/src/res_core.ml b/compiler/syntax/src/res_core.ml index cb4096661e..30adeea5ee 100644 --- a/compiler/syntax/src/res_core.ml +++ b/compiler/syntax/src/res_core.ml @@ -1812,8 +1812,7 @@ 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 p.prev_end_pos in let payload = @@ -1826,7 +1825,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 @@ -1903,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 -> ( 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/ { + () +}