Repository navigation
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #8689 +/- ##
==========================================
+ Coverage 81.72% 81.74% +0.02%
==========================================
Files 460 460
Lines 64817 64827 +10
==========================================
+ Hits 52969 52995 +26
+ Misses 11848 11832 -16
🚀 New features to boost your workflow:
|
rescript
@rescript/belt
@rescript/darwin-arm64
@rescript/linux-arm64
@rescript/linux-x64
@rescript/runtime
@rescript/win32-x64
commit: |
|
Developer playground preview: https://rescript-lang.github.io/rescript/dev-playground/?version=pr-8689 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 24646c5cb8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
24646c5 to
08056a9
Compare
Changelog🚀 New Feature
Semantic Diff9 commits · Full page ✏️ Enable selective cross-module inlining for Option helpersbb8a422 · cknitt · Sep 28, 2026, 06:04 UTC · edited
✏️ Inline additional Option helpers across modulese33d56d · cknitt · Sep 28, 2026, 07:46 UTC · edited Option's filter, mapOr, getOr, orElse, isSome and isNone use ✏️ Document cross-module inlining featurecd458ae · cknitt · Sep 28, 2026, 07:49 UTC · edited Add the changelog fragment for ✏️ Refresh Option inlining snapshots after clean buildd44363e · cknitt · Sep 28, 2026, 07:55 UTC · edited A clean build of the tests inlines the Option helpers in more places than the incremental build the snapshots were made with. ✏️ Track CMJ changes for cross-module inlining008acbd · cknitt · Sep 28, 2026, 09:19 UTC · edited Rewatch now compares the .cmj itself instead of a separate .cmj.inline digest: exported JavaScript metadata, inline bodies included, can change without changing the .cmi, and callers compiled against the old .cmj are then stale. ✏️ Read CMJ digest header for incremental rebuildsb08d5b8 · cknitt · Sep 28, 2026, 09:53 UTC · edited The compiler writes the digest of a .cmj's contents in its first 16 bytes, so Rewatch can read that instead of hashing the whole file. Recompile dependents of a changed CMJ in the OCaml build systemb2066b0 · cknitt + Claude · Oct 27, 2026, 07:15 UTC
Publishing a byte-different CMJ now marks dependents dirty like a changed CMI, and the startup freshness check compares a dependent's CMT with the later of its dependency's CMI and CMJ. Review
Treat catch binders as bound in Lam_closure.free_variables01e3b54 · cknitt + Claude · Oct 29, 2026, 09:51 UTC Answers the Codex finding that an |
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Codex Review: Didn't find any major issues. Another round soon, please! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
`@inline(crossModule)` marks a closed function whose body the .cmj exports, so that other modules inline its calls as they would a local function. Option's forEach, map and flatMap use it. Signed-off-by: Christoph Knittel <ck@cca.io>
Option's filter, mapOr, getOr, orElse, isSome and isNone use `@inline(crossModule)` too. Signed-off-by: Christoph Knittel <ck@cca.io>
Add the changelog fragment for `@inline(crossModule)` and the Option helpers. Signed-off-by: Christoph Knittel <ck@cca.io>
A clean build of the tests inlines the Option helpers in more places than the incremental build the snapshots were made with. Signed-off-by: Christoph Knittel <ck@cca.io>
Rewatch now compares the .cmj itself instead of a separate .cmj.inline digest: exported JavaScript metadata, inline bodies included, can change without changing the .cmi, and callers compiled against the old .cmj are then stale. Signed-off-by: Christoph Knittel <ck@cca.io>
The compiler writes the digest of a .cmj's contents in its first 16 bytes, so Rewatch can read that instead of hashing the whole file. Signed-off-by: Christoph Knittel <ck@cca.io>
Why:
The OCaml build system, now the default `rescript`, recompiled
dependents only when a module's CMI changed. An `@inline(crossModule)`
body lives in the CMJ and can change while the CMI stays the same, so
callers kept the old inlined code, during a build and on the next build
after the dependency was compiled separately. Rust rewatch already
compares CMJ digests since the previous commits.
Publishing a byte-different CMJ now marks dependents dirty like a changed
CMI, and the startup freshness check compares a dependent's CMT with the
later of its dependency's CMI and CMJ.
Review: Does every implementation change now recompile dependents? Only
those whose CMJ bytes change, matching the Rust implementation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kbf3gKsWykY6KH4QSJ9Wrs
Signed-off-by: Christoph Knittel <ck@cca.io>
Answers the Codex finding that an `@inline(crossModule)` function whose `catch` handler inspects the exception was rejected as capturing a local value: the `Ltrywith` branch never added its exception binder to the local set, so the handler's uses of it counted as free variables. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kbf3gGkPma9LAZimuQjnrP Signed-off-by: Christoph Knittel <ck@cca.io>
The Temporal tests that master added call Option.isNone and Option.map, which are now inlined. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kbf3gLpf7RN1MiRcubPgRn Signed-off-by: Christoph Knittel <ck@cca.io>
5899ffe to
1dbd977
Compare
Add
@inline(crossModule)to opt individual functions into cross-module inlining, and use it for selectedOptionhelpers.Inlining copies a function’s body into its callers. If that body changes but its type does not, the caller must still be rebuilt; checking only the
.cmitype signature would leave the old body in the generated JavaScript.The compiler stores exported inline bodies in the existing
.cmjfile, alongside other JavaScript compilation metadata. Rewatch now compares the digest already stored in that file’s header before and after compiling a module. If it changes, Rewatch rebuilds dependents. This keeps implementation details out of.cmiand requires no new artifact. A.cmjchange unrelated to inlining may also cause a dependent rebuild.