classSourceTree
final class SourceTree
Where a node sits in the source: which statement list holds it, and which file.
Walking back from a call means walking back through the statement lists it is nested in, so every statement has to be able to say which list it sits in and at what position. A statement inside a body says so through its parent; a statement at the top of a file has no parent, and is found here instead.
Methods§
public function __construct(list<ParsedFile> $files = [])public function anchorOf(Node $node): Stmt|FunctionLike|nullThe statement a node is part of, or the function-like whose expression body holds it.
An arrow function has no statements, so a call written in one stops at the arrow function itself rather than at the statement that defines it: the arrow function's parameters are its own, not the enclosing body's.
Parameters
$node | Node |
Returns
Stmt|FunctionLike|nullTest cases 3
Called from 2
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::sliceFrom() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:78
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::leaveClosure() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:182
Calls 2
- method-call SourceTree::isListed() line 65
- method-call
Node::getAttribute()line 68
public function isListed(Stmt $statement): boolWhether a statement sits in a list of statements that run one after another.
The arms of a conditional, a switch or a try are statements too, but they sit in the statement that owns them rather than in a list that runs.
Parameters
$statement | Stmt |
Returns
boolTest cases 1
Called from 1
Calls 1
- method-call
Stmt::getAttribute()line 87
public function locate(Stmt $statement): array{Node|null, list<Stmt>, int}|nullThe node that owns the list a statement sits in, the list, and the statement's position in it.
Parameters
$statement | Stmt |
Returns
array{Node|null, list<Stmt>, int}|nullTest cases 3
Called from 1
Calls 4
- method-call
Stmt::getAttribute()line 103 - method-call SourceTree::listOf() line 107
- function-call
array_searchline 108 - function-call
is_intline 110
public function listOf(Node $parent): list<Stmt>The statements a node runs one after another, or an empty list when it runs none.
Parameters
$parent | Node |
Returns
list<Stmt>Test cases 1
Called from 1
public function fileOf(Node $node): stringThe file a node is written in, or an empty string when it is not in any recorded file.
Parameters
$node | Node |
Returns
stringTest cases 1
Called from 2
Calls 1
- method-call
Node::getAttribute()line 150
public function bodyOf(Node $node): ?FunctionLikeThe function-like body a node is written in, or null when it is written at the top of a file.
Parameters
$node | Node |
Returns
?FunctionLikeTest cases 1
Called from 6
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::solveAtExits() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:139
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::scopeOf() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:227
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::scopeOf() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:229
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::before() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:109
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::leave() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:144
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::arrive() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:227
Calls 1
- method-call
Node::getAttribute()line 162
Private surface 2§
Implementation details, listed for orientation only.
private WeakMap<Stmt, array{string, int}> $rootsprivate array<string, list<Stmt>> $files = []Test cases 103§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 10
SourceTreeTest::testAnchorOfIsNothingForANodeOutsideAnyStatementcallsSourceTreeTest::testAnchorOfIsTheStatementANodeIsPartOfcallsSourceTreeTest::testAnchorOfStopsAtAnArrowFunctionWithNoStatementscallsSourceTreeTest::testBodyOfIsTheFunctionANodeIsWrittenIncallsSourceTreeTest::testFileOfNamesTheFileANodeIsWrittenIncallsSourceTreeTest::testIsListedLeavesOutTheArmsOfABranchcallsSourceTreeTest::testListOfReadsTheStatementsEveryKindOfOwnerRunscallsSourceTreeTest::testLocateFindsANestedStatementInTheListThatHoldsItcallsSourceTreeTest::testLocateFindsATopLevelStatementInItsFilecallsSourceTreeTest::testLocateIsNothingForAStatementNotInAnyRecordedFilecalls
Other tests reaching this symbol 93
CatalogCommandTestcallsCallEvaluatorTestcallsConstantReaderTestcallsCalleeReturnsTest::testCacheableRejectsAllocationsEvenInsideArrayscallsCalleeReturnsTest::testParametersBindsEachArgumentToThePositionItIsPassedIncallsCalleeReturnsTest::testParametersFallsBackToTheDefaultOfAParameterNotPassedcallsCalleeReturnsTest::testParametersLeavesAParameterNeitherPassedNorDefaultedOpencallsCalleeReturnsTest::testParametersLeavesAVariadicParameterOpenWhateverIsPassedcallsCalleeReturnsTest::testReadDoesNotRememberWhatAnExhaustedBudgetCutShortcallsCalleeReturnsTest::testReadEntersTheCalleeSoACallBackIntoItIsNotFollowedAgaincallsCalleeReturnsTest::testReadReturnsNullFromABodyWithoutAReturncallsCalleeReturnsTest::testReadRunsAMethodInItsOwnClassAndAFunctionInTheCallersClasscallsCalleeReturnsTest::testReadUnitesWhatEveryReturnCanReturncallsCalleeReturnsTest::testReturnedReadsNullFromABareReturncallsCalleeReturnsTest::testReturnedReadsWhatTheReturnDependsOnFromTheStartcallsCalleeReturnsTest::testReturnedUnitesEveryRunOfTheSlicecallsCalleeReturnsTest::testReturnsInFindsEveryReturnOfTheBodyInTheOrderWrittencallsCalleeReturnsTest::testReturnsInLeavesOutTheReturnsOfFunctionsAndClassesDeclaredInTheBodycallsCalleeReturnsTest::testValueOfAnswersACallWithTheSameArgumentsFromMemorycallsCalleeReturnsTest::testValueOfKeepsAbsenceDistinctFromUnresolvedReturnscallsCalleeReturnsTest::testValueOfLeavesAFunctionWithoutABodyAsACallItDidNotFollowcallsCalleeReturnsTest::testValueOfLeavesAnAbstractMethodAsACallItDidNotFollowcallsCalleeReturnsTest::testValueOfReadsWhatTheCalleeReturnscallsCalleeReturnsTest::testValueOfStopsAtACallAlreadyBeingFollowedcallsCalleeReturnsTest::testValueOfStopsAtTheDepthLimitAndFollowsJustBelowItcallsCalleeReturnsTest::testValueOfStopsOnceTheBudgetIsExhaustedcallsCallersTestcallsDeriverTest::testBinderIsTheEntryBinderTheDeriverWasWiredWithcallsDeriverTest::testEvaluatorIsTheEvaluatorTheDeriverWasWiredWithcallsDeriverTest::testSolveReadsWhatTheGoalsNeedWithTheNamesItWasGivencallsEntryBinderTestcallsCallbackEffectsTest::testApplyFollowsMutationsOfTheCallbackParametercallsCallbackEffectsTest::testApplyLeavesCallbacksWithoutAReceiverOpencallsCallbackEffectsTest::testApplyRunsClosureEffectsThroughCapturedAliasesOfItsReceivercallsCallbackEffectsTest::testBindKeepsOnlyExplicitClosureCapturesAndPassedArgumentscallsCallbackEffectsTest::testSupportedAcceptsExplicitNullAndVoidReturnscallsCallbackEffectsTest::testSupportedRejectsEarlyReturnsAndReplacementQueriescallsPropertyWritesTest::testValuesOfCollectsWhatEveryWriterLeavescallsPropertyWritesTest::testValuesOfSkipsTheWritersOnceTheBudgetIsSpentcallsBackwardSlicerTest::testAllDoneIsTrueOnlyWhenNoPathNeedsAnythingcallsBackwardSlicerTest::testArriveNamesTheNamedBodyAClosureIsWrittenIncallsBackwardSlicerTest::testBeforeAStatementNotInAnyListArrivesWhereItIscallsBackwardSlicerTest::testBeforeWalksBackOverTheStatementsAheadOfOnecallsBackwardSlicerTest::testBoundMergesRepeatsAndGathersPathsBeyondTheLimitcallsBackwardSlicerTest::testBranchHoldsSeveralRunsAsOneStepcallsBackwardSlicerTest::testLeaveCarriesAFinallyBlockOverItsTryBlockcallsBackwardSlicerTest::testLeaveCarriesPathsOutOfTheirOwnercallsBackwardSlicerTest::testLeaveClosureTakesOnlyTheUseListFromOutsidecallsBackwardSlicerTest::testOutsideIsWhatAClosureTakesFromWhereItIsWrittencallsBackwardSlicerTest::testOverStopsAPathOnceTheBudgetIsSpentcallsBackwardSlicerTest::testOverWalksDeclarationsBlocksLoopsAndConditionAssignmentscallsBackwardSlicerTest::testOwningStatementIsTheStatementAnArmBelongsTocallsBackwardSlicerTest::testSliceFromAnArrowFunctionTakesWhatItCapturesFromWhereItIsWrittencallsBackwardSlicerTest::testSliceFromANodeOutsideAnyStatementArrivesAtNothingcallsBackwardSlicerTest::testSliceFromEndWalksBackFromTheEndOfABodycallsBackwardSlicerTest::testSliceFromKeepsWhatTheCallDependsOnInTheOrderItRunscallsBackwardSlicerTest::testWalkArmsWalksEachArmFromItsEndcallsBackwardSlicerTest::testWalkListStopsOnceEveryPathIsDonecallsLoopPassesTest::testBindingIsAStepOnlyForAPathThatNeedsTheLoopsVariablescallsLoopPassesTest::testBodyOfIsWhatALoopRepeatscallsLoopPassesTest::testBoundSaysWhetherAPathTookOneOfTheLoopsPassescallsLoopPassesTest::testContinuesSaysWhetherAnotherPassCouldChangeWhatIsNeededcallsLoopPassesTest::testEnteringReadsWhatALoopGoesOverBeforeItsFirstPasscallsLoopPassesTest::testExpressionsWalkBackOverAListLastFirstcallsLoopPassesTest::testIsLoopRecognisesEveryKindOfLoopcallsLoopPassesTest::testLeaveBodyFollowsAPointInsideALoopBackThroughEarlierPassescallsLoopPassesTest::testPassWalksBackOverOneWholePasscallsLoopPassesTest::testRunsListTheStatementAfterEachNumberOfPassesUpToTheLimitcallsLoopPassesTest::testRunsOfADoWhileAlwaysIncludeAPasscallsLoopPassesTest::testRunsStopOnceAPassCannotChangeWhatIsNeededcallsLoopPassesTest::testRunsTakeExactlyAsManyPassesAsAWrittenOutArrayHasElementscallsLoopPassesTest::testWrittenPassesCountsOnlyAnArrayWrittenOutInFullcallsSliceExecutorTestcallsExpressionEvaluatorTestcallsRegistryTestcallsInterpreterTestcallsModelQueriesTestcallsReferenceEvaluatorTestcallsCallContextTestcallsModelContextTest::testKeepsTheModelContractInputscallsQueryModelInterfaceTestcallsBuilderCallsTestcallsBuilderQueriesTestcallsCallbackModelTest::testApplyRunsSourceDeclaredLocalScopescallsCallbackModelTest::testCheckedPreservesAVisibleGapWhenTheCallbackExceedsItsBudgetcallsCallbackModelTest::testClosedRejectsWidenedResultsAndForeignIdentitiescallsCallbackModelTest::testConditionalKeepsBothOutcomesOfWhenAndUnlesscallsCallbackModelTest::testNestedRestoresOuterClausesAndGroupsOnlyNewPredicatescallsCallModelTestcallsLaravelExtensionTest::testModelsRegistersLaravelSemanticsThroughTheOptionalContractcallsAnalyzerTestcallsJsonReporterTestcallsTextReporterTestcalls
Relations§
Instantiated in 1
Method calls 11
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::solveAtExits() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:139
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::solveAtExits() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:144
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::scopeOf() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:227
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::scopeOf() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:229
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::scopeOf() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:233
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::sliceFrom() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:78
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::before() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:107
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::before() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:109
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::leave() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:144
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::leaveClosure() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:182
- method-call SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer::arrive() packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:227
Type declarations 4
- type SqlCatalog\Core\Analysis\Derivation\Deriver packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:44
- type SqlCatalog\Core\Analysis\Derivation\Deriver packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:67
- type SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:37
- type SqlCatalog\Core\Analysis\Derivation\Slice\BackwardSlicer packages/sql-catalog/src/Core/Analysis/Derivation/Slice/BackwardSlicer.php:55