Derive ArrayAccess and __set simulation throw points directly instead of walking synthetic calls - #6148
Merged
Merged
Conversation
… of walking synthetic calls The offsetGet/offsetSet/offsetExists/offsetUnset and __set simulations built a synthetic MethodCall and processed it through processExprNode() with a NoopNodeCallback just to read the resulting throw points. The new MethodThrowPointHelper::getThrowPointsForCallOnType() derives them directly from the receiver type's method reflection; the fabricated node is only the throw-point anchor and the payload dynamic throw-type extensions receive - nothing processes it. The __set simulation no longer re-walks the real receiver, whose throw points the main walk already collected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DaBZjgksga4c5s6Q9FniY7
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.
Extracted from the resolve-type-rewrite-2 branch.
The five simulation sites (
offsetGetin ArrayDimFetchHandler,offsetSetand__setin AssignHandler,offsetExistsin IssetHandler,offsetUnsetin NodeScopeResolver'sunset()processing) built a syntheticMethodCalland ran it throughprocessExprNode()with aNoopNodeCallbackjust to read the resulting throw points.The new
MethodThrowPointHelper::getThrowPointsForCallOnType()derives the throw point directly from the receiver type's method reflection — dynamic throw-type extensions still receive the fabricated call node as their payload, but nothing walks it. The__setsimulation also stops re-walking the real receiver, whose throw points the main walk had already collected (they were merged twice).Zero analysis-output churn: full test suite,
make phpstanandmake csgreen.🤖 Generated with Claude Code
https://claude.ai/code/session_01DaBZjgksga4c5s6Q9FniY7