-
Notifications
You must be signed in to change notification settings - Fork 585
Single-pass expression analysis groundwork - answer type questions from ExpressionResults #5857
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ondrejmirtes
wants to merge
434
commits into
2.2.x
Choose a base branch
from
resolve-type-rewrite-2
base: 2.2.x
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
434 commits
Select commit
Hold shift + click to select a range
9ecdd80
Reprocess coalesce/ternary/match subjects on their narrowed scopes in…
ondrejmirtes 93db202
Reprocess the foreach iteratee on the post-loop scope for value/key-t…
ondrejmirtes 7a2021f
Narrow the pinned-name property fetch via applySpecifiedTypes, not fi…
ondrejmirtes d19e1de
Make specifyTypesCallback required and getSpecifiedTypesForScope non-…
ondrejmirtes d894c54
Narrow synthetic conditions via processExprOnDemand, not filterByTrut…
ondrejmirtes ae82c7c
Read wrapped operand types via getType/getNativeType in cast/clone/un…
ondrejmirtes 2ae3433
Read child types via getType/getNativeType in post/pre-inc/dec, pipe,…
ondrejmirtes 932c944
Read the ternary condition type via getType/getNativeType in the type…
ondrejmirtes 803d230
Propagate the assigned value into byref-intertwined variables instead…
ondrejmirtes 3982561
Read binary-op operands via getType/getNativeType in the type callback
ondrejmirtes cff7b4f
Read the left operand boolean via getType/getNativeType in boolean ty…
ondrejmirtes 3ca756e
Resolve property fetch types without the asking scope
ondrejmirtes a685fe6
Resolve static property fetch types without the asking scope
ondrejmirtes 1d99eac
Resolve method call return types without the asking scope
ondrejmirtes efd0002
Resolve static call return types without the asking scope
ondrejmirtes 44d245b
Resolve function call return types without the asking scope
ondrejmirtes cc5190a
Resolve nullsafe fetch/call short-circuit types without the asking scope
ondrejmirtes e807c01
Read assignment and class-constant-fetch type callbacks via getType/g…
ondrejmirtes c492f0d
Read instanceof and coalesce type callbacks without the asking scope
ondrejmirtes 24e139c
Read assign-op type callback without the asking scope
ondrejmirtes f3841fc
Pass the iteratee types into enterForeach instead of re-reading them
ondrejmirtes c8d7628
Pass the iteratee types into enterForeachKey instead of re-reading them
ondrejmirtes 0ced7ff
Make the ExpressionResult typeCallback resolve from a native flag, no…
ondrejmirtes 991f348
Require an ExpressionResult to have either a precomputed type or a ty…
ondrejmirtes 2620c2a
Read the tracked holder directly in ExpressionResult, not via Scope::…
ondrejmirtes d09bc4f
Get rid of truthyScopeCallback and falseyScopeCallback
ondrejmirtes 2e6dd71
Use the operand's own truthy/falsey scope for &&/|| narrowing
ondrejmirtes 080797b
Record conditional holders from by-ref-updated variables via scope state
ondrejmirtes efc34ad
Derive statement exit points from never instead of findEarlyTerminati…
ondrejmirtes 5e966bd
Narrower return type
ondrejmirtes 57c15e9
Do not use getChildSpecifiedTypes
ondrejmirtes c48b6a6
Inline getSpecifiedTypesForScope instead of getChildSpecifiedTypes
ondrejmirtes 2706ece
Keep getType for the dropped-self-condition complement
ondrejmirtes 0e025ec
Add regression test for the type of a Closure::bind callback
ondrejmirtes 1ee845c
Add regression test for array value type after foreach by-ref reassig…
ondrejmirtes f7a00be
Add regression test for list<non-empty-array> preserved after foreach…
ondrejmirtes ec294cd
Add regression test for ??= on a dynamic property array offset
ondrejmirtes b8a7298
Resolve ExpressionResult types from memoized per-flavour slots
ondrejmirtes 4977c2a
Split readStoredOrPriceOnDemand into decisive primitives
ondrejmirtes 8f0c911
Reintroduce readStoredResult as a storage-based assertion
ondrejmirtes 32439d5
Narrow ?? by composing isset facts from chain results, not a syntheti…
ondrejmirtes a88fd29
Compose multi-subject isset() truthy narrowing from chain results
ondrejmirtes 8b712a1
Consume the match arms' captured scope/type pairs instead of re-walki…
ondrejmirtes 0a6983e
Answer plain variable reads from scope state instead of on-demand pro…
ondrejmirtes 7043b41
Run AnalyserTest through FiberNodeScopeResolver like the other test h…
ondrejmirtes 1599b3b
Resolve the offset-write property holder without re-reading the receiver
ondrejmirtes bc5892c
Answer maybe-stored reads from a tracked whole-expression holder with…
ondrejmirtes 7bb3965
Skip the null-containment probe for bare variable narrowing subjects
ondrejmirtes b2e4087
Pin the dropped-self-condition complement type at holder-build time
ondrejmirtes cd60431
Compose createSubjectTypes entries from the result's own facts, never…
ondrejmirtes d2a4d6e
Collapse filterByTruthyValue/filterByFalseyValue onto applySpecifiedT…
ondrejmirtes 470290d
Narrow match scopes via applySpecifiedTypes instead of filterBy*
ondrejmirtes 965c365
Compute call narrowing on the evaluation scope, flavoured by the aski…
ondrejmirtes 8ea385a
Compose null-identity narrowing from operand results in IdenticalNarr…
ondrejmirtes 5273956
Narrow bool-literal identity comparisons in IdenticalNarrowingHelper
ondrejmirtes dd1795d
Narrow scalar-literal identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 6cc090b
Compose array_key_first-family null narrowing through the FuncCall co…
ondrejmirtes 38a456a
Narrow get_class/get_debug_type identity comparisons in IdenticalNarr…
ondrejmirtes b012c94
Narrow gettype identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 9e43349
Narrow preg_match identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 8d668b8
Narrow strlen/mb_strlen identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 4689aee
Move count-size narrowing into CountNarrowingHelper
ondrejmirtes 4bf9278
Narrow count/sizeof identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 9fe8149
Narrow string-function identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 8d2f751
Narrow trim and get_parent_class identity comparisons in IdenticalNar…
ondrejmirtes 5285b28
Narrow ::class identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 356ba2a
Narrow general identity comparisons in IdenticalNarrowingHelper
ondrejmirtes a4b3b85
Compose function-family narrowing for type-based constant sides
ondrejmirtes 4f49c1c
Narrow loose-equality comparisons in IdenticalNarrowingHelper
ondrejmirtes c1da2a3
Compose assign-time conditional holders from the assigned expression'…
ondrejmirtes 5402695
Read assign-time ternary holder types from the captured walk results
ondrejmirtes 6e36036
Extract conjunction narrowing into BooleanNarrowingHelper
ondrejmirtes 0f842a5
Fold multi-subject isset narrowing through the conjunction helper
ondrejmirtes f67e08d
Extract disjunction narrowing into BooleanNarrowingHelper
ondrejmirtes 2b98748
Share the single-subject isset narrowing in DefaultNarrowingHelper
ondrejmirtes 01cf35c
Compose empty() narrowing through the disjunction helper
ondrejmirtes 1fdb764
Compose ternary narrowing through the boolean helpers
ondrejmirtes 56a3a06
Compose cast narrowing through the loose-equality helper
ondrejmirtes fb3352d
Read tracked foreach and @var types without synthetic pricing
ondrejmirtes fc1bf53
Capture call-argument results for the composed comparison narrowing
ondrejmirtes b10a1c2
Narrow bool-typed identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 75dc83e
Merge both directions of call-vs-call identity comparisons
ondrejmirtes 7f6568a
Compose the last identity-comparison tails
ondrejmirtes 4839aa9
Delete the old-world equality narrowing
ondrejmirtes 2cb97c9
Key the closure type cache by the closure's actual inputs
ondrejmirtes de385ba
Read assign sentinel base result from the walk storage
ondrejmirtes 77d0de5
Compose comparison verdicts from captured results instead of re-walking
ondrejmirtes 582da03
Compose nullsafe method call null-removal from the receiver's stored …
ondrejmirtes 39b7f49
Compose nullsafe property fetch null-removal from the receiver's stor…
ondrejmirtes e13f0c4
Compose variable-variable narrowing from the name expression's result
ondrejmirtes 56bc4fc
Read by-ref destructuring item types from the scope directly
ondrejmirtes 2b262b4
Compose match arm condition verdicts and narrowing from walk results
ondrejmirtes a451256
Use default narrowing directly for bool-variable contradiction probing
ondrejmirtes 742e735
Compose single-condition match arm filtering verdicts from walk results
ondrejmirtes a2de5e1
Reuse the ensured-scope call result for the nullsafe maybe-null type
ondrejmirtes 93d9130
Extract the coalesce type and falsey-narrowing composition into a helper
ondrejmirtes c0415b0
Compose ??= type and narrowing via the coalesce helper instead of syn…
ondrejmirtes 1163143
Skip the synthetic constructor-call pricing when the return type cann…
ondrejmirtes 806794c
Answer Scope::getType for a plain variable from scope state, not on d…
ondrejmirtes 8590632
Prime the storage with argument results before dynamic function exten…
ondrejmirtes 84fa161
Prime the storage for method and static call dynamic-return extension…
ondrejmirtes d88f58c
Revert "Answer Scope::getType for a plain variable from scope state, …
ondrejmirtes 1b5bacd
Revert "Skip the synthetic constructor-call pricing when the return t…
ondrejmirtes e7943a5
Revert "Compose ??= type and narrowing via the coalesce helper instea…
ondrejmirtes 1ef4ed6
Read narrowing subjects' current types from scope state, not on demand
ondrejmirtes a9dd57a
Derive non-nullability ensure types from scope state, not on demand
ondrejmirtes e238bb6
Derive narrowing-application base types from scope state, not on demand
ondrejmirtes c90893f
Keep void in typeCallbacks; project void to null at the value-read bo…
ondrejmirtes 9f7f4a8
Push the walk's storage onto the scope-visible stack in processStmtNo…
ondrejmirtes 74bfc1f
Move @phpstan-assert narrowing into DefaultNarrowingHelper, off TypeS…
ondrejmirtes 368f1db
Move conditional-return-type narrowing into DefaultNarrowingHelper, o…
ondrejmirtes 0647d6d
Finish the conditional-return-type move: remaining call sites + delet…
ondrejmirtes 54b9134
Gate call-shaped narrowing subjects by reflection instead of walking …
ondrejmirtes 45e2cff
Memoize the narrowing-application pricing pair per scope
ondrejmirtes 1b71b92
Replace SpecifiedTypes::normalize() with symbolic alternative-form en…
ondrejmirtes 9358a84
Defer boolean conditional-holder math to the application point
ondrejmirtes 3d40492
Defer the either-branch union recovery to the application point
ondrejmirtes a2ce19d
Defer the disjunction holder projection to the application point
ondrejmirtes f71a5de
Compute disjunction decided-operand verdicts at the evaluation point
ondrejmirtes 1163872
Compute comparison, coalesce and nullsafe-twin verdicts at the evalua…
ondrejmirtes df94147
Resolve isset/coalesce issetability verdicts on the evaluation scope
ondrejmirtes ed2aee5
Derive decomposition branch scopes from the evaluation point, not per…
ondrejmirtes 2051c5e
Compose nullsafe narrowing from captured results instead of walking a…
ondrejmirtes 2a8da34
Read isset chain-link types on the evaluation point
ondrejmirtes 254676f
Memoize specify results per (context, flavour) at the evaluation point
ondrejmirtes a804a2a
Flip specifyTypesCallback to (TypeSpecifierContext, bool)
ondrejmirtes 875bc57
Port the coalesce falsey-context gate to the composed narrowing
ondrejmirtes d2ccef2
Resolve boolean-decomposition branch scopes lazily
ondrejmirtes 943c5f8
Flip createTypesCallback to (Type, TypeSpecifierContext, bool)
ondrejmirtes 4e0fecf
Read match arm verdicts from the threaded per-arm state
ondrejmirtes a6d4db9
Answer foreign-position type asks from the scope's state uniformly
ondrejmirtes 2b18f04
Read nullsafe receivers from before the enclosing ensure's device types
ondrejmirtes 090a710
Release each file's captured results; drop dead filterBy* scope caches
ondrejmirtes 1d8af07
Release resolved typeCallbacks, share the empty specify closure, move…
ondrejmirtes 1d512d0
Process function and method bodies against a per-body result storage …
ondrejmirtes e3da6b3
Read ternary branch results on their processing scopes
ondrejmirtes 4fce323
Expect the flavour-pure native type in the match arm always-true message
ondrejmirtes 1d0a53e
Revert "Expect the flavour-pure native type in the match arm always-t…
ondrejmirtes 649cede
Collect branch-union candidates from sureNot narrowings, skip templat…
ondrejmirtes 3a5739b
Revert maybe-existing property promotion to its declared type
ondrejmirtes cad557c
Bind static to the named class when calling a static method through a…
ondrejmirtes f4be095
Strip the nullsafe short-circuit null from a static call's class-expr…
ondrejmirtes 01f4576
Fan receiver-not-null through nullsafe chains from composed create ca…
ondrejmirtes 12c47e7
Re-price stored results asked at a diverging variable position
ondrejmirtes 4323629
Restore per-item array_map expectations lifted by counterfactual re-p…
ondrejmirtes eee1af2
Process the nullsafe receiver once and let the plain twin consume its…
ondrejmirtes 55892c4
Exempt closures and arrow functions from the PHPSTAN_GUARD_NW pre-pro…
ondrejmirtes 3b5e2d2
Exempt constant shapes and variable reads from the PHPSTAN_GUARD_NW g…
ondrejmirtes fad264e
Sanction deliberate before-the-walk reads under the PHPSTAN_GUARD_NW …
ondrejmirtes 4fc30ce
Sanction closure-signature reads of parameter defaults and sibling ca…
ondrejmirtes fb5c867
Revert the PHPSTAN_GUARD_NW exemptions and sanctioned reads
ondrejmirtes afad6b3
Carry narrowing subjects' ExpressionResults into SpecifiedTypes
ondrejmirtes 64aba32
Attach a result to its own narrowing entries as a weak subject reference
ondrejmirtes ba751b7
Consume or cache-price closure arguments in on-demand call re-walks
ondrejmirtes 45b778b
Skip the synthetic constructor-call pricing when the return type cann…
ondrejmirtes bc3708a
Derive argument-less call subjects' narrowing base from reflection state
ondrejmirtes e47c403
Revert carrying narrowing subjects' ExpressionResults in SpecifiedTypes
ondrejmirtes 8891add
Compose ??= from its child results like CoalesceHandler
ondrejmirtes d167878
Store the post-inc/dec synthetic's result before the virtual assign
ondrejmirtes a9d403d
Fabricate virtual assigned-expr results instead of pricing them on de…
ondrejmirtes 7dea808
Add regression test for #14914
ondrejmirtes 611a0b4
Add regression test for #14908
ondrejmirtes 41dd2be
Add required lint version comments to bug-14914 and bug-14908 fixtures
ondrejmirtes 3e161fc
Read the foreach iteratee off the scope instead of re-walking it
ondrejmirtes c5c0cbe
Compose the foreach non-empty-iteratee narrowing from the iteratee's …
ondrejmirtes 2b13953
Compose switch case narrowing and read match/switch subjects off the …
ondrejmirtes 0b11776
Read the coalesce left side off the left-is-set scope instead of re-w…
ondrejmirtes af6554a
Read the short-ternary condition off its truthy scope instead of re-w…
ondrejmirtes f58645b
Memoize flush-priced results for repeated rule asks
ondrejmirtes d037db9
Revert "Memoize flush-priced results for repeated rule asks"
ondrejmirtes d1a9e54
Build closure/arrow call-arg types from the single body walk
ondrejmirtes bc38540
Select the per-argument metadata acceptor only where its resolution i…
ondrejmirtes 9e3f373
Make pass-local storages scope-visible and consume loop condition res…
ondrejmirtes 4832011
Memoize the generator check per function-like node
ondrejmirtes a05eafc
Answer stored fiber asks without suspending
ondrejmirtes c2a3f52
Answer invalidation checks from a per-holder index of contained node …
ondrejmirtes 9181bce
Memoize flush-priced answers for repeated rule asks
ondrejmirtes 2169ccb
Create merge conditionals from the differing holders only
ondrejmirtes c29cba1
Skip loop verification passes whose entry scope did not change
ondrejmirtes f428d92
Batch type specifications into one scope copy per application
ondrejmirtes 8b849f6
Run engine-feeding node-callback gatherers synchronously at the emiss…
ondrejmirtes 05b4fae
Align the isset verdict gate with 2.2.x and pin null in falsey isset …
ondrejmirtes f087002
Store the assign-target property fetch's pre-assign result for parked…
ondrejmirtes 32910e3
Price closure parameter defaults without a scope walk
ondrejmirtes 372a84b
Create the function call's impure point after its arguments are proce…
ondrejmirtes 424cb65
Restore the Array_ import dropped when replaying onto the ScopeOps ex…
ondrejmirtes 723d9dc
Update test expectations after the rebase onto 2.2.x
ondrejmirtes 0be539d
Remove the superseded ScopeOps invalidation helpers after the rebase
ondrejmirtes 6361ec5
Answer invalidation checks from ScopeOps again
ondrejmirtes 2a8477d
Sync the turbo native twins with the single-pass engine's shadowed cl…
ondrejmirtes 574250a
Pin turbo extension version to cac4327
ondrejmirtes a8ce64b
Resolve the call return type once per call
ondrejmirtes 0e624e1
Complete the stored preliminary call result in place instead of overw…
ondrejmirtes 45e300c
Walk closure by-ref convergence passes in deep statement context
ondrejmirtes 8005ebf
Drop unnecessary ?? null on always-set parameter types
ondrejmirtes 6be9e76
Fix use-statement order left by the rebase auto-merge
ondrejmirtes 8e4a47f
Price an offset read on never as ErrorType in the narrowing-base reader
ondrejmirtes 56f1544
Avoid the nullsafe operator - simple-downgrader passes it through
ondrejmirtes 6a83c53
Use ExtensionsCollection in ExpressionResult and tag PerFileAnalysisR…
ondrejmirtes 80446f5
Construct name checks from extensions collections in ClassConstantPhp…
ondrejmirtes 55852a2
Bump expected turbo version
ondrejmirtes 07263fc
Restore the default-value gate in the isset verdict
ondrejmirtes 473269b
Complete the callable-union parameter merge in createCallableParameters
ondrejmirtes 0b54274
Bump expected turbo version
ondrejmirtes 3419826
Absorb the upstream TypeSpecifierTest additions after the rebase
ondrejmirtes 5229108
Drop the upstream toSureTypes copy that flowed into the holder helper
ondrejmirtes 87ce290
Bump expected turbo version
ondrejmirtes 6a2b33e
Drop the upstream duplicate of the differingKeys smoke block
ondrejmirtes 924c054
Split processAssignVar into prepareTarget and applyWrite
ondrejmirtes cb2b86a
Produce the assignment target's read result inside prepareTarget
ondrejmirtes 9449383
Pass the assigned value's result into applyWrite instead of pre-stori…
ondrejmirtes 65557d5
Compose the ??= read from the walked target instead of a second walk
ondrejmirtes cc4c446
Compose target reads from handler composition methods, thread operand…
ondrejmirtes aa53945
Thread more in-hand results through the assignment narrowing and writ…
ondrejmirtes d86cd8b
Bump expected turbo version
ondrejmirtes 237b5ff
Remove the ISSET_DEBUG diagnostic leftover
ondrejmirtes 7046d7b
Emit SwitchConditionNode from the branch's switch processing
ondrejmirtes 79c1c92
Walk the dynamic variable name once in prepareTarget
ondrejmirtes 4fcfe6c
Reference the original chain in ExistingArrayDimFetch, drop the clone…
ondrejmirtes db9321a
Derive simulated-call throw points directly instead of walking synthe…
ondrejmirtes 2462286
Resolve offsetGet and __toString return types directly
ondrejmirtes e2afaa3
Thread captured results through the remaining call-handler reads
ondrejmirtes b9eb2d9
Thread dynamic name and class results through fetch and call typeCall…
ondrejmirtes 1ee8e20
Make the remaining handler type readers explicit about synthetic pricing
ondrejmirtes 0267367
Delete findStoredResult and split readTypeOfMaybeStored's state fast …
ondrejmirtes ef020a2
Convert tracked-holder reads to readScopeStateOrSyntheticType
ondrejmirtes 36b712b
Capture comparison-specify subresults at creation instead of the storage
ondrejmirtes 778aa68
Drop captures and parameters orphaned by the maybe-stored elimination
ondrejmirtes 1c34f46
Restore ??= right-side-scope tests dropped in rebase
ondrejmirtes 8a8e731
Narrow the right side of ??= with falsey isset() semantics
ondrejmirtes c58325b
Resolve the native flavour of closure parameters through parameter cl…
ondrejmirtes 344739e
Bump expected turbo version
ondrejmirtes ade71bd
Let the compositional-key shortcut clear virtual-node keys
ondrejmirtes 87fb7d6
Bump expected turbo version
ondrejmirtes 9fe9a3e
Drop the per-holder contained-node-keys invalidation index
ondrejmirtes a91dfef
Bump expected turbo version
ondrejmirtes 176c3dd
Replace WeakMaps with spl_object_id-keyed arrays and a node attribute
ondrejmirtes 7113817
Do not extend Expr in the call and nullsafe rule-facing virtual nodes
ondrejmirtes dcc8a51
Bump expected turbo version
ondrejmirtes cc31792
Gate the antecedent-swap on truthy narrowing equivalent to the truth
ondrejmirtes 0a8def2
Bump expected turbo version
ondrejmirtes 7303c9f
Remove test methods duplicated by the rebase
ondrejmirtes 0925435
Conjoin alternative-form entries in SpecifiedTypes::unionWith()
ondrejmirtes db5aef2
Bump expected turbo version
ondrejmirtes b264802
Drop the cache-seeding call that flowed in from the upstream rebase
ondrejmirtes 9266090
Construct VirtualAssignNodeCallback through its factory
ondrejmirtes 9601a53
Do not narrow the falsey branch of a nested isset() at its intermedia…
ondrejmirtes 9b005b3
Do not treat conditional-expression entries about a property fetch as…
ondrejmirtes 934ff43
Bump expected turbo version
ondrejmirtes 44a5b71
Add regression tests for #14999 and #13334
ondrejmirtes File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
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
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
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
Oops, something went wrong.
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this read
withFiber?