-
Notifications
You must be signed in to change notification settings - Fork 584
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
427
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
427 commits
Select commit
Hold shift + click to select a range
652dd87
Carry the nullsafe receiver type to its rule via a virtual node
ondrejmirtes 07c2e0a
Drop the dead Expr parameter from ExpressionResult's typeCallback
ondrejmirtes fdb1d16
Build pre-inc/dec literal types via ConstantTypeHelper, not the scope
ondrejmirtes ad04f16
Resolve lexical context once at create()-time in three type callbacks
ondrejmirtes 9262b50
Resolve the instanceof Name class type once at create()-time
ondrejmirtes b273f64
Reprocess the switch subject for the exhaustiveness check instead of …
ondrejmirtes 98f4744
Reprocess the foreach iteratee and while condition on their narrowed …
ondrejmirtes f9b5f90
Reprocess coalesce/ternary/match subjects on their narrowed scopes in…
ondrejmirtes c8ca180
Reprocess the foreach iteratee on the post-loop scope for value/key-t…
ondrejmirtes b429310
Narrow the pinned-name property fetch via applySpecifiedTypes, not fi…
ondrejmirtes de01a64
Make specifyTypesCallback required and getSpecifiedTypesForScope non-…
ondrejmirtes 0f782aa
Narrow synthetic conditions via processExprOnDemand, not filterByTrut…
ondrejmirtes 4173dc1
Read wrapped operand types via getType/getNativeType in cast/clone/un…
ondrejmirtes ba6f5ee
Read child types via getType/getNativeType in post/pre-inc/dec, pipe,…
ondrejmirtes 144e9ba
Read the ternary condition type via getType/getNativeType in the type…
ondrejmirtes df64eb3
Propagate the assigned value into byref-intertwined variables instead…
ondrejmirtes cf0d8fb
Read binary-op operands via getType/getNativeType in the type callback
ondrejmirtes bb2ddf1
Read the left operand boolean via getType/getNativeType in boolean ty…
ondrejmirtes c216976
Resolve property fetch types without the asking scope
ondrejmirtes d217fd9
Resolve static property fetch types without the asking scope
ondrejmirtes 35371c6
Resolve method call return types without the asking scope
ondrejmirtes 0e73974
Resolve static call return types without the asking scope
ondrejmirtes d17f6ed
Resolve function call return types without the asking scope
ondrejmirtes 4c73419
Resolve nullsafe fetch/call short-circuit types without the asking scope
ondrejmirtes 40cbb2c
Read assignment and class-constant-fetch type callbacks via getType/g…
ondrejmirtes 3e6800f
Read instanceof and coalesce type callbacks without the asking scope
ondrejmirtes 2fbd76a
Read assign-op type callback without the asking scope
ondrejmirtes 919c25a
Pass the iteratee types into enterForeach instead of re-reading them
ondrejmirtes 8f65995
Pass the iteratee types into enterForeachKey instead of re-reading them
ondrejmirtes 482b997
Make the ExpressionResult typeCallback resolve from a native flag, no…
ondrejmirtes a25e167
Require an ExpressionResult to have either a precomputed type or a ty…
ondrejmirtes 0129fce
Read the tracked holder directly in ExpressionResult, not via Scope::…
ondrejmirtes 81acda8
Get rid of truthyScopeCallback and falseyScopeCallback
ondrejmirtes f0c4bce
Use the operand's own truthy/falsey scope for &&/|| narrowing
ondrejmirtes 9369bf5
Record conditional holders from by-ref-updated variables via scope state
ondrejmirtes a9598a4
Derive statement exit points from never instead of findEarlyTerminati…
ondrejmirtes c43d79d
Narrower return type
ondrejmirtes 93d6598
Do not use getChildSpecifiedTypes
ondrejmirtes 01e690b
Inline getSpecifiedTypesForScope instead of getChildSpecifiedTypes
ondrejmirtes 6144f62
Keep getType for the dropped-self-condition complement
ondrejmirtes df3bee1
Add regression test for the type of a Closure::bind callback
ondrejmirtes e57a615
Add regression test for array value type after foreach by-ref reassig…
ondrejmirtes ce894b5
Add regression test for list<non-empty-array> preserved after foreach…
ondrejmirtes e59706c
Add regression test for ??= on a dynamic property array offset
ondrejmirtes 2468122
Resolve ExpressionResult types from memoized per-flavour slots
ondrejmirtes 019db52
Split readStoredOrPriceOnDemand into decisive primitives
ondrejmirtes 9e13302
Reintroduce readStoredResult as a storage-based assertion
ondrejmirtes c4ce7cc
Narrow ?? by composing isset facts from chain results, not a syntheti…
ondrejmirtes d2a82a2
Compose multi-subject isset() truthy narrowing from chain results
ondrejmirtes d5223dc
Consume the match arms' captured scope/type pairs instead of re-walki…
ondrejmirtes a58ead9
Answer plain variable reads from scope state instead of on-demand pro…
ondrejmirtes 29a6521
Run AnalyserTest through FiberNodeScopeResolver like the other test h…
ondrejmirtes d6e8258
Resolve the offset-write property holder without re-reading the receiver
ondrejmirtes 7ba3cae
Answer maybe-stored reads from a tracked whole-expression holder with…
ondrejmirtes 4d09703
Skip the null-containment probe for bare variable narrowing subjects
ondrejmirtes 6f37856
Pin the dropped-self-condition complement type at holder-build time
ondrejmirtes b55d065
Compose createSubjectTypes entries from the result's own facts, never…
ondrejmirtes 173be91
Collapse filterByTruthyValue/filterByFalseyValue onto applySpecifiedT…
ondrejmirtes 666af65
Narrow match scopes via applySpecifiedTypes instead of filterBy*
ondrejmirtes 6fae4e9
Compute call narrowing on the evaluation scope, flavoured by the aski…
ondrejmirtes 1921972
Compose null-identity narrowing from operand results in IdenticalNarr…
ondrejmirtes 673558a
Narrow bool-literal identity comparisons in IdenticalNarrowingHelper
ondrejmirtes dc24901
Narrow scalar-literal identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 063664c
Compose array_key_first-family null narrowing through the FuncCall co…
ondrejmirtes 314f459
Narrow get_class/get_debug_type identity comparisons in IdenticalNarr…
ondrejmirtes b8efb6d
Narrow gettype identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 11efc8e
Narrow preg_match identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 17f9357
Narrow strlen/mb_strlen identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 4a68d2e
Move count-size narrowing into CountNarrowingHelper
ondrejmirtes b5acc60
Narrow count/sizeof identity comparisons in IdenticalNarrowingHelper
ondrejmirtes ba32a59
Narrow string-function identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 775b36c
Narrow trim and get_parent_class identity comparisons in IdenticalNar…
ondrejmirtes 9880c3a
Narrow ::class identity comparisons in IdenticalNarrowingHelper
ondrejmirtes cc3c36c
Narrow general identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 0e0287d
Compose function-family narrowing for type-based constant sides
ondrejmirtes 8db2097
Narrow loose-equality comparisons in IdenticalNarrowingHelper
ondrejmirtes 727c840
Compose assign-time conditional holders from the assigned expression'…
ondrejmirtes 78b257e
Read assign-time ternary holder types from the captured walk results
ondrejmirtes b0506c3
Extract conjunction narrowing into BooleanNarrowingHelper
ondrejmirtes 1c823f0
Fold multi-subject isset narrowing through the conjunction helper
ondrejmirtes 6564cd8
Extract disjunction narrowing into BooleanNarrowingHelper
ondrejmirtes 96d0433
Share the single-subject isset narrowing in DefaultNarrowingHelper
ondrejmirtes 09654bb
Compose empty() narrowing through the disjunction helper
ondrejmirtes fee6f73
Compose ternary narrowing through the boolean helpers
ondrejmirtes 5637367
Compose cast narrowing through the loose-equality helper
ondrejmirtes 6f36069
Read tracked foreach and @var types without synthetic pricing
ondrejmirtes 704fe27
Capture call-argument results for the composed comparison narrowing
ondrejmirtes 31cea3b
Narrow bool-typed identity comparisons in IdenticalNarrowingHelper
ondrejmirtes 54b9761
Merge both directions of call-vs-call identity comparisons
ondrejmirtes 8e84f54
Compose the last identity-comparison tails
ondrejmirtes 8d0eb22
Delete the old-world equality narrowing
ondrejmirtes 521303a
Key the closure type cache by the closure's actual inputs
ondrejmirtes 58d5c35
Read assign sentinel base result from the walk storage
ondrejmirtes 963ee31
Compose comparison verdicts from captured results instead of re-walking
ondrejmirtes 9d024c6
Compose nullsafe method call null-removal from the receiver's stored …
ondrejmirtes a1c9943
Compose nullsafe property fetch null-removal from the receiver's stor…
ondrejmirtes c5b67e4
Compose variable-variable narrowing from the name expression's result
ondrejmirtes a224ef5
Read by-ref destructuring item types from the scope directly
ondrejmirtes b61019a
Compose match arm condition verdicts and narrowing from walk results
ondrejmirtes d34fe9d
Use default narrowing directly for bool-variable contradiction probing
ondrejmirtes 0a4f378
Compose single-condition match arm filtering verdicts from walk results
ondrejmirtes 657343c
Reuse the ensured-scope call result for the nullsafe maybe-null type
ondrejmirtes 95f2daf
Extract the coalesce type and falsey-narrowing composition into a helper
ondrejmirtes 1d284f2
Compose ??= type and narrowing via the coalesce helper instead of syn…
ondrejmirtes 967b15d
Skip the synthetic constructor-call pricing when the return type cann…
ondrejmirtes 4a5eee1
Answer Scope::getType for a plain variable from scope state, not on d…
ondrejmirtes 728fdf6
Prime the storage with argument results before dynamic function exten…
ondrejmirtes 078b152
Prime the storage for method and static call dynamic-return extension…
ondrejmirtes 33d20d3
Revert "Answer Scope::getType for a plain variable from scope state, …
ondrejmirtes e9cf62a
Revert "Skip the synthetic constructor-call pricing when the return t…
ondrejmirtes 794b831
Revert "Compose ??= type and narrowing via the coalesce helper instea…
ondrejmirtes 6022db3
Read narrowing subjects' current types from scope state, not on demand
ondrejmirtes 592519a
Derive non-nullability ensure types from scope state, not on demand
ondrejmirtes 9420b98
Derive narrowing-application base types from scope state, not on demand
ondrejmirtes ab69290
Keep void in typeCallbacks; project void to null at the value-read bo…
ondrejmirtes bc46e4e
Push the walk's storage onto the scope-visible stack in processStmtNo…
ondrejmirtes b54de46
Move @phpstan-assert narrowing into DefaultNarrowingHelper, off TypeS…
ondrejmirtes dadf296
Move conditional-return-type narrowing into DefaultNarrowingHelper, o…
ondrejmirtes 6d87ee3
Finish the conditional-return-type move: remaining call sites + delet…
ondrejmirtes c603c13
Gate call-shaped narrowing subjects by reflection instead of walking …
ondrejmirtes ea10d1a
Memoize the narrowing-application pricing pair per scope
ondrejmirtes 2db25ba
Replace SpecifiedTypes::normalize() with symbolic alternative-form en…
ondrejmirtes 24093ba
Defer boolean conditional-holder math to the application point
ondrejmirtes 5eaff8e
Defer the either-branch union recovery to the application point
ondrejmirtes dcac5b4
Defer the disjunction holder projection to the application point
ondrejmirtes 82ffff0
Compute disjunction decided-operand verdicts at the evaluation point
ondrejmirtes 10a489c
Compute comparison, coalesce and nullsafe-twin verdicts at the evalua…
ondrejmirtes f3df7f4
Resolve isset/coalesce issetability verdicts on the evaluation scope
ondrejmirtes d1094bf
Derive decomposition branch scopes from the evaluation point, not per…
ondrejmirtes 775f375
Compose nullsafe narrowing from captured results instead of walking a…
ondrejmirtes 4a2f552
Read isset chain-link types on the evaluation point
ondrejmirtes c6e81ba
Memoize specify results per (context, flavour) at the evaluation point
ondrejmirtes 260f67b
Flip specifyTypesCallback to (TypeSpecifierContext, bool)
ondrejmirtes ffb832d
Port the coalesce falsey-context gate to the composed narrowing
ondrejmirtes 4affbc7
Resolve boolean-decomposition branch scopes lazily
ondrejmirtes 9ae42aa
Flip createTypesCallback to (Type, TypeSpecifierContext, bool)
ondrejmirtes 91b984d
Read match arm verdicts from the threaded per-arm state
ondrejmirtes 8436c58
Answer foreign-position type asks from the scope's state uniformly
ondrejmirtes bd0182b
Read nullsafe receivers from before the enclosing ensure's device types
ondrejmirtes c4611aa
Release each file's captured results; drop dead filterBy* scope caches
ondrejmirtes fc7e5c7
Release resolved typeCallbacks, share the empty specify closure, move…
ondrejmirtes 25bf1b4
Process function and method bodies against a per-body result storage …
ondrejmirtes 32cef67
Read ternary branch results on their processing scopes
ondrejmirtes d2a44b7
Expect the flavour-pure native type in the match arm always-true message
ondrejmirtes ba3877c
Revert "Expect the flavour-pure native type in the match arm always-t…
ondrejmirtes 1942e02
Collect branch-union candidates from sureNot narrowings, skip templat…
ondrejmirtes 2816ffe
Revert maybe-existing property promotion to its declared type
ondrejmirtes 43722a8
Bind static to the named class when calling a static method through a…
ondrejmirtes 92a3a2b
Strip the nullsafe short-circuit null from a static call's class-expr…
ondrejmirtes 2a7f0d1
Fan receiver-not-null through nullsafe chains from composed create ca…
ondrejmirtes 86efee8
Re-price stored results asked at a diverging variable position
ondrejmirtes 9dc0a6b
Restore per-item array_map expectations lifted by counterfactual re-p…
ondrejmirtes 948dde3
Process the nullsafe receiver once and let the plain twin consume its…
ondrejmirtes 6157547
Exempt closures and arrow functions from the PHPSTAN_GUARD_NW pre-pro…
ondrejmirtes b7e588f
Exempt constant shapes and variable reads from the PHPSTAN_GUARD_NW g…
ondrejmirtes c24be60
Sanction deliberate before-the-walk reads under the PHPSTAN_GUARD_NW …
ondrejmirtes e8c1860
Sanction closure-signature reads of parameter defaults and sibling ca…
ondrejmirtes 0dc50b6
Revert the PHPSTAN_GUARD_NW exemptions and sanctioned reads
ondrejmirtes b694411
Carry narrowing subjects' ExpressionResults into SpecifiedTypes
ondrejmirtes e817be6
Attach a result to its own narrowing entries as a weak subject reference
ondrejmirtes 208e06c
Consume or cache-price closure arguments in on-demand call re-walks
ondrejmirtes c35e0c5
Skip the synthetic constructor-call pricing when the return type cann…
ondrejmirtes 8b268ec
Derive argument-less call subjects' narrowing base from reflection state
ondrejmirtes e51a478
Revert carrying narrowing subjects' ExpressionResults in SpecifiedTypes
ondrejmirtes 5af0907
Compose ??= from its child results like CoalesceHandler
ondrejmirtes 5109e3c
Store the post-inc/dec synthetic's result before the virtual assign
ondrejmirtes b0bcb49
Fabricate virtual assigned-expr results instead of pricing them on de…
ondrejmirtes 77c0443
Add regression test for #14914
ondrejmirtes 466a7fb
Add regression test for #14908
ondrejmirtes f60988e
Add required lint version comments to bug-14914 and bug-14908 fixtures
ondrejmirtes 84e3a6a
Read the foreach iteratee off the scope instead of re-walking it
ondrejmirtes d3dd86b
Compose the foreach non-empty-iteratee narrowing from the iteratee's …
ondrejmirtes 437465d
Compose switch case narrowing and read match/switch subjects off the …
ondrejmirtes d672d73
Read the coalesce left side off the left-is-set scope instead of re-w…
ondrejmirtes 20a46cc
Read the short-ternary condition off its truthy scope instead of re-w…
ondrejmirtes 9f7a458
Memoize flush-priced results for repeated rule asks
ondrejmirtes 581c822
Revert "Memoize flush-priced results for repeated rule asks"
ondrejmirtes 77e4861
Build closure/arrow call-arg types from the single body walk
ondrejmirtes 3e78b07
Select the per-argument metadata acceptor only where its resolution i…
ondrejmirtes 2fc2157
Make pass-local storages scope-visible and consume loop condition res…
ondrejmirtes 0443fa9
Memoize the generator check per function-like node
ondrejmirtes 315a795
Answer stored fiber asks without suspending
ondrejmirtes 64f7a6f
Answer invalidation checks from a per-holder index of contained node …
ondrejmirtes 09d9a3e
Memoize flush-priced answers for repeated rule asks
ondrejmirtes 60dea6e
Create merge conditionals from the differing holders only
ondrejmirtes ad9d906
Skip loop verification passes whose entry scope did not change
ondrejmirtes 598bcb0
Batch type specifications into one scope copy per application
ondrejmirtes b095c9e
Run engine-feeding node-callback gatherers synchronously at the emiss…
ondrejmirtes 3cfa080
Align the isset verdict gate with 2.2.x and pin null in falsey isset …
ondrejmirtes 5674070
Store the assign-target property fetch's pre-assign result for parked…
ondrejmirtes c230ab9
Price closure parameter defaults without a scope walk
ondrejmirtes 9c410ee
Create the function call's impure point after its arguments are proce…
ondrejmirtes 41d9b6a
Restore the Array_ import dropped when replaying onto the ScopeOps ex…
ondrejmirtes 6fb52f6
Update test expectations after the rebase onto 2.2.x
ondrejmirtes 4221f20
Remove the superseded ScopeOps invalidation helpers after the rebase
ondrejmirtes 272d533
Answer invalidation checks from ScopeOps again
ondrejmirtes 74cbd1c
Sync the turbo native twins with the single-pass engine's shadowed cl…
ondrejmirtes 1039ed5
Pin turbo extension version to cac4327
ondrejmirtes f86d2a0
Resolve the call return type once per call
ondrejmirtes b4871d6
Complete the stored preliminary call result in place instead of overw…
ondrejmirtes 961003f
Walk closure by-ref convergence passes in deep statement context
ondrejmirtes df28f78
Drop unnecessary ?? null on always-set parameter types
ondrejmirtes c763f3e
Drop the buildTypeSpecifications smoke block for the removed helper
ondrejmirtes a3fc479
Fix use-statement order left by the rebase auto-merge
ondrejmirtes 9807180
Price an offset read on never as ErrorType in the narrowing-base reader
ondrejmirtes 7b499ee
Avoid the nullsafe operator - simple-downgrader passes it through
ondrejmirtes 43eec19
Use ExtensionsCollection in ExpressionResult and tag PerFileAnalysisR…
ondrejmirtes af0624e
Construct name checks from extensions collections in ClassConstantPhp…
ondrejmirtes 944edfd
Bump expected turbo version
ondrejmirtes 4eb2e58
Restore the default-value gate in the isset verdict
ondrejmirtes 454a597
Complete the callable-union parameter merge in createCallableParameters
ondrejmirtes 5562b22
Bump expected turbo version
ondrejmirtes 246da9d
Absorb the upstream TypeSpecifierTest additions after the rebase
ondrejmirtes b295415
Drop the upstream toSureTypes copy that flowed into the holder helper
ondrejmirtes 54557e5
Bump expected turbo version
ondrejmirtes abaa8ed
Drop the upstream duplicate of the differingKeys smoke block
ondrejmirtes ecd5435
Split processAssignVar into prepareTarget and applyWrite
ondrejmirtes d954f5c
Produce the assignment target's read result inside prepareTarget
ondrejmirtes 2ac887d
Pass the assigned value's result into applyWrite instead of pre-stori…
ondrejmirtes 9dcda0b
Compose the ??= read from the walked target instead of a second walk
ondrejmirtes a7b37ef
Compose target reads from handler composition methods, thread operand…
ondrejmirtes cf11932
Thread more in-hand results through the assignment narrowing and writ…
ondrejmirtes 4595b91
Bump expected turbo version
ondrejmirtes f7fa904
Remove the ISSET_DEBUG diagnostic leftover
ondrejmirtes 24cfb97
Emit SwitchConditionNode from the branch's switch processing
ondrejmirtes 64b742d
Walk the dynamic variable name once in prepareTarget
ondrejmirtes 9a6839d
Reference the original chain in ExistingArrayDimFetch, drop the clone…
ondrejmirtes d769a62
Derive simulated-call throw points directly instead of walking synthe…
ondrejmirtes 4e1fa5e
Resolve offsetGet and __toString return types directly
ondrejmirtes e9ebf81
Thread captured results through the remaining call-handler reads
ondrejmirtes df291ae
Thread dynamic name and class results through fetch and call typeCall…
ondrejmirtes 76db43e
Make the remaining handler type readers explicit about synthetic pricing
ondrejmirtes b8972ea
Delete findStoredResult and split readTypeOfMaybeStored's state fast …
ondrejmirtes 88cf837
Convert tracked-holder reads to readScopeStateOrSyntheticType
ondrejmirtes 88d1eb0
Capture comparison-specify subresults at creation instead of the storage
ondrejmirtes 9800741
Drop captures and parameters orphaned by the maybe-stored elimination
ondrejmirtes 899811f
Restore ??= right-side-scope tests dropped in rebase
ondrejmirtes b1c401c
Narrow the right side of ??= with falsey isset() semantics
ondrejmirtes d986619
Resolve the native flavour of closure parameters through parameter cl…
ondrejmirtes b547cb1
Bump expected turbo version
ondrejmirtes f5db7a2
Let the compositional-key shortcut clear virtual-node keys
ondrejmirtes c0607dc
Bump expected turbo version
ondrejmirtes 42d877e
Drop the per-holder contained-node-keys invalidation index
ondrejmirtes be143aa
Bump expected turbo version
ondrejmirtes f8f5753
Replace WeakMaps with spl_object_id-keyed arrays and a node attribute
ondrejmirtes 86188d2
Do not extend Expr in the call and nullsafe rule-facing virtual nodes
ondrejmirtes 99f3b51
Bump expected turbo version
ondrejmirtes 3424e30
Gate the antecedent-swap on truthy narrowing equivalent to the truth
ondrejmirtes cca182e
Bump expected turbo version
ondrejmirtes 9f7720e
Remove test methods duplicated by the rebase
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?