Fix unpacking first-class module in default argument of react component#8296
Merged
Fix unpacking first-class module in default argument of react component#8296
Conversation
rescript
@rescript/darwin-arm64
@rescript/darwin-x64
@rescript/linux-arm64
@rescript/linux-x64
@rescript/runtime
@rescript/win32-x64
commit: |
cristianoc
approved these changes
Mar 13, 2026
Collaborator
cristianoc
left a comment
There was a problem hiding this comment.
This changes generated code for non-first-class-module cases, but seems legit to be consistent.
Member
Author
Yes, I did have a version with more special cases before, but didn't quite like it. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #7917
PR Description: Fix module unpacking in default React props
Summary
This change fixes React component arguments that both:
The motivating case is:
Before this change, the JSX PPX lowered defaulted props in a way that only worked reliably for simple variable patterns. First-class module unpacking patterns need to happen after the optional prop has already been resolved to a plain value.
Problem
For defaulted props, the PPX needs to transform:
into the internal props-record form used by React components.
The old lowering coupled optional-prop handling too closely to the original pattern shape. That works for identifiers, but not for module-unpack patterns, because unpacking
module(C: S)must happen in a standaloneletpattern over a resolved value, not inside theoption-handling step.Fix
The fix makes defaulted props go through a uniform two-step lowering:
__<label>.__<label>_value.let.Conceptually, the generated code now looks like:
This preserves the existing behavior for simple defaulted props while making first-class module unpacking work correctly.
Tests
The change is covered at two levels:
tests/syntax_tests/data/ppx/react/defaultPatternProp.restests/build_tests/react_ppx/src/issue_7917_test.resWhy this shape
This approach is simpler than special-casing only variable-like patterns: