classInterpreter
final class Interpreter
Reads the statements a source tree can issue, starting from every call that issues one.
Every call written the way a database call is written is a starting point. What it is called on is worked out first, which decides whether it is a database call at all; then what its arguments can be is worked out from the call backwards. Each way the arguments can be is one statement at the call, and a value bound later, by an execute() or a bindValue(), is attached to the statement the handle it is called on came from.
Methods§
public function __construct(
ProgramIndex $index,
list<SinkSpec> $sinks,
EvaluationBudget|null $budget = null,
DeclaredGlobals|null $globals = null,
Registry|null $functions = null,
private ?string $dialect = null,
private list<ModelProviderInterface> $modelProviders = [],
)Parameters
$index | ProgramIndex | The declarations of the whole analyzed source tree |
$sinks | list<SinkSpec> | The database calls the enabled extensions recognise |
$budget | EvaluationBudget|null | How much work one call may cost |
$globals | DeclaredGlobals|null | What the global variables the source declares are known to hold |
$functions | Registry|null | The function interpretations shared by the derivation |
$dialect | ?string | |
$modelProviders | list<ModelProviderInterface> | Enabled extension providers, instantiated for each derivation engine |
Calls 5
- static-call Registry::withBuiltins() line 92
- new EvaluationBudget line 95
- new DeclaredGlobals line 96
- new NodeText line 97
- new SinkFinder line 98
public function analyze(list<ParsedFile> $files): list<QueryRecord>Every statement the files can issue.
Parameters
$files | list<ParsedFile> |
Returns
list<QueryRecord>Test cases 28
CallEvaluatorTest::testApplyPrepareHandsBackAHandleLaterCallsFindcallsCallEvaluatorTest::testApplySinkBindsWhatAQueryCallCarriescallsCallEvaluatorTest::testBindValuesAttachesVariadicArgumentscallsCallEvaluatorTest::testDispatchResolvesAcrossTheImplementationsTheSourceDeclarescallsCallEvaluatorTest::testEvaluateFollowsAFreeFunctionOfTheAnalyzedSourcecallsCallEvaluatorTest::testEvaluateFollowsAMethodOfTheAnalyzedSourcecallsCallEvaluatorTest::testEvaluateFollowsAStaticCallOfTheAnalyzedSourcecallsCallEvaluatorTest::testEvaluateFunctionGivesUpWhenTheNameIsNotWrittencallsCallEvaluatorTest::testEvaluateInstantiationGivesTheDriverItsTypecallsCallEvaluatorTest::testEvaluateMethodGivesUpWhenTheNameIsNotWrittencallsCallEvaluatorTest::testEvaluateReadsExternalInputThroughAFunctioncallsCallEvaluatorTest::testEvaluateRecordsAQueryCallcallsCallEvaluatorTest::testEvaluateStaticGivesUpWhenTheClassIsNotWrittencallsCallEvaluatorTest::testFollowReadsTheSameCallOnceForTheSameArgumentscallsCallEvaluatorTest::testFollowStopsAtRecursioncallsCallEvaluatorTest::testFollowStopsAtTheDepthLimitcallsCallEvaluatorTest::testRecordStatementsIgnoresACallWithoutItsStatementcallsCallEvaluatorTest::testSiteKeyOfTellsTwoCallsOnOneLineApartcallsCallEvaluatorTest::testSiteOfNamesWhereTheCallIsWrittencallsInterpreterTest::testAnalyzeBindsWhatAnExecuteBindsToTheStatementItsHandleCameFromcallsInterpreterTest::testAnalyzeBindsWhatANullsafeExecuteBindscallsInterpreterTest::testAnalyzeBindsWhatAQueryCallCarriesAlongsideItsStatementcallsInterpreterTest::testAnalyzeGivesEveryCallTheWholeBudgetcallsInterpreterTest::testAnalyzeKeepsWhatEveryCallBindscallsInterpreterTest::testAnalyzeReadsEveryStatementFromTheCallThatIssuesItcallsInterpreterTest::testAnalyzeRecordsNothingAtACallThatOnlyComposesAStatementcallsInterpreterTest::testAnalyzeSpendsNoMoreThanTheBudgetItIsGivencallsInterpreterTest::testAnalyzeWithATinyBudgetStillReportsTheCallcalls
Called from 1
Calls 13
- method-call Interpreter::deriverFor() line 109
- new SinkMatcher line 110
- new StatementRecorder line 111
- new ValueBinder line 112
- method-call SinkFinder::findAll() line 115
- method-call EvaluationBudget::reset() line 116
- function-call
array_mergeline 117 - method-call Interpreter::visit() line 117
- function-call
array_shiftline 122 - static-call Domain::unknown() line 122
- method-call ValueBinder::bindValues() line 123
- method-call ValueBinder::openRecords() line 123
- method-call StatementRecorder::records() line 126
public function evaluatorFor(list<ParsedFile> $files = []): ExpressionEvaluatorThe expression evaluator the deriver for the given files reads values with.
Parameters
$files | list<ParsedFile> |
Returns
Test cases 159
CallEvaluatorTest::testArgumentsAreEvaluatedInOrdercallsCallEvaluatorTest::testArgumentsIsCalledWithTheCallItselfcallsCallEvaluatorTest::testDispatchReadsTheImplementationsTheSourceDeclarescallsCallEvaluatorTest::testEvaluateAppliesOnlyPossibleCallWritescallsCallEvaluatorTest::testEvaluateFunctionGivesUpOnAFunctionWhoseNameIsNotWrittencallsCallEvaluatorTest::testEvaluateFunctionHandsBackWhatADatabaseCallHandsBackcallsCallEvaluatorTest::testEvaluateFunctionNamesTheExternalInputItReadscallsCallEvaluatorTest::testEvaluateInstantiationResolvesSelfcallsCallEvaluatorTest::testEvaluateMethodFollowsAMethodDeclaredWithoutABodycallsCallEvaluatorTest::testEvaluateMethodFollowsIntoAClassNoExtensionModelscallsCallEvaluatorTest::testEvaluateMethodFollowsIntoAModelledClassOnlyFromItsOwnBodycallsCallEvaluatorTest::testEvaluateMethodGivesUpOnAMethodWhoseNameIsNotWrittencallsCallEvaluatorTest::testEvaluateOfAFirstClassCallableIsAClosurecallsCallEvaluatorTest::testEvaluateRetainsReferenceWritesForAModeledNamespacedFunctioncallsCallEvaluatorTest::testEvaluateStaticGivesUpWhenTheClassOrTheNameIsNotWrittencallsCallEvaluatorTest::testEvaluateStaticHandsBackWhatADatabaseCallHandsBackcallsCallEvaluatorTest::testEvaluateStaticResolvesTheSelfKeywordsToTheEnclosingClasscallsCallEvaluatorTest::testFollowWithoutReturnsToReadNamesTheCalleecallsCallEvaluatorTest::testTheCallMethodsAreReachedDirectlycallsConstantReaderTest::testReadClassConstantGivesUpOnAConstantNothingDeclarescallsConstantReaderTest::testReadClassConstantGivesUpWhenTheClassIsNotWrittencallsConstantReaderTest::testReadClassConstantQuotesWhatItCouldNotReadcallsConstantReaderTest::testReadClassConstantReadsTheClassKeywordWhateverItsCasecallsConstantReaderTest::testReadClassConstantReadsWhatTheClassDeclarescallsConstantReaderTest::testReadClassConstantTellsAnEnumCaseFromAConstantOfTheEnumcallsConstantReaderTest::testReadConstantReadsTheKeywordsWhateverTheirCasecallsConstantReaderTest::testReadConstantResolvesTheKeywordsAndTheDeclarationscallsCalleeReturnsTest::testParametersBindsEachArgumentToThePositionItIsPassedIncallsCalleeReturnsTest::testParametersFallsBackToTheDefaultOfAParameterNotPassedcallsCalleeReturnsTest::testParametersLeavesAParameterNeitherPassedNorDefaultedOpencallsCalleeReturnsTest::testParametersLeavesAVariadicParameterOpenWhateverIsPassedcallsCalleeReturnsTest::testReadDoesNotRememberWhatAnExhaustedBudgetCutShortcallsCalleeReturnsTest::testReadEntersTheCalleeSoACallBackIntoItIsNotFollowedAgaincallsCalleeReturnsTest::testReadReturnsNullFromABodyWithoutAReturncallsCalleeReturnsTest::testReadRunsAMethodInItsOwnClassAndAFunctionInTheCallersClasscallsCalleeReturnsTest::testReadUnitesWhatEveryReturnCanReturncallsCalleeReturnsTest::testReturnedReadsNullFromABareReturncallsCalleeReturnsTest::testReturnedReadsWhatTheReturnDependsOnFromTheStartcallsCalleeReturnsTest::testReturnedUnitesEveryRunOfTheSlicecallsCalleeReturnsTest::testValueOfAnswersACallWithTheSameArgumentsFromMemorycallsCalleeReturnsTest::testValueOfKeepsAbsenceDistinctFromUnresolvedReturnscallsCalleeReturnsTest::testValueOfLeavesAFunctionWithoutABodyAsACallItDidNotFollowcallsCalleeReturnsTest::testValueOfLeavesAnAbstractMethodAsACallItDidNotFollowcallsCalleeReturnsTest::testValueOfReadsWhatTheCalleeReturnscallsCalleeReturnsTest::testValueOfStopsAtACallAlreadyBeingFollowedcallsCalleeReturnsTest::testValueOfStopsAtTheDepthLimitAndFollowsJustBelowItcallsCalleeReturnsTest::testValueOfStopsOnceTheBudgetIsExhaustedcallsDeriverTest::testBinderIsTheEntryBinderTheDeriverWasWiredWithcallsDeriverTest::testEvaluatorIsTheEvaluatorTheDeriverWasWiredWithcallsDeriverTest::testSolveReadsWhatTheGoalsNeedWithTheNamesItWasGivencallsEntryBinderTest::testFileScopeBindsTheGlobalsAnExtensionDeclarescallsCallbackEffectsTest::testApplyFollowsMutationsOfTheCallbackParametercallsCallbackEffectsTest::testApplyLeavesCallbacksWithoutAReceiverOpencallsCallbackEffectsTest::testApplyRunsClosureEffectsThroughCapturedAliasesOfItsReceivercallsPropertyWritesTest::testValuesOfCollectsWhatEveryWriterLeavescallsPropertyWritesTest::testValuesOfSkipsTheWritersOnceTheBudgetIsSpentcallsSliceExecutorTest::testApplyAssignsAnExpressionAndSplitsOnWhatItWrotecallsSliceExecutorTest::testApplyBindsADeclarationcallsSliceExecutorTest::testApplyEntersAClosureWithoutEvaluatingAnythingcallsSliceExecutorTest::testApplyEntersAnArrowFunctioncallsSliceExecutorTest::testApplyGoesOnFromThePassAForeachReachedOverWhatItFirstReadcallsSliceExecutorTest::testApplyLeavesAnyOtherStatementAsItFoundItcallsSliceExecutorTest::testApplyRunsEveryAlternativeFromItsOwnCopycallsSliceExecutorTest::testApplySplitsAForeachPastItsElementsWithinTheLimitcallsSliceExecutorTest::testApplyStartsAForeachByReadingWhatItGoesOvercallsSliceExecutorTest::testAssignOnceTheBudgetIsSpentcallsSliceExecutorTest::testAssignQuotesWhatItCouldNotFollowcallsSliceExecutorTest::testAssignRunsEveryKindOfAssignmentcallsSliceExecutorTest::testIterateBindsTheValueAndKeyOfOnePasscallsSliceExecutorTest::testIterateOverAnythingElseQuotesTheIteratedKeyAndValuecallsSliceExecutorTest::testIterateWithoutAKeyBindsOnlyTheValuecallsSliceExecutorTest::testRunAbandonsTheStepsLeftOnceTheSearchBudgetIsExhaustedcallsSliceExecutorTest::testRunDropsRunsThatEndUpTheSamecallsSliceExecutorTest::testRunJoinsTheRunsPastTheLimitcallsSliceExecutorTest::testRunSizesTheLimitFromTheBudgetWhenNoneIsGivencallsSliceExecutorTest::testRunSplitsOnATernarySoLaterReadsAgreecallsSliceExecutorTest::testRunWhenClosingReadsOnPastTheSearchBudgetcallsSliceExecutorTest::testRunWhenClosingStopsOnceTheReadingBudgetIsSpentcallsSliceExecutorTest::testRunWithALimitOfOneKeepsTheValuesTogethercallsSliceExecutorTest::testRunWithNoStepsHandsBackTheStartcallsExpressionEvaluatorTest::testCastLiteralWritesTheValueAsTheTypeItIsCastTocallsExpressionEvaluatorTest::testEvaluatecallsExpressionEvaluatorTest::testEvaluateAppendIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateAppendStartsFromWhatTheVariableAlreadyHoldscallsExpressionEvaluatorTest::testEvaluateAssignIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateAssignWritesIntoTheEnvironmentcallsExpressionEvaluatorTest::testEvaluateCastEndsTheTrailBackToExternalInputcallsExpressionEvaluatorTest::testEvaluateCastNamesTheTypeACastProducesWhenTheValueIsNotKnowncallsExpressionEvaluatorTest::testEvaluateCastOfAnObjectKnowsOnlyThatItIsOnecallsExpressionEvaluatorTest::testEvaluateCloneCreatesAnIndependentTrackedAllocationcallsExpressionEvaluatorTest::testEvaluateGivesUpOnceTheBudgetIsSpentcallsExpressionEvaluatorTest::testEvaluateInterpolationIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateInterpolationJoinsLiteralPartsAndExpressionscallsExpressionEvaluatorTest::testEvaluateInvalidatesAllAliasesOfAReferenceAssignedObjectcallsExpressionEvaluatorTest::testEvaluateIssetDoesNotEvaluatePredicatescallsExpressionEvaluatorTest::testEvaluateIssetKeepsIntermediateOperandWritescallsExpressionEvaluatorTest::testEvaluateIssetKeepsPossibleOperandEffectscallsExpressionEvaluatorTest::testEvaluateMatchOfNoArmsKnowsNothingcallsExpressionEvaluatorTest::testEvaluateMatchRetainsEarlierConditionEffectsForLaterArmscallsExpressionEvaluatorTest::testEvaluateMatchSeesAssignmentsInTheSubjectAndInTheConditionscallsExpressionEvaluatorTest::testEvaluateOfAMatchKeepsEveryArmcallsExpressionEvaluatorTest::testEvaluateOfAnAppendingAssignmentExtendsTheVariablecallsExpressionEvaluatorTest::testEvaluateOfAnInterpolatedStringJoinsItsPartscallsExpressionEvaluatorTest::testEvaluateOfATernaryKeepsBothBranchescallsExpressionEvaluatorTest::testEvaluateOperandsEvaluatesEveryOperandInPlacecallsExpressionEvaluatorTest::testEvaluateOperatorOfACoalesceKeepsBothSidescallsExpressionEvaluatorTest::testEvaluateOperatorOnlyAnswersForOperatorscallsExpressionEvaluatorTest::testEvaluateOptionalRightKeepsTheUnwrittenAlternativecallsExpressionEvaluatorTest::testEvaluateResultReportsTheTypeTheOperatorProducescallsExpressionEvaluatorTest::testEvaluateResultSeesAnAssignmentWrittenInsideTheOperandcallsExpressionEvaluatorTest::testEvaluateScalarOnlyAnswersForLiteralscallsExpressionEvaluatorTest::testEvaluateSeesAnAssignmentWrittenInsideAnOperatorItDoesNotModelcallsExpressionEvaluatorTest::testEvaluateTernaryHandlesTheShortFormcallsExpressionEvaluatorTest::testEvaluateTernaryIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateTernaryKeepsBothBranchesEvenForKnownConditionscallsExpressionEvaluatorTest::testEvaluateTraversesIncludeEffectsBeforeReadingAnotherOperandcallsExpressionEvaluatorTest::testReferencesIsTheReaderThisEvaluatorResolvesNamesWithcallsExpressionEvaluatorTest::testResultTypeNamesTheTypeOfEveryOperatorItCoverscallsRegistryTest::testEvaluateCallUsesTheNewestHandlingFunctionAndPreservesItsDomaincallsInterpreterTest::testEvaluatorForWiresAnEvaluatorOverTheFilescallsReferenceEvaluatorTest::testAssignElementIgnoresATargetItCannotNamecallsReferenceEvaluatorTest::testAssignElementKeepsWhetherTheArrayIsKnownInFullcallsReferenceEvaluatorTest::testAssignElementMarksTheArrayANestedWriteGoesIntoAsIncompletecallsReferenceEvaluatorTest::testAssignLeavesATargetItDoesNotTrackAlonecallsReferenceEvaluatorTest::testAssignListDescendsIntoANestedListcallsReferenceEvaluatorTest::testAssignListLeavesAGapCarryingTheOriginOfAValueThatIsNotAKnownArraycallsReferenceEvaluatorTest::testAssignListLeavesAGapForAnElementTheArrayDoesNotHoldcallsReferenceEvaluatorTest::testAssignListReadsAKeyedTargetByItsKeycallsReferenceEvaluatorTest::testAssignListWritesEachElementIntoTheTargetAtItsPositioncallsReferenceEvaluatorTest::testAssignWritesIntoAnArrayHeldByAVariablecallsReferenceEvaluatorTest::testEvaluatecallsReferenceEvaluatorTest::testEvaluateOnlyAnswersForReferencescallsReferenceEvaluatorTest::testEvaluateReadsAnInstantiationAStaticPropertyAndAClosurecallsReferenceEvaluatorTest::testReadArrayIsCalledWithTheExpressionItselfcallsReferenceEvaluatorTest::testReadArrayKeepsTheElementsWrittenAfterAnUnpackingcallsReferenceEvaluatorTest::testReadArrayKnowsALiteralWithoutUnpackingInFullcallsReferenceEvaluatorTest::testReadArrayMarksAnUnpackedLiteralIncompletecallsReferenceEvaluatorTest::testReadElementFallsBackToTheOriginOfTheArraycallsReferenceEvaluatorTest::testReadElementIsCalledWithTheExpressionItselfcallsReferenceEvaluatorTest::testReadElementLeavesAGapForAnElementTheArrayDoesNotHoldcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveQuotesTheGapOfAnArrayKnownOnlyInPartcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveReadsEveryElementcallsReferenceEvaluatorTest::testReadEnumPropertyIgnoresAClassTheSourceDoesNotDeclarecallsReferenceEvaluatorTest::testReadEnumPropertyNarrowsToOneCaseWhenTheCaseIsKnowncallsReferenceEvaluatorTest::testReadEnumPropertyOnlyAnswersForAnEnumcallsReferenceEvaluatorTest::testReadEnumPropertyReadsCaseNamescallsReferenceEvaluatorTest::testReadEnumPropertyReadsTheCaseTheValueIscallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypecallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypeOfAStaticPropertyTheClassAssignscallsReferenceEvaluatorTest::testReadPropertyIsCalledWithTheExpressionItselfcallsReferenceEvaluatorTest::testReadPropertyPrefersWhatTheBodyAssignedEarliercallsReferenceEvaluatorTest::testReadPropertyQuotesAPropertyItCannotNamecallsReferenceEvaluatorTest::testReadPropertyQuotesAStaticPropertyWhoseClassItCannotNamecallsReferenceEvaluatorTest::testReadPropertyReadsTheSettledDefaultOfAStaticPropertycallsCallContextTest::testKeepsTheModelContractInputscallsBuilderCallsTest::testCallbackReturnsNullWithoutARegisteredRunnercallsCallbackModelTest::testApplyRunsSourceDeclaredLocalScopescallsCallbackModelTest::testConditionalKeepsBothOutcomesOfWhenAndUnlesscallsCallbackModelTest::testNestedRestoresOuterClausesAndGroupsOnlyNewPredicatescalls
Calls 1
- method-call Interpreter::deriverFor() line 136
public function deriverFor(list<ParsedFile> $files): DeriverThe deriver wired over the given files.
Parameters
$files | list<ParsedFile> |
Returns
Test cases 114
CallersTest::testInstantiationsIncludeSubclassesThatInheritTheConstructorcallsCallersTest::testInstantiationsMatchTheClassEachNewIsWrittenWithcallsCallersTest::testInstantiationsReadSelfAndStaticAsTheClassTheyAreWrittenIncallsCallersTest::testOfFindsNoCallersOfAClosurecallsCallersTest::testOfFindsNoCallersOfAMethodWrittenOutsideAnyClasscallsCallersTest::testOfFindsTheCallsWrittenWithAFunctionsNamecallsCallersTest::testOfFindsTheExplicitCallsOfAConstructorAsWellAsTheInstantiationscallsCallersTest::testOfFindsTheInstantiationsOfAClassForItsConstructorcallsCallersTest::testOfIsNotPartialWhenEveryCallIsAccountedForcallsCallersTest::testOfKeepsTheCallsThatCanReachTheMethodInTheOrderWrittencallsCallersTest::testOfListsEveryCallerWithoutStoppingAtTheCallerLimitcallsCallersTest::testOfMarksTheCallersPartialWhenACallMightReachTheMethodWithoutThatBeingCertaincallsCallersTest::testOfSkipsClassesAnExtensionModelscallsCallersTest::testReachesCannotTellOnceTheBudgetIsSpentcallsCallersTest::testReachesDecidesWhetherACallCanLandInTheMethodcallsCallersTest::testReachesWorksOutTheReceiverOneCallDeepercallsCallersTest::testStaticTargetIsTheClassTheLookupStartsFromcallsDeriverTest::testBoundedKeepsSolutionsWithinTheLimitAsTheyArecallsDeriverTest::testBoundedMarksSolutionsBeyondTheLimitTruncatedcallsDeriverTest::testClassOfANodeWithoutParentsIsNullcallsDeriverTest::testClassOfFallsBackToTheWrittenNameWhenNamesWereNotResolvedcallsDeriverTest::testClassOfNamesTheNearestClassANodeIsWrittenIncallsDeriverTest::testNameOfAClosureWithoutParentsIsNamedAfterTheFilecallsDeriverTest::testNameOfAFunctionWhoseNameWasNotResolvedIsItsWrittenNamecallsDeriverTest::testNameOfAMethodOutsideEveryClassHasNoClassBeforeItcallsDeriverTest::testNameOfNamesABodyTheWayItIsReportedcallsDeriverTest::testRunGivesOneSolutionPerArrivalWithOneValuePerGoalcallsDeriverTest::testRunKeepsNoMoreSolutionsThanTheLimitcallsDeriverTest::testRunKeepsReadingPastTheSearchBudgetOnlyAtDepthZerocallsDeriverTest::testRunMarksSolutionsTruncatedWhenTheirPathWasCutShortcallsDeriverTest::testRunReadsTheGoalsAfterRunningEachArrivalForwardcallsDeriverTest::testScopeOfAClosureNamesTheEnclosingBodycallsDeriverTest::testScopeOfANodeInNoRecordedFileHasNoFilecallsDeriverTest::testScopeOfNamesTheFileTheBodyAndTheClassOfAPointcallsDeriverTest::testSolveAtExitsDoesNotHandBackWhatItFoundOnceTheBudgetRanOutcallsDeriverTest::testSolveAtExitsEvaluatesTheGoalsInTheScopeOfTheBodycallsDeriverTest::testSolveAtExitsIsRememberedApartFromSolvingAtTheBodycallsDeriverTest::testSolveAtExitsReadsGoalsAtEveryReturnAndAtTheEndcallsDeriverTest::testSolveAtExitsRemembersWhatItFoundForTheSameBodyGoalsAndDepthcallsDeriverTest::testSolveAtExitsTakesACallOfTheBodyItselfAsRecursioncallsDeriverTest::testSolveAtExitsTellsBodiesGoalsAndDepthsApartcallsDeriverTest::testSolveEvaluatesTheGoalsInTheScopeOfTheBodyThePointIsIncallsDeriverTest::testSolveForgetsWhatItFoundOnceTheBudgetRanOutcallsDeriverTest::testSolveGivesOneSolutionPerBranchWithCorrelatedValuescallsDeriverTest::testSolveKeepsTheRunsOfEveryWayInApartWhileTheBudgetAffordsThemcallsDeriverTest::testSolveLeavesAParameterNothingPassesOpenAsAParametercallsDeriverTest::testSolveLeavesAParameterOpenForTheBudgetOnceTheCallsAreTooDeepcallsDeriverTest::testSolveMarksEverySolutionTruncatedWhenCallsWereLeftOutcallsDeriverTest::testSolveMarksTheWaysInJoinedForWantOfBudgetAsCombinedcallsDeriverTest::testSolveReadsAParameterAtEveryCallOfItsBodycallsDeriverTest::testSolveRemembersWhatItFoundForTheSamePointGoalsAndDepthcallsDeriverTest::testSolveSharesTheRunsTheBudgetAffordsAmongTheWaysIncallsDeriverTest::testSolveTakesACallOfTheBodyThePointIsInAsRecursioncallsDeriverTest::testSolveTellsPointsGoalsAndDepthsApartcallsDeriverTest::testSolveUnlessSpentGivesNothingOnceTheBudgetIsSpentcallsDeriverTest::testSolveUnlessSpentSolvesWhileTheBudgetLastscallsDeriverTest::testSpentTellsWhetherTheBudgetIsExhaustedcallsEntryBinderTest::testAffordableJoinsNothingIntoAnEmptyWayIncallsEntryBinderTest::testAffordableJoinsTheRestIntoOneThatIsNotCutShortWhenNoneOfThemWascallsEntryBinderTest::testAffordableJoinsTheWaysInBeyondTheLimitIntoOnecallsEntryBinderTest::testAffordableKeepsTheSameWaysInWithinTheLimitcallsEntryBinderTest::testArgumentsForFindsTheArgumentPassedForEachParametercallsEntryBinderTest::testBindingsBindEachPropertyOfThisToEveryValueTheClassLeavesItcallsEntryBinderTest::testBindingsLeaveThePropertiesAloneWhereThereIsNoObjectcallsEntryBinderTest::testBindingsLeaveThePropertiesAloneWithoutAReaderOfPropertyWritescallsEntryBinderTest::testBindingsLeaveThePropertiesOpenOnAPathTheBudgetStoppedcallsEntryBinderTest::testDefaultOfIsWhatAParameterHoldsWhenACallLeavesItOutcallsEntryBinderTest::testEvaluateConstantReadsConstantsOfTheClassGivencallsEntryBinderTest::testFromCallersAsksNoMoreThanTheCallerLimitcallsEntryBinderTest::testFromCallersBindsEachArgumentAndFillsInWhatACallLeavesOutcallsEntryBinderTest::testFromCallersCarriesWhetherTheCallerPairedValuesWorkedOutApartcallsEntryBinderTest::testFromCallersCarriesWhetherTheCallerWasCutShortcallsEntryBinderTest::testFromCallersMarksEveryWayInCutShortWhenTheCallersArePartialcallsEntryBinderTest::testFromCallersMarksTheWaysInFoundBeforeTheBudgetRanOutAsCutShortcallsEntryBinderTest::testFromCallersStopsOnceTheBudgetIsSpentcallsEntryBinderTest::testLeaveOpenLeavesEveryNeededNameOpenForTheReasonGivencallsEntryBinderTest::testOpenOriginBlamesTheBudgetOnlyOnceItIsSpentcallsEntryBinderTest::testParameterBindingsBindMethodParametersFromCallsOnInstancesOfTheClasscallsEntryBinderTest::testParameterBindingsBlameTheBudgetWhenLookingForCallersSpentItcallsEntryBinderTest::testParameterBindingsFollowEveryCallerOfTheBodycallsEntryBinderTest::testParameterBindingsLeaveAParameterNothingCallsOpencallsEntryBinderTest::testParameterBindingsLeaveAParameterOpenOnceTheBudgetIsSpentcallsEntryBinderTest::testParameterBindingsLeaveEverythingOpenOnAPathTheBudgetStoppedcallsEntryBinderTest::testParameterBindingsLeaveTheParameterOpenAndCutShortWhenNoCallCanBeConfirmedcallsEntryBinderTest::testParameterBindingsLeaveTheParameterOpenWithoutCuttingShortWhenNothingCallsItcallsEntryBinderTest::testParameterBindingsMarkUndefinedLocalsAbsentWithoutAskingCallerscallsEntryBinderTest::testParameterBindingsReadWhatTheTopOfAFileIsDeclaredToHoldcallsEntryBinderTest::testParameterBindingsStopAtTheDepthLimitcallsEntryBinderTest::testParametersOfAreTheNeededParametersWithTheirPositionscallsEntryBinderTest::testParametersOfSkipsParametersWithoutAPlainNamecallsEntryBinderTest::testParameterValuesReadWhatEveryCallerPassescallsEntryBinderTest::testWithParametersLeavesEveryParameterOpenForTheReasonGivencallsEntryBinderTest::testWithPropertyKeepsNoMoreWaysInThanTheSolutionLimitcallsEntryBinderTest::testWithPropertyLeavesTheWaysInAloneWithoutValuescallsEntryBinderTest::testWithPropertyMarksEveryWayInCombinedWhenAskedcallsEntryBinderTest::testWithPropertySplitsEveryWayInByEachValuecallsPropertyWritesTest::testValuesOfReadsThePropertyAgainOnceTheFirstReadingIsDonecallsInterpreterTest::testDeriverForWiresADeriverOverTheFilescallsInterpreterTest::testReceiverOfJoinsEveryWayTheReceiverCanBecallsInterpreterTest::testReceiverOfWorksOutWhatAMethodIsCalledOncallsInterpreterTest::testSinkOfReadsANullsafeCallAndAFunctionCallcallsInterpreterTest::testSinkOfResolvesAStaticCallOnTheEnclosingClasscallsInterpreterTest::testSinkOfTellsADatabaseCallFromAnotherCallOfTheSameNamecallsInterpreterTest::testUnidentifiedCoversANullsafeCallButNotAFunctionCallcallsInterpreterTest::testUnidentifiedIsTrueOnlyForATextCarryingCallOnSomethingUnknowncallsInterpreterTest::testVisitHandsBackNothingForABindingCallWrittenWithoutAReceivercallsInterpreterTest::testVisitHandsBackWhatAnExecuteBindscallsInterpreterTest::testVisitRecordsAStatementAndHandsBackNothingToBindLatercallsInterpreterTest::testVisitRecordsNothingForACallWithoutItsStatementcallsInterpreterTest::testVisitRecordsNothingForADatabaseCallThatTakesNoStatementcallsModelQueriesTest::testSolveKeepsCompilerFlagsAndMultipleOutputscallsModelQueriesTest::testSolveRetainsMissingModelsAsIncompleteStatementscallsQueryModelInterfaceTest::testInputsCanBeProvidedOutsideTheBuiltinscallsBuilderQueriesTest::testStatementsCompilesReceiverAndBindingsDerivedFromTheSameBranchcalls
Called from 2
Calls 20
- new SourceTree line 146
- new FreeNames line 148
- new ModifiedNames line 149
- new ObjectEffects line 149
- new BackwardSlicer line 150
- new SliceExecutor line 151
- new TypeReader line 151
- new ModelContext line 155
- new CallbackEffects line 155
- new ExternalInput line 161
- new ExpressionEvaluator line 162
- new ReferenceEvaluator line 163
- new CallEvaluator line 164
- new SinkMatcher line 166
- new CalleeReturns line 170
- new Deriver line 176
- new EntryBinder line 181
- new Callers line 182
- new CallerIndex line 182
- new PropertyWrites line 186
public function visit(
CallLike $call,
Deriver $deriver,
SinkMatcher $matcher,
StatementRecorder $recorder,
ValueBinder $binder,
): list<array{SinkSpec, Solution}>Records what one call issues, and hands back the values it binds for later.
Parameters
$call | CallLike | |
$deriver | Deriver | |
$matcher | SinkMatcher | |
$recorder | StatementRecorder | |
$binder | ValueBinder |
Test cases 5
InterpreterTest::testVisitHandsBackNothingForABindingCallWrittenWithoutAReceivercallsInterpreterTest::testVisitHandsBackWhatAnExecuteBindscallsInterpreterTest::testVisitRecordsAStatementAndHandsBackNothingToBindLatercallsInterpreterTest::testVisitRecordsNothingForACallWithoutItsStatementcallsInterpreterTest::testVisitRecordsNothingForADatabaseCallThatTakesNoStatementcalls
Called from 1
Calls 16
- method-call Deriver::scopeOf() line 205
- method-call Interpreter::sinkOf() line 206
- method-call Interpreter::unidentified() line 208
- method-call Interpreter::recordUnmatched() line 209
- class-const SinkRole::Compose() line 214
- method-call EvaluationBudget::reset() line 217
- method-call Interpreter::argumentsOf() line 218
- class-const SinkRole::Modelled() line 219
- method-call Interpreter::recordStatements() line 220
- method-call ModelQueries::solve() line 220
- new ModelQueries line 220
- class-const SinkRole::Execute() line 224
- class-const SinkRole::Bind() line 224
- function-call
array_mapline 230 - method-call Deriver::solve() line 232
- function-call
array_mergeline 232
public function sinkOf(
CallLike $call,
Deriver $deriver,
SinkMatcher $matcher,
FunctionScope $scope,
): ?SinkSpecThe database call a call is, or null when it is not one the enabled extensions recognise.
Parameters
$call | CallLike | |
$deriver | Deriver | |
$matcher | SinkMatcher | |
$scope | FunctionScope |
Returns
Test cases 3
Called from 1
Calls 7
- method-call SinkFinder::nameOf() line 248
- method-call SinkMatcher::matchFunction() line 253
- function-call
in_arrayline 257 - function-call
strtolowerline 257 - method-call SinkMatcher::matchStatic() line 261
- method-call SinkMatcher::matchMethod() line 264
- method-call Interpreter::receiverOf() line 264
Everything the receiver of a method call can be.
Parameters
$call | MethodCall|NullsafeMethodCall | |
$deriver | Deriver |
Returns
Test cases 2
Called from 2
Calls 2
- method-call Deriver::solve() line 276
- static-call Domain::unknown() line 280
public function unidentified(CallLike $call, Deriver $deriver, SinkMatcher $matcher): boolWhether a call that carries statement text could not be told apart from a database call.
A call on something whose class is known, and is not a database class, is simply not a database call. A call on something whose class could not be worked out might be one, and that is a gap worth reporting.
Parameters
$call | CallLike | |
$deriver | Deriver | |
$matcher | SinkMatcher |
Returns
boolTest cases 2
Called from 1
Calls 7
- method-call SinkFinder::nameOf() line 295
- method-call SinkMatcher::byName() line 297
- class-const SinkCallKind::Method() line 297
- class-const SinkRole::Query() line 298
- class-const SinkRole::Prepare() line 298
- class-const SinkRole::Modelled() line 298
- method-call Interpreter::receiverOf() line 301
public function argumentsOf(CallLike $call): list<Expr>The expressions a call passes, in the order they are written.
Parameters
$call | CallLike |
Returns
list<Expr>Test cases 1
Called from 1
public function recordStatements(
CallLike $call,
SinkSpec $sink,
list<Solution> $solutions,
FunctionScope $scope,
StatementRecorder $recorder,
ValueBinder $binder,
): voidRecords one statement for every way the call's statement text can be.
Parameters
$call | CallLike | |
$sink | SinkSpec | |
$solutions | list<Solution> | |
$scope | FunctionScope | |
$recorder | StatementRecorder | |
$binder | ValueBinder |
Test cases 4
InterpreterTest::testRecordStatementsFilesTheStatementsOfEveryReadingUnderThePreparedHandlecallsInterpreterTest::testRecordStatementsMarksAStatementCombinedWhenEitherTheTextOrTheReadingIscallsInterpreterTest::testRecordStatementsRecordsACallNothingCouldBeReadFromAsUnreadcallsInterpreterTest::testRecordStatementsSkipsAReadingWithoutTheStatementcalls
Called from 2
Calls 9
- new CallSite line 331
- method-call
CallLike::getStartLine()line 331 - method-call
CallLike::getStartFilePos()line 332 - method-call StatementRecorder::record() line 341
- method-call ValueBinder::bindValues() line 343
- function-call
array_mergeline 344 - method-call Interpreter::unread() line 347
- class-const SinkRole::Prepare() line 349
- method-call StatementRecorder::filePrepared() line 350
public function recordUnmatched(
CallLike $call,
FunctionScope $scope,
StatementRecorder $recorder,
): voidRecords a call written as a database call on something that could not be identified.
Parameters
$call | CallLike | |
$scope | FunctionScope | |
$recorder | StatementRecorder |
Test cases 2
Called from 1
Calls 6
- method-call StatementRecorder::record() line 359
- new CallSite line 360
- method-call
CallLike::getStartLine()line 360 - class-const CallSite::UNMATCHED() line 360
- method-call
CallLike::getStartFilePos()line 361 - method-call Interpreter::unread() line 362
public function unread(CallLike $call): TextPatternThe statement of a call nothing was read from: one gap, quoting the call.
Parameters
$call | CallLike |
Returns
Test cases 1
Called from 2
Calls 5
- static-call TextPattern::fromHole() line 371
- new TextHole line 371
- class-const Origin::Unreached() line 371
- static-call TypeShape::unknown() line 371
- method-call NodeText::render() line 371
Private surface 10§
Implementation details, listed for orientation only.
private Registry $functionsprivate ProgramIndex $indexprivate list<SinkSpec> $sinksprivate EvaluationBudget $budgetprivate DeclaredGlobals $globalsprivate NodeText $textprivate SinkFinder $finderprivate ?ModelSet $models = nullprivate ?string $dialect = nullprivate list<ModelProviderInterface> $modelProviders = []Test cases 314§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 31
InterpreterTest::testAnalyzeBindsWhatAnExecuteBindsToTheStatementItsHandleCameFromcallsInterpreterTest::testAnalyzeBindsWhatANullsafeExecuteBindscallsInterpreterTest::testAnalyzeBindsWhatAQueryCallCarriesAlongsideItsStatementcallsInterpreterTest::testAnalyzeGivesEveryCallTheWholeBudgetcallsInterpreterTest::testAnalyzeKeepsWhatEveryCallBindscallsInterpreterTest::testAnalyzeReadsEveryStatementFromTheCallThatIssuesItcallsInterpreterTest::testAnalyzeRecordsNothingAtACallThatOnlyComposesAStatementcallsInterpreterTest::testAnalyzeSpendsNoMoreThanTheBudgetItIsGivencallsInterpreterTest::testAnalyzeWithATinyBudgetStillReportsTheCallcallsInterpreterTest::testArgumentsOfListsTheExpressionsACallPassescallsInterpreterTest::testDeriverForWiresADeriverOverTheFilescallsInterpreterTest::testEvaluatorForWiresAnEvaluatorOverTheFilescallsInterpreterTest::testReceiverOfJoinsEveryWayTheReceiverCanBecallsInterpreterTest::testReceiverOfWorksOutWhatAMethodIsCalledOncallsInterpreterTest::testRecordStatementsFilesTheStatementsOfEveryReadingUnderThePreparedHandlecallsInterpreterTest::testRecordStatementsMarksAStatementCombinedWhenEitherTheTextOrTheReadingIscallsInterpreterTest::testRecordStatementsRecordsACallNothingCouldBeReadFromAsUnreadcallsInterpreterTest::testRecordStatementsSkipsAReadingWithoutTheStatementcallsInterpreterTest::testRecordUnmatchedFilesTheCallUnderItsOwnSinkcallsInterpreterTest::testRecordUnmatchedKeysTheCallByItsFileAndOffsetcallsInterpreterTest::testSinkOfReadsANullsafeCallAndAFunctionCallcallsInterpreterTest::testSinkOfResolvesAStaticCallOnTheEnclosingClasscallsInterpreterTest::testSinkOfTellsADatabaseCallFromAnotherCallOfTheSameNamecallsInterpreterTest::testUnidentifiedCoversANullsafeCallButNotAFunctionCallcallsInterpreterTest::testUnidentifiedIsTrueOnlyForATextCarryingCallOnSomethingUnknowncallsInterpreterTest::testUnreadQuotesTheCallInItsOnlyGapcallsInterpreterTest::testVisitHandsBackNothingForABindingCallWrittenWithoutAReceivercallsInterpreterTest::testVisitHandsBackWhatAnExecuteBindscallsInterpreterTest::testVisitRecordsAStatementAndHandsBackNothingToBindLatercallsInterpreterTest::testVisitRecordsNothingForACallWithoutItsStatementcallsInterpreterTest::testVisitRecordsNothingForADatabaseCallThatTakesNoStatementcalls
Other tests reaching this symbol 283
CatalogCommandTestcallsCallEvaluatorTest::testApplyPrepareHandsBackAHandleLaterCallsFindcallsCallEvaluatorTest::testApplySinkBindsWhatAQueryCallCarriescallsCallEvaluatorTest::testArgumentsAreEvaluatedInOrdercallsCallEvaluatorTest::testArgumentsIsCalledWithTheCallItselfcallsCallEvaluatorTest::testBindValuesAttachesVariadicArgumentscallsCallEvaluatorTest::testDispatchReadsTheImplementationsTheSourceDeclarescallsCallEvaluatorTest::testDispatchResolvesAcrossTheImplementationsTheSourceDeclarescallsCallEvaluatorTest::testEvaluateAppliesOnlyPossibleCallWritescallsCallEvaluatorTest::testEvaluateFollowsAFreeFunctionOfTheAnalyzedSourcecallsCallEvaluatorTest::testEvaluateFollowsAMethodOfTheAnalyzedSourcecallsCallEvaluatorTest::testEvaluateFollowsAStaticCallOfTheAnalyzedSourcecallsCallEvaluatorTest::testEvaluateFunctionGivesUpOnAFunctionWhoseNameIsNotWrittencallsCallEvaluatorTest::testEvaluateFunctionGivesUpWhenTheNameIsNotWrittencallsCallEvaluatorTest::testEvaluateFunctionHandsBackWhatADatabaseCallHandsBackcallsCallEvaluatorTest::testEvaluateFunctionNamesTheExternalInputItReadscallsCallEvaluatorTest::testEvaluateInstantiationGivesTheDriverItsTypecallsCallEvaluatorTest::testEvaluateInstantiationResolvesSelfcallsCallEvaluatorTest::testEvaluateMethodFollowsAMethodDeclaredWithoutABodycallsCallEvaluatorTest::testEvaluateMethodFollowsIntoAClassNoExtensionModelscallsCallEvaluatorTest::testEvaluateMethodFollowsIntoAModelledClassOnlyFromItsOwnBodycallsCallEvaluatorTest::testEvaluateMethodGivesUpOnAMethodWhoseNameIsNotWrittencallsCallEvaluatorTest::testEvaluateMethodGivesUpWhenTheNameIsNotWrittencallsCallEvaluatorTest::testEvaluateOfAFirstClassCallableIsAClosurecallsCallEvaluatorTest::testEvaluateReadsExternalInputThroughAFunctioncallsCallEvaluatorTest::testEvaluateRecordsAQueryCallcallsCallEvaluatorTest::testEvaluateRetainsReferenceWritesForAModeledNamespacedFunctioncallsCallEvaluatorTest::testEvaluateStaticGivesUpWhenTheClassIsNotWrittencallsCallEvaluatorTest::testEvaluateStaticGivesUpWhenTheClassOrTheNameIsNotWrittencallsCallEvaluatorTest::testEvaluateStaticHandsBackWhatADatabaseCallHandsBackcallsCallEvaluatorTest::testEvaluateStaticResolvesTheSelfKeywordsToTheEnclosingClasscallsCallEvaluatorTest::testFollowReadsTheSameCallOnceForTheSameArgumentscallsCallEvaluatorTest::testFollowStopsAtRecursioncallsCallEvaluatorTest::testFollowStopsAtTheDepthLimitcallsCallEvaluatorTest::testFollowWithoutReturnsToReadNamesTheCalleecallsCallEvaluatorTest::testRecordStatementsIgnoresACallWithoutItsStatementcallsCallEvaluatorTest::testSiteKeyOfTellsTwoCallsOnOneLineApartcallsCallEvaluatorTest::testSiteOfNamesWhereTheCallIsWrittencallsCallEvaluatorTest::testTheCallMethodsAreReachedDirectlycallsConstantReaderTest::testReadClassConstantGivesUpOnAConstantNothingDeclarescallsConstantReaderTest::testReadClassConstantGivesUpWhenTheClassIsNotWrittencallsConstantReaderTest::testReadClassConstantQuotesWhatItCouldNotReadcallsConstantReaderTest::testReadClassConstantReadsTheClassKeywordWhateverItsCasecallsConstantReaderTest::testReadClassConstantReadsWhatTheClassDeclarescallsConstantReaderTest::testReadClassConstantTellsAnEnumCaseFromAConstantOfTheEnumcallsConstantReaderTest::testReadConstantReadsTheKeywordsWhateverTheirCasecallsConstantReaderTest::testReadConstantResolvesTheKeywordsAndTheDeclarationscallsCalleeReturnsTest::testParametersBindsEachArgumentToThePositionItIsPassedIncallsCalleeReturnsTest::testParametersFallsBackToTheDefaultOfAParameterNotPassedcallsCalleeReturnsTest::testParametersLeavesAParameterNeitherPassedNorDefaultedOpencallsCalleeReturnsTest::testParametersLeavesAVariadicParameterOpenWhateverIsPassedcallsCalleeReturnsTest::testReadDoesNotRememberWhatAnExhaustedBudgetCutShortcallsCalleeReturnsTest::testReadEntersTheCalleeSoACallBackIntoItIsNotFollowedAgaincallsCalleeReturnsTest::testReadReturnsNullFromABodyWithoutAReturncallsCalleeReturnsTest::testReadRunsAMethodInItsOwnClassAndAFunctionInTheCallersClasscallsCalleeReturnsTest::testReadUnitesWhatEveryReturnCanReturncallsCalleeReturnsTest::testReturnedReadsNullFromABareReturncallsCalleeReturnsTest::testReturnedReadsWhatTheReturnDependsOnFromTheStartcallsCalleeReturnsTest::testReturnedUnitesEveryRunOfTheSlicecallsCalleeReturnsTest::testValueOfAnswersACallWithTheSameArgumentsFromMemorycallsCalleeReturnsTest::testValueOfKeepsAbsenceDistinctFromUnresolvedReturnscallsCalleeReturnsTest::testValueOfLeavesAFunctionWithoutABodyAsACallItDidNotFollowcallsCalleeReturnsTest::testValueOfLeavesAnAbstractMethodAsACallItDidNotFollowcallsCalleeReturnsTest::testValueOfReadsWhatTheCalleeReturnscallsCalleeReturnsTest::testValueOfStopsAtACallAlreadyBeingFollowedcallsCalleeReturnsTest::testValueOfStopsAtTheDepthLimitAndFollowsJustBelowItcallsCalleeReturnsTest::testValueOfStopsOnceTheBudgetIsExhaustedcallsCallersTest::testInstantiationsIncludeSubclassesThatInheritTheConstructorcallsCallersTest::testInstantiationsMatchTheClassEachNewIsWrittenWithcallsCallersTest::testInstantiationsReadSelfAndStaticAsTheClassTheyAreWrittenIncallsCallersTest::testOfFindsNoCallersOfAClosurecallsCallersTest::testOfFindsNoCallersOfAMethodWrittenOutsideAnyClasscallsCallersTest::testOfFindsTheCallsWrittenWithAFunctionsNamecallsCallersTest::testOfFindsTheExplicitCallsOfAConstructorAsWellAsTheInstantiationscallsCallersTest::testOfFindsTheInstantiationsOfAClassForItsConstructorcallsCallersTest::testOfIsNotPartialWhenEveryCallIsAccountedForcallsCallersTest::testOfKeepsTheCallsThatCanReachTheMethodInTheOrderWrittencallsCallersTest::testOfListsEveryCallerWithoutStoppingAtTheCallerLimitcallsCallersTest::testOfMarksTheCallersPartialWhenACallMightReachTheMethodWithoutThatBeingCertaincallsCallersTest::testOfSkipsClassesAnExtensionModelscallsCallersTest::testReachesCannotTellOnceTheBudgetIsSpentcallsCallersTest::testReachesDecidesWhetherACallCanLandInTheMethodcallsCallersTest::testReachesWorksOutTheReceiverOneCallDeepercallsCallersTest::testStaticTargetIsTheClassTheLookupStartsFromcallsDeriverTest::testBinderIsTheEntryBinderTheDeriverWasWiredWithcallsDeriverTest::testBoundedKeepsSolutionsWithinTheLimitAsTheyArecallsDeriverTest::testBoundedMarksSolutionsBeyondTheLimitTruncatedcallsDeriverTest::testClassOfANodeWithoutParentsIsNullcallsDeriverTest::testClassOfFallsBackToTheWrittenNameWhenNamesWereNotResolvedcallsDeriverTest::testClassOfNamesTheNearestClassANodeIsWrittenIncallsDeriverTest::testEvaluatorIsTheEvaluatorTheDeriverWasWiredWithcallsDeriverTest::testNameOfAClosureWithoutParentsIsNamedAfterTheFilecallsDeriverTest::testNameOfAFunctionWhoseNameWasNotResolvedIsItsWrittenNamecallsDeriverTest::testNameOfAMethodOutsideEveryClassHasNoClassBeforeItcallsDeriverTest::testNameOfNamesABodyTheWayItIsReportedcallsDeriverTest::testRunGivesOneSolutionPerArrivalWithOneValuePerGoalcallsDeriverTest::testRunKeepsNoMoreSolutionsThanTheLimitcallsDeriverTest::testRunKeepsReadingPastTheSearchBudgetOnlyAtDepthZerocallsDeriverTest::testRunMarksSolutionsTruncatedWhenTheirPathWasCutShortcallsDeriverTest::testRunReadsTheGoalsAfterRunningEachArrivalForwardcallsDeriverTest::testScopeOfAClosureNamesTheEnclosingBodycallsDeriverTest::testScopeOfANodeInNoRecordedFileHasNoFilecallsDeriverTest::testScopeOfNamesTheFileTheBodyAndTheClassOfAPointcallsDeriverTest::testSolveAtExitsDoesNotHandBackWhatItFoundOnceTheBudgetRanOutcallsDeriverTest::testSolveAtExitsEvaluatesTheGoalsInTheScopeOfTheBodycallsDeriverTest::testSolveAtExitsIsRememberedApartFromSolvingAtTheBodycallsDeriverTest::testSolveAtExitsReadsGoalsAtEveryReturnAndAtTheEndcallsDeriverTest::testSolveAtExitsRemembersWhatItFoundForTheSameBodyGoalsAndDepthcallsDeriverTest::testSolveAtExitsTakesACallOfTheBodyItselfAsRecursioncallsDeriverTest::testSolveAtExitsTellsBodiesGoalsAndDepthsApartcallsDeriverTest::testSolveEvaluatesTheGoalsInTheScopeOfTheBodyThePointIsIncallsDeriverTest::testSolveForgetsWhatItFoundOnceTheBudgetRanOutcallsDeriverTest::testSolveGivesOneSolutionPerBranchWithCorrelatedValuescallsDeriverTest::testSolveKeepsTheRunsOfEveryWayInApartWhileTheBudgetAffordsThemcallsDeriverTest::testSolveLeavesAParameterNothingPassesOpenAsAParametercallsDeriverTest::testSolveLeavesAParameterOpenForTheBudgetOnceTheCallsAreTooDeepcallsDeriverTest::testSolveMarksEverySolutionTruncatedWhenCallsWereLeftOutcallsDeriverTest::testSolveMarksTheWaysInJoinedForWantOfBudgetAsCombinedcallsDeriverTest::testSolveReadsAParameterAtEveryCallOfItsBodycallsDeriverTest::testSolveReadsWhatTheGoalsNeedWithTheNamesItWasGivencallsDeriverTest::testSolveRemembersWhatItFoundForTheSamePointGoalsAndDepthcallsDeriverTest::testSolveSharesTheRunsTheBudgetAffordsAmongTheWaysIncallsDeriverTest::testSolveTakesACallOfTheBodyThePointIsInAsRecursioncallsDeriverTest::testSolveTellsPointsGoalsAndDepthsApartcallsDeriverTest::testSolveUnlessSpentGivesNothingOnceTheBudgetIsSpentcallsDeriverTest::testSolveUnlessSpentSolvesWhileTheBudgetLastscallsDeriverTest::testSpentTellsWhetherTheBudgetIsExhaustedcallsEntryBinderTest::testAffordableJoinsNothingIntoAnEmptyWayIncallsEntryBinderTest::testAffordableJoinsTheRestIntoOneThatIsNotCutShortWhenNoneOfThemWascallsEntryBinderTest::testAffordableJoinsTheWaysInBeyondTheLimitIntoOnecallsEntryBinderTest::testAffordableKeepsTheSameWaysInWithinTheLimitcallsEntryBinderTest::testArgumentsForFindsTheArgumentPassedForEachParametercallsEntryBinderTest::testBindingsBindEachPropertyOfThisToEveryValueTheClassLeavesItcallsEntryBinderTest::testBindingsLeaveThePropertiesAloneWhereThereIsNoObjectcallsEntryBinderTest::testBindingsLeaveThePropertiesAloneWithoutAReaderOfPropertyWritescallsEntryBinderTest::testBindingsLeaveThePropertiesOpenOnAPathTheBudgetStoppedcallsEntryBinderTest::testDefaultOfIsWhatAParameterHoldsWhenACallLeavesItOutcallsEntryBinderTest::testEvaluateConstantReadsConstantsOfTheClassGivencallsEntryBinderTest::testFileScopeBindsTheGlobalsAnExtensionDeclarescallsEntryBinderTest::testFromCallersAsksNoMoreThanTheCallerLimitcallsEntryBinderTest::testFromCallersBindsEachArgumentAndFillsInWhatACallLeavesOutcallsEntryBinderTest::testFromCallersCarriesWhetherTheCallerPairedValuesWorkedOutApartcallsEntryBinderTest::testFromCallersCarriesWhetherTheCallerWasCutShortcallsEntryBinderTest::testFromCallersMarksEveryWayInCutShortWhenTheCallersArePartialcallsEntryBinderTest::testFromCallersMarksTheWaysInFoundBeforeTheBudgetRanOutAsCutShortcallsEntryBinderTest::testFromCallersStopsOnceTheBudgetIsSpentcallsEntryBinderTest::testLeaveOpenLeavesEveryNeededNameOpenForTheReasonGivencallsEntryBinderTest::testOpenOriginBlamesTheBudgetOnlyOnceItIsSpentcallsEntryBinderTest::testParameterBindingsBindMethodParametersFromCallsOnInstancesOfTheClasscallsEntryBinderTest::testParameterBindingsBlameTheBudgetWhenLookingForCallersSpentItcallsEntryBinderTest::testParameterBindingsFollowEveryCallerOfTheBodycallsEntryBinderTest::testParameterBindingsLeaveAParameterNothingCallsOpencallsEntryBinderTest::testParameterBindingsLeaveAParameterOpenOnceTheBudgetIsSpentcallsEntryBinderTest::testParameterBindingsLeaveEverythingOpenOnAPathTheBudgetStoppedcallsEntryBinderTest::testParameterBindingsLeaveTheParameterOpenAndCutShortWhenNoCallCanBeConfirmedcallsEntryBinderTest::testParameterBindingsLeaveTheParameterOpenWithoutCuttingShortWhenNothingCallsItcallsEntryBinderTest::testParameterBindingsMarkUndefinedLocalsAbsentWithoutAskingCallerscallsEntryBinderTest::testParameterBindingsReadWhatTheTopOfAFileIsDeclaredToHoldcallsEntryBinderTest::testParameterBindingsStopAtTheDepthLimitcallsEntryBinderTest::testParametersOfAreTheNeededParametersWithTheirPositionscallsEntryBinderTest::testParametersOfSkipsParametersWithoutAPlainNamecallsEntryBinderTest::testParameterValuesReadWhatEveryCallerPassescallsEntryBinderTest::testWithParametersLeavesEveryParameterOpenForTheReasonGivencallsEntryBinderTest::testWithPropertyKeepsNoMoreWaysInThanTheSolutionLimitcallsEntryBinderTest::testWithPropertyLeavesTheWaysInAloneWithoutValuescallsEntryBinderTest::testWithPropertyMarksEveryWayInCombinedWhenAskedcallsEntryBinderTest::testWithPropertySplitsEveryWayInByEachValuecallsCallbackEffectsTest::testApplyFollowsMutationsOfTheCallbackParametercallsCallbackEffectsTest::testApplyLeavesCallbacksWithoutAReceiverOpencallsCallbackEffectsTest::testApplyRunsClosureEffectsThroughCapturedAliasesOfItsReceivercallsPropertyWritesTest::testValuesOfCollectsWhatEveryWriterLeavescallsPropertyWritesTest::testValuesOfReadsThePropertyAgainOnceTheFirstReadingIsDonecallsPropertyWritesTest::testValuesOfSkipsTheWritersOnceTheBudgetIsSpentcallsSliceExecutorTest::testApplyAssignsAnExpressionAndSplitsOnWhatItWrotecallsSliceExecutorTest::testApplyBindsADeclarationcallsSliceExecutorTest::testApplyEntersAClosureWithoutEvaluatingAnythingcallsSliceExecutorTest::testApplyEntersAnArrowFunctioncallsSliceExecutorTest::testApplyGoesOnFromThePassAForeachReachedOverWhatItFirstReadcallsSliceExecutorTest::testApplyLeavesAnyOtherStatementAsItFoundItcallsSliceExecutorTest::testApplyRunsEveryAlternativeFromItsOwnCopycallsSliceExecutorTest::testApplySplitsAForeachPastItsElementsWithinTheLimitcallsSliceExecutorTest::testApplyStartsAForeachByReadingWhatItGoesOvercallsSliceExecutorTest::testAssignOnceTheBudgetIsSpentcallsSliceExecutorTest::testAssignQuotesWhatItCouldNotFollowcallsSliceExecutorTest::testAssignRunsEveryKindOfAssignmentcallsSliceExecutorTest::testIterateBindsTheValueAndKeyOfOnePasscallsSliceExecutorTest::testIterateOverAnythingElseQuotesTheIteratedKeyAndValuecallsSliceExecutorTest::testIterateWithoutAKeyBindsOnlyTheValuecallsSliceExecutorTest::testRunAbandonsTheStepsLeftOnceTheSearchBudgetIsExhaustedcallsSliceExecutorTest::testRunDropsRunsThatEndUpTheSamecallsSliceExecutorTest::testRunJoinsTheRunsPastTheLimitcallsSliceExecutorTest::testRunSizesTheLimitFromTheBudgetWhenNoneIsGivencallsSliceExecutorTest::testRunSplitsOnATernarySoLaterReadsAgreecallsSliceExecutorTest::testRunWhenClosingReadsOnPastTheSearchBudgetcallsSliceExecutorTest::testRunWhenClosingStopsOnceTheReadingBudgetIsSpentcallsSliceExecutorTest::testRunWithALimitOfOneKeepsTheValuesTogethercallsSliceExecutorTest::testRunWithNoStepsHandsBackTheStartcallsExpressionEvaluatorTest::testCastLiteralWritesTheValueAsTheTypeItIsCastTocallsExpressionEvaluatorTest::testEvaluatecallsExpressionEvaluatorTest::testEvaluateAppendIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateAppendStartsFromWhatTheVariableAlreadyHoldscallsExpressionEvaluatorTest::testEvaluateAssignIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateAssignWritesIntoTheEnvironmentcallsExpressionEvaluatorTest::testEvaluateCastEndsTheTrailBackToExternalInputcallsExpressionEvaluatorTest::testEvaluateCastNamesTheTypeACastProducesWhenTheValueIsNotKnowncallsExpressionEvaluatorTest::testEvaluateCastOfAnObjectKnowsOnlyThatItIsOnecallsExpressionEvaluatorTest::testEvaluateCloneCreatesAnIndependentTrackedAllocationcallsExpressionEvaluatorTest::testEvaluateGivesUpOnceTheBudgetIsSpentcallsExpressionEvaluatorTest::testEvaluateInterpolationIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateInterpolationJoinsLiteralPartsAndExpressionscallsExpressionEvaluatorTest::testEvaluateInvalidatesAllAliasesOfAReferenceAssignedObjectcallsExpressionEvaluatorTest::testEvaluateIssetDoesNotEvaluatePredicatescallsExpressionEvaluatorTest::testEvaluateIssetKeepsIntermediateOperandWritescallsExpressionEvaluatorTest::testEvaluateIssetKeepsPossibleOperandEffectscallsExpressionEvaluatorTest::testEvaluateMatchOfNoArmsKnowsNothingcallsExpressionEvaluatorTest::testEvaluateMatchRetainsEarlierConditionEffectsForLaterArmscallsExpressionEvaluatorTest::testEvaluateMatchSeesAssignmentsInTheSubjectAndInTheConditionscallsExpressionEvaluatorTest::testEvaluateOfAMatchKeepsEveryArmcallsExpressionEvaluatorTest::testEvaluateOfAnAppendingAssignmentExtendsTheVariablecallsExpressionEvaluatorTest::testEvaluateOfAnInterpolatedStringJoinsItsPartscallsExpressionEvaluatorTest::testEvaluateOfATernaryKeepsBothBranchescallsExpressionEvaluatorTest::testEvaluateOperandsEvaluatesEveryOperandInPlacecallsExpressionEvaluatorTest::testEvaluateOperatorOfACoalesceKeepsBothSidescallsExpressionEvaluatorTest::testEvaluateOperatorOnlyAnswersForOperatorscallsExpressionEvaluatorTest::testEvaluateOptionalRightKeepsTheUnwrittenAlternativecallsExpressionEvaluatorTest::testEvaluateResultReportsTheTypeTheOperatorProducescallsExpressionEvaluatorTest::testEvaluateResultSeesAnAssignmentWrittenInsideTheOperandcallsExpressionEvaluatorTest::testEvaluateScalarOnlyAnswersForLiteralscallsExpressionEvaluatorTest::testEvaluateSeesAnAssignmentWrittenInsideAnOperatorItDoesNotModelcallsExpressionEvaluatorTest::testEvaluateTernaryHandlesTheShortFormcallsExpressionEvaluatorTest::testEvaluateTernaryIsCalledWithTheExpressionItselfcallsExpressionEvaluatorTest::testEvaluateTernaryKeepsBothBranchesEvenForKnownConditionscallsExpressionEvaluatorTest::testEvaluateTraversesIncludeEffectsBeforeReadingAnotherOperandcallsExpressionEvaluatorTest::testReferencesIsTheReaderThisEvaluatorResolvesNamesWithcallsExpressionEvaluatorTest::testResultTypeNamesTheTypeOfEveryOperatorItCoverscallsRegistryTest::testEvaluateCallUsesTheNewestHandlingFunctionAndPreservesItsDomaincallsModelQueriesTest::testSolveKeepsCompilerFlagsAndMultipleOutputscallsModelQueriesTest::testSolveRetainsMissingModelsAsIncompleteStatementscallsReferenceEvaluatorTest::testAssignElementIgnoresATargetItCannotNamecallsReferenceEvaluatorTest::testAssignElementKeepsWhetherTheArrayIsKnownInFullcallsReferenceEvaluatorTest::testAssignElementMarksTheArrayANestedWriteGoesIntoAsIncompletecallsReferenceEvaluatorTest::testAssignLeavesATargetItDoesNotTrackAlonecallsReferenceEvaluatorTest::testAssignListDescendsIntoANestedListcallsReferenceEvaluatorTest::testAssignListLeavesAGapCarryingTheOriginOfAValueThatIsNotAKnownArraycallsReferenceEvaluatorTest::testAssignListLeavesAGapForAnElementTheArrayDoesNotHoldcallsReferenceEvaluatorTest::testAssignListReadsAKeyedTargetByItsKeycallsReferenceEvaluatorTest::testAssignListWritesEachElementIntoTheTargetAtItsPositioncallsReferenceEvaluatorTest::testAssignWritesIntoAnArrayHeldByAVariablecallsReferenceEvaluatorTest::testEvaluatecallsReferenceEvaluatorTest::testEvaluateOnlyAnswersForReferencescallsReferenceEvaluatorTest::testEvaluateReadsAnInstantiationAStaticPropertyAndAClosurecallsReferenceEvaluatorTest::testReadArrayIsCalledWithTheExpressionItselfcallsReferenceEvaluatorTest::testReadArrayKeepsTheElementsWrittenAfterAnUnpackingcallsReferenceEvaluatorTest::testReadArrayKnowsALiteralWithoutUnpackingInFullcallsReferenceEvaluatorTest::testReadArrayMarksAnUnpackedLiteralIncompletecallsReferenceEvaluatorTest::testReadElementFallsBackToTheOriginOfTheArraycallsReferenceEvaluatorTest::testReadElementIsCalledWithTheExpressionItselfcallsReferenceEvaluatorTest::testReadElementLeavesAGapForAnElementTheArrayDoesNotHoldcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveQuotesTheGapOfAnArrayKnownOnlyInPartcallsReferenceEvaluatorTest::testReadElementUnderAKeyThatDidNotResolveReadsEveryElementcallsReferenceEvaluatorTest::testReadEnumPropertyIgnoresAClassTheSourceDoesNotDeclarecallsReferenceEvaluatorTest::testReadEnumPropertyNarrowsToOneCaseWhenTheCaseIsKnowncallsReferenceEvaluatorTest::testReadEnumPropertyOnlyAnswersForAnEnumcallsReferenceEvaluatorTest::testReadEnumPropertyReadsCaseNamescallsReferenceEvaluatorTest::testReadEnumPropertyReadsTheCaseTheValueIscallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypecallsReferenceEvaluatorTest::testReadPropertyFallsBackToTheDeclaredTypeOfAStaticPropertyTheClassAssignscallsReferenceEvaluatorTest::testReadPropertyIsCalledWithTheExpressionItselfcallsReferenceEvaluatorTest::testReadPropertyPrefersWhatTheBodyAssignedEarliercallsReferenceEvaluatorTest::testReadPropertyQuotesAPropertyItCannotNamecallsReferenceEvaluatorTest::testReadPropertyQuotesAStaticPropertyWhoseClassItCannotNamecallsReferenceEvaluatorTest::testReadPropertyReadsTheSettledDefaultOfAStaticPropertycallsCallContextTest::testKeepsTheModelContractInputscallsQueryModelInterfaceTest::testInputsCanBeProvidedOutsideTheBuiltinscallsBuilderCallsTest::testCallbackReturnsNullWithoutARegisteredRunnercallsBuilderQueriesTest::testStatementsCompilesReceiverAndBindingsDerivedFromTheSameBranchcallsCallbackModelTest::testApplyRunsSourceDeclaredLocalScopescallsCallbackModelTest::testConditionalKeepsBothOutcomesOfWhenAndUnlesscallsCallbackModelTest::testNestedRestoresOuterClausesAndGroupsOnlyNewPredicatescallsCallModelTestcallsAnalyzerTestcallsJsonReporterTestcallsTextReporterTestcalls