classSliceExecutor
final class SliceExecutor
Runs the steps a path kept, in order, and reports the values they leave behind.
Only the assignments the call depends on are run, so the work is what the statement needs rather than what the body does. When an assignment leaves a variable with several possible values — a ternary, a call that returns one of several strings — the run splits there, one run per value, so every later use of the variable sees the same one. That is what stops ORDER BY $o, id $o from pairing an ascending first column with a descending second.
Keeping runs apart costs one evaluation of every later step per run, so how many are kept apart is what the budget can pay for along the path: a short path keeps a dozen, a body of several hundred assignments under a hundred conditionals keeps a few, and joins the rest value by value. A joined run still holds every value; what it gives up is knowing which values go together.
Constants§
public const MAX_RUNS = 12How many runs are kept apart before the rest are joined.
public const STEP_COST = 8How many expressions running one step is expected to evaluate, for sizing how many runs a path can afford.
Methods§
public function __construct(
?DeclaredGlobals $globals = null,
?TypeReader $types = null,
?ModifiedNames $modified = null,
?NodeText $text = null,
?EvaluationBudget $budget = null,
)Wires the executor to what it needs to bind declarations.
Parameters
$globals | ?DeclaredGlobals | |
$types | ?TypeReader | |
$modified | ?ModifiedNames | |
$text | ?NodeText | |
$budget | ?EvaluationBudget |
Calls 5
- new DeclaredGlobals line 76
- new TypeReader line 77
- new ModifiedNames line 78
- new NodeText line 79
- new EvaluationBudget line 80
public function run(
list<SliceStep> $steps,
Environment $start,
FunctionScope $scope,
ExpressionEvaluator $expressions,
bool $closing = false,
int|null $limit = null,
): list<Environment>The environments the steps leave behind, one per run.
A run that works out something on the way to a statement — what a callee returns, what a caller passes, what a property holds — stops when the search's budget is spent. The run that reads the statement itself goes on until the reading limit, so what was found along the way is not thrown away for want of the last few steps.
Parameters
$steps | list<SliceStep> | The steps, in the order they run |
$start | Environment | |
$scope | FunctionScope | |
$expressions | ExpressionEvaluator | |
$closing | bool | Whether this run reads the statement itself rather than something on the way to it |
$limit | int|null | How many runs to keep apart, or null to size it from the budget |
Returns
list<Environment>Test cases 31
SliceExecutorTest::testRunAbandonsTheStepsLeftOnceTheSearchBudgetIsExhaustedcallsSliceExecutorTest::testRunDropsRunsThatEndUpTheSamecallsSliceExecutorTest::testRunJoinsTheRunsPastTheLimitcallsSliceExecutorTest::testRunSizesTheLimitFromTheBudgetWhenNoneIsGivencallsSliceExecutorTest::testRunSplitsOnATernarySoLaterReadsAgreecallsSliceExecutorTest::testRunWhenClosingReadsOnPastTheSearchBudgetcallsSliceExecutorTest::testRunWhenClosingStopsOnceTheReadingBudgetIsSpentcallsSliceExecutorTest::testRunWithALimitOfOneKeepsTheValuesTogethercallsSliceExecutorTest::testRunWithNoStepsHandsBackTheStartcallsExpressionEvaluatorTest::testEvaluatecallsExpressionEvaluatorTest::testEvaluateAppendStartsFromWhatTheVariableAlreadyHoldscallsExpressionEvaluatorTest::testEvaluateAssignWritesIntoTheEnvironmentcallsExpressionEvaluatorTest::testEvaluateCastEndsTheTrailBackToExternalInputcallsExpressionEvaluatorTest::testEvaluateInterpolationJoinsLiteralPartsAndExpressionscallsExpressionEvaluatorTest::testEvaluateOfAMatchKeepsEveryArmcallsExpressionEvaluatorTest::testEvaluateOfAnAppendingAssignmentExtendsTheVariablecallsExpressionEvaluatorTest::testEvaluateOfAnInterpolatedStringJoinsItsPartscallsExpressionEvaluatorTest::testEvaluateOfATernaryKeepsBothBranchescallsExpressionEvaluatorTest::testEvaluateTernaryHandlesTheShortFormcallsReferenceEvaluatorTest::testAssignWritesIntoAnArrayHeldByAVariablecallsReferenceEvaluatorTest::testEvaluatecallsReferenceEvaluatorTest::testReadArrayMarksAnUnpackedLiteralIncompletecallsReferenceEvaluatorTest::testReadElementFallsBackToTheOriginOfTheArraycallsReferenceEvaluatorTest::testReadElementLeavesAGapForAnElementTheArrayDoesNotHoldcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveQuotesTheGapOfAnArrayKnownOnlyInPartcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveReadsEveryElementcallsReferenceEvaluatorTest::testReadEnumPropertyNarrowsToOneCaseWhenTheCaseIsKnowncallsReferenceEvaluatorTest::testReadEnumPropertyReadsCaseNamescallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypecallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypeOfAStaticPropertyTheClassAssignscallsReferenceEvaluatorTest::testReadPropertyReadsTheSettledDefaultOfAStaticPropertycalls
Called from 4
- method-call SqlCatalog\Core\Analysis\Derivation\CalleeReturns::returned() packages/sql-catalog/src/Core/Analysis/Derivation/CalleeReturns.php:149
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::run() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:169
- method-call SqlCatalog\Core\Analysis\Derivation\Objects\CallbackEffects::apply() packages/sql-catalog/src/Core/Analysis/Derivation/Objects/CallbackEffects.php:62
- method-call SqlCatalog\Core\Analysis\Derivation\SliceExecutor::apply() packages/sql-catalog/src/Core/Analysis/Derivation/SliceExecutor.php:227
Calls 9
- method-call SliceExecutor::affordableRuns() line 105
- new
WeakMapline 107 - method-call EvaluationBudget::isSpent() line 112
- method-call EvaluationBudget::isExhausted() line 112
- method-call SliceExecutor::abandon() line 113
- function-call
array_sliceline 113 - function-call
array_mergeline 117 - method-call SliceExecutor::apply() line 117
- method-call SliceExecutor::bound() line 119
public function affordableRuns(list<SliceStep> $steps): intHow many runs the budget can keep apart along these steps.
Parameters
$steps | list<SliceStep> |
Returns
intTest cases 1
Called from 2
Calls 6
- function-call
maxline 132 - method-call SliceExecutor::size() line 132
- function-call
minline 134 - class-const SliceExecutor::MAX_RUNS() line 134
- function-call
intdivline 134 - class-const SliceExecutor::STEP_COST() line 134
public function size(list<SliceStep> $steps): intHow many steps there are, counting the steps held as alternatives.
Parameters
$steps | list<SliceStep> |
Returns
intTest cases 1
Called from 2
Calls 1
- method-call SliceExecutor::size() line 148
public function abandon(
list<SliceStep> $steps,
list<Environment> $environments,
): list<Environment>The environments with everything the steps not yet run would write left open.
Stopping partway must not report a variable as holding what it held before a later assignment the run never got to: that would be a wrong statement rather than an incomplete one. So every name a remaining step writes is left open, marked as stopped by the budget.
Parameters
$steps | list<SliceStep> | |
$environments | list<Environment> |
Returns
list<Environment>Test cases 2
Called from 1
Calls 4
- method-call SliceExecutor::writtenBy() line 171
- method-call WriteEffects::apply() line 176
- new WriteEffects line 176
- class-const Origin::Budget() line 176
public function writtenBy(SliceStep $step): array<string, true>Every name a step may write, including the steps it holds as alternatives.
Parameters
$step | SliceStep |
Returns
array<string, true>Test cases 5
SliceExecutorTest::testWrittenByAClosureNamesWhatItDefinesForItselfcallsSliceExecutorTest::testWrittenByAForeachNamesItsValueAndItsKeycallsSliceExecutorTest::testWrittenByANodeNamesWhatItAssignsThenTheNamesItListscallsSliceExecutorTest::testWrittenByAStepOfAlternativesNamesWhatEveryAlternativeWritescallsSliceExecutorTest::testWrittenByAStepWithNoAlternativesNamesNothingcalls
Called from 2
Calls 2
- method-call ModifiedNames::of() line 191
- method-call SliceExecutor::writtenBy() line 201
public function apply(
SliceStep $step,
Environment $environment,
FunctionScope $scope,
ExpressionEvaluator $expressions,
WeakMap<Node, int> $passes,
WeakMap<Node, Domain> $iterables,
int $limit = self::MAX_RUNS,
): list<Environment>The environments one step leaves behind, starting from one environment.
Parameters
$step | SliceStep | |
$environment | Environment | |
$scope | FunctionScope | |
$expressions | ExpressionEvaluator | |
$passes | WeakMap<Node, int> | How many passes each loop has started so far |
$iterables | WeakMap<Node, Domain> | What each loop went over, as read before its first pass |
$limit | int |
Returns
list<Environment>Test cases 9
SliceExecutorTest::testApplyAssignsAnExpressionAndSplitsOnWhatItWrotecallsSliceExecutorTest::testApplyBindsADeclarationcallsSliceExecutorTest::testApplyEntersAClosureWithoutEvaluatingAnythingcallsSliceExecutorTest::testApplyEntersAnArrowFunctioncallsSliceExecutorTest::testApplyGoesOnFromThePassAForeachReachedOverWhatItFirstReadcallsSliceExecutorTest::testApplyLeavesAnyOtherStatementAsItFoundItcallsSliceExecutorTest::testApplyRunsEveryAlternativeFromItsOwnCopycallsSliceExecutorTest::testApplySplitsAForeachPastItsElementsWithinTheLimitcallsSliceExecutorTest::testApplyStartsAForeachByReadingWhatItGoesOvercalls
Called from 1
Calls 11
- class-const SliceExecutor::MAX_RUNS() line 222
- function-call
array_mergeline 227 - method-call SliceExecutor::run() line 227
- method-call Environment::copy() line 227
- method-call SliceExecutor::enterClosure() line 235
- method-call SliceExecutor::declare() line 240
- method-call ExpressionEvaluator::evaluate() line 247
- method-call SliceExecutor::iterate() line 249
- method-call SliceExecutor::split() line 251
- method-call ModifiedNames::of() line 251
- method-call SliceExecutor::assign() line 254
public function enterClosure(
Closure|ArrowFunction $closure,
list<string> $names,
Environment $environment,
): voidBinds what a closure defines for itself: its parameters, and the names it reads without defining.
Parameters
$closure | Closure|ArrowFunction | |
$names | list<string> | |
$environment | Environment |
Test cases 3
Called from 1
Calls 6
- function-call
is_stringline 271 - method-call TypeReader::read() line 272
- method-call Environment::write() line 277
- static-call Domain::opaque() line 277
- class-const Origin::Parameter() line 277
- method-call Environment::markAbsent() line 279
public function declare(Global_|Static_|Unset_ $declaration, Environment $environment): voidBinds what a global, static or unset declaration gives the names it lists.
Parameters
$declaration | Global_|Static_|Unset_ | |
$environment | Environment |
Test cases 3
Called from 1
Calls 10
- function-call
is_stringline 291 - method-call Environment::markAbsent() line 292
- method-call ModifiedNames::own() line 298
- method-call DeclaredGlobals::classOf() line 299
- method-call Environment::write() line 300
- static-call Domain::of() line 301
- new ObjectTerm line 301
- static-call Domain::opaque() line 302
- static-call TypeShape::unknown() line 302
- class-const Origin::Unresolved() line 302
public function iterate(
Foreach_ $loop,
Domain $iterable,
int $pass,
Environment $environment,
FunctionScope $scope,
ExpressionEvaluator $expressions,
): voidBinds a foreach's variables for one pass.
An array written out in full gives each pass its own element; anything else gives every pass whatever an element of it can be.
Parameters
$loop | Foreach_ | |
$iterable | Domain | |
$pass | int | |
$environment | Environment | |
$scope | FunctionScope | |
$expressions | ExpressionEvaluator |
Test cases 3
Called from 1
Calls 7
- method-call Domain::soleArray() line 320
- method-call SliceExecutor::anyElement() line 322
- static-call Domain::opaque() line 324
- static-call TypeShape::of() line 324
- class-const Origin::Loop() line 324
- static-call Domain::literal() line 325
- method-call ExpressionEvaluator::references() line 327
Whatever an element of an iterable can be.
Parameters
$iterable | Domain |
Returns
Test cases 2
Called from 1
Calls 4
- method-call Domain::soleArray() line 338
- class-const Origin::Loop() line 338
- static-call Domain::opaque() line 339
- static-call TypeShape::unknown() line 339
public function assign(
Expr $assignment,
Environment $environment,
FunctionScope $scope,
ExpressionEvaluator $expressions,
): voidRuns one assignment, including the kinds the expression evaluator does not write back.
Parameters
$assignment | Expr | |
$environment | Environment | |
$scope | FunctionScope | |
$expressions | ExpressionEvaluator |
Test cases 3
Called from 1
Calls 5
- method-call ExpressionEvaluator::evaluate() line 347
- static-call Domain::opaque() line 357
- class-const Origin::Unresolved() line 357
- method-call NodeText::render() line 357
- method-call ExpressionEvaluator::references() line 358
public function split(
Environment $environment,
array<string, true> $names,
int $limit = self::MAX_RUNS,
): list<Environment>The environment split into one per value of the names just written, when any has several.
Bound each name's expansion before splitting the next one. Waiting until every name has been split materializes their full Cartesian product, even though only a handful of runs will survive the bound.
Parameters
$environment | Environment | |
$names | array<string, true> | |
$limit | int |
Returns
list<Environment>Test cases 8
SliceExecutorTest::testSplitBoundsIntermediateProductsWithoutLosingValuescallsSliceExecutorTest::testSplitGoesOnPastANameWithNoValuesToTellApartcallsSliceExecutorTest::testSplitJoinsWhatGoesPastTheLimitcallsSliceExecutorTest::testSplitKeepsTheEnvironmentWhenTheNameHasNoValuesToTellApartcallsSliceExecutorTest::testSplitPairsEveryValueOfEveryNamecallsSliceExecutorTest::testSplitSkipsANameTheEnvironmentDoesNotBindcallsSliceExecutorTest::testSplitWithALimitBelowTwoKeepsTheEnvironmentcallsSliceExecutorTest::testSplitWritesOneEnvironmentPerValuecalls
Called from 2
Calls 6
- class-const SliceExecutor::MAX_RUNS() line 371
- method-call Environment::has() line 378
- method-call Environment::read() line 381
- function-call
countline 382 - static-call Domain::of() line 389
- method-call SliceExecutor::bound() line 393
public function bound(
list<Environment> $environments,
int $limit = self::MAX_RUNS,
): list<Environment>The environments with repeats dropped and the rest joined once there are too many to keep apart.
Parameters
$environments | list<Environment> | |
$limit | int |
Returns
list<Environment>Test cases 6
SliceExecutorTest::testBoundDropsRepeatsKeepingTheFirstcallsSliceExecutorTest::testBoundJoinsTheEnvironmentsPastTheLimitcallsSliceExecutorTest::testBoundKeepsEveryEnvironmentUpToTheLimitcallsSliceExecutorTest::testBoundKeepsTwelveApartByDefaultcallsSliceExecutorTest::testBoundOfNothingIsNothingcallsSliceExecutorTest::testBoundOfOneJoinsThemAllcalls
Called from 3
- method-call SqlCatalog\Core\Analysis\Derivation\SliceExecutor::run() packages/sql-catalog/src/Core/Analysis/Derivation/SliceExecutor.php:119
- method-call SqlCatalog\Core\Analysis\Derivation\SliceExecutor::split() packages/sql-catalog/src/Core/Analysis/Derivation/SliceExecutor.php:393
- method-call SqlCatalog\Core\Analysis\Derivation\SliceExecutor::split() packages/sql-catalog/src/Core/Analysis/Derivation/SliceExecutor.php:396
Calls 4
- class-const SliceExecutor::MAX_RUNS() line 405
- function-call
array_valuesline 411 - function-call
countline 412 - function-call
array_sliceline 415
Private surface 5§
Implementation details, listed for orientation only.
private DeclaredGlobals $globalsprivate TypeReader $typesprivate ModifiedNames $modifiedprivate NodeText $textprivate EvaluationBudget $budgetTest cases 134§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 55
SliceExecutorTest::testAbandonLeavesOpenEveryNameTheStepsLeftWritecallsSliceExecutorTest::testAbandonWithNoEnvironmentsLeavesNonecallsSliceExecutorTest::testAffordableRunsIsWhatTheBudgetPaysForAlongTheStepscallsSliceExecutorTest::testAnyElementIsWhateverAnElementCanBecallsSliceExecutorTest::testAnyElementOfAnArrayKnownOnlyInPartQuotesTheIteratedValuecallsSliceExecutorTest::testApplyAssignsAnExpressionAndSplitsOnWhatItWrotecallsSliceExecutorTest::testApplyBindsADeclarationcallsSliceExecutorTest::testApplyEntersAClosureWithoutEvaluatingAnythingcallsSliceExecutorTest::testApplyEntersAnArrowFunctioncallsSliceExecutorTest::testApplyGoesOnFromThePassAForeachReachedOverWhatItFirstReadcallsSliceExecutorTest::testApplyLeavesAnyOtherStatementAsItFoundItcallsSliceExecutorTest::testApplyRunsEveryAlternativeFromItsOwnCopycallsSliceExecutorTest::testApplySplitsAForeachPastItsElementsWithinTheLimitcallsSliceExecutorTest::testApplyStartsAForeachByReadingWhatItGoesOvercallsSliceExecutorTest::testAssignOnceTheBudgetIsSpentcallsSliceExecutorTest::testAssignQuotesWhatItCouldNotFollowcallsSliceExecutorTest::testAssignRunsEveryKindOfAssignmentcallsSliceExecutorTest::testBoundDropsRepeatsKeepingTheFirstcallsSliceExecutorTest::testBoundJoinsTheEnvironmentsPastTheLimitcallsSliceExecutorTest::testBoundKeepsEveryEnvironmentUpToTheLimitcallsSliceExecutorTest::testBoundKeepsTwelveApartByDefaultcallsSliceExecutorTest::testBoundOfNothingIsNothingcallsSliceExecutorTest::testBoundOfOneJoinsThemAllcallsSliceExecutorTest::testDeclareGlobalTakesTheClassTheNameIsKnownToHoldcallsSliceExecutorTest::testDeclareStaticNeverTakesAClasscallsSliceExecutorTest::testDeclareUnsetClearsOnlyThePlainVariablesItNamescallsSliceExecutorTest::testEnterClosureBindsParametersAndMarksOtherLocalsAbsentcallsSliceExecutorTest::testEnterClosureMarksNamesWithoutAParameterAbsentcallsSliceExecutorTest::testEnterClosureOfAnArrowFunctionReadsItsParameterTypescallsSliceExecutorTest::testIterateBindsTheValueAndKeyOfOnePasscallsSliceExecutorTest::testIterateOverAnythingElseQuotesTheIteratedKeyAndValuecallsSliceExecutorTest::testIterateWithoutAKeyBindsOnlyTheValuecallsSliceExecutorTest::testRunAbandonsTheStepsLeftOnceTheSearchBudgetIsExhaustedcallsSliceExecutorTest::testRunDropsRunsThatEndUpTheSamecallsSliceExecutorTest::testRunJoinsTheRunsPastTheLimitcallsSliceExecutorTest::testRunSizesTheLimitFromTheBudgetWhenNoneIsGivencallsSliceExecutorTest::testRunSplitsOnATernarySoLaterReadsAgreecallsSliceExecutorTest::testRunWhenClosingReadsOnPastTheSearchBudgetcallsSliceExecutorTest::testRunWhenClosingStopsOnceTheReadingBudgetIsSpentcallsSliceExecutorTest::testRunWithALimitOfOneKeepsTheValuesTogethercallsSliceExecutorTest::testRunWithNoStepsHandsBackTheStartcallsSliceExecutorTest::testSizeCountsTheStepsHeldAsAlternativescallsSliceExecutorTest::testSplitBoundsIntermediateProductsWithoutLosingValuescallsSliceExecutorTest::testSplitGoesOnPastANameWithNoValuesToTellApartcallsSliceExecutorTest::testSplitJoinsWhatGoesPastTheLimitcallsSliceExecutorTest::testSplitKeepsTheEnvironmentWhenTheNameHasNoValuesToTellApartcallsSliceExecutorTest::testSplitPairsEveryValueOfEveryNamecallsSliceExecutorTest::testSplitSkipsANameTheEnvironmentDoesNotBindcallsSliceExecutorTest::testSplitWithALimitBelowTwoKeepsTheEnvironmentcallsSliceExecutorTest::testSplitWritesOneEnvironmentPerValuecallsSliceExecutorTest::testWrittenByAClosureNamesWhatItDefinesForItselfcallsSliceExecutorTest::testWrittenByAForeachNamesItsValueAndItsKeycallsSliceExecutorTest::testWrittenByANodeNamesWhatItAssignsThenTheNamesItListscallsSliceExecutorTest::testWrittenByAStepOfAlternativesNamesWhatEveryAlternativeWritescallsSliceExecutorTest::testWrittenByAStepWithNoAlternativesNamesNothingcalls
Other tests reaching this symbol 79
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::testValuesOfSkipsTheWritersOnceTheBudgetIsSpentcallsExpressionEvaluatorTest::testEvaluatecallsExpressionEvaluatorTest::testEvaluateAppendStartsFromWhatTheVariableAlreadyHoldscallsExpressionEvaluatorTest::testEvaluateAssignWritesIntoTheEnvironmentcallsExpressionEvaluatorTest::testEvaluateCastEndsTheTrailBackToExternalInputcallsExpressionEvaluatorTest::testEvaluateInterpolationJoinsLiteralPartsAndExpressionscallsExpressionEvaluatorTest::testEvaluateOfAMatchKeepsEveryArmcallsExpressionEvaluatorTest::testEvaluateOfAnAppendingAssignmentExtendsTheVariablecallsExpressionEvaluatorTest::testEvaluateOfAnInterpolatedStringJoinsItsPartscallsExpressionEvaluatorTest::testEvaluateOfATernaryKeepsBothBranchescallsExpressionEvaluatorTest::testEvaluateTernaryHandlesTheShortFormcallsRegistryTestcallsInterpreterTestcallsModelQueriesTestcallsReferenceEvaluatorTest::testAssignWritesIntoAnArrayHeldByAVariablecallsReferenceEvaluatorTest::testEvaluatecallsReferenceEvaluatorTest::testReadArrayMarksAnUnpackedLiteralIncompletecallsReferenceEvaluatorTest::testReadElementFallsBackToTheOriginOfTheArraycallsReferenceEvaluatorTest::testReadElementLeavesAGapForAnElementTheArrayDoesNotHoldcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveQuotesTheGapOfAnArrayKnownOnlyInPartcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveReadsEveryElementcallsReferenceEvaluatorTest::testReadEnumPropertyNarrowsToOneCaseWhenTheCaseIsKnowncallsReferenceEvaluatorTest::testReadEnumPropertyReadsCaseNamescallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypecallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypeOfAStaticPropertyTheClassAssignscallsReferenceEvaluatorTest::testReadPropertyReadsTheSettledDefaultOfAStaticPropertycallsCallContextTestcallsModelContextTest::testKeepsTheModelContractInputscallsQueryModelInterfaceTestcallsBuilderCallsTestcallsBuilderQueriesTestcallsCallbackModelTest::testApplyRunsSourceDeclaredLocalScopescallsCallbackModelTest::testCheckedPreservesAVisibleGapWhenTheCallbackExceedsItsBudgetcallsCallbackModelTest::testClosedRejectsWidenedResultsAndForeignIdentitiescallsCallbackModelTest::testConditionalKeepsBothOutcomesOfWhenAndUnlesscallsCallbackModelTest::testNestedRestoresOuterClausesAndGroupsOnlyNewPredicatescallsCallModelTestcallsLaravelExtensionTest::testModelsRegistersLaravelSemanticsThroughTheOptionalContractcallsAnalyzerTestcallsJsonReporterTestcallsTextReporterTestcalls
Relations§
Instantiated in 1
Method calls 4
- method-call SqlCatalog\Core\Analysis\Derivation\CalleeReturns::returned() packages/sql-catalog/src/Core/Analysis/Derivation/CalleeReturns.php:149
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::run() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:165
- method-call SqlCatalog\Core\Analysis\Derivation\Deriver::run() packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:169
- method-call SqlCatalog\Core\Analysis\Derivation\Objects\CallbackEffects::apply() packages/sql-catalog/src/Core/Analysis/Derivation/Objects/CallbackEffects.php:62
Type declarations 5
- type SqlCatalog\Core\Analysis\Derivation\CalleeReturns packages/sql-catalog/src/Core/Analysis/Derivation/CalleeReturns.php:35
- type SqlCatalog\Core\Analysis\Derivation\CalleeReturns packages/sql-catalog/src/Core/Analysis/Derivation/CalleeReturns.php:48
- type SqlCatalog\Core\Analysis\Derivation\Deriver packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:48
- type SqlCatalog\Core\Analysis\Derivation\Deriver packages/sql-catalog/src/Core/Analysis/Derivation/Deriver.php:69
- type SqlCatalog\Core\Analysis\Derivation\Objects\CallbackEffects packages/sql-catalog/src/Core/Analysis/Derivation/Objects/CallbackEffects.php:27