classBuiltinCallModel
final class BuiltinCallModel
What the PHP functions that shape query text do to the values they are given.
Queries are assembled with a small, stable set of string functions. Modelling those keeps a statement resolved that would otherwise become a gap the moment it passed through sprintf() or implode().
Methods§
public function register(Registry $registry): voidRegisters every built-in interpretation through the same API as custom models.
Parameters
$registry | Registry |
Test cases 1
Called from 1
Calls 15
- method-call Registry::register() line 48
- method-call BuiltinCallModel::sprintf() line 48
- function-call
array_sliceline 48 - static-call Domain::unknown() line 48
- method-call BuiltinCallModel::vsprintf() line 49
- method-call BuiltinCallModel::implode() line 50
- method-call BuiltinCallModel::fill() line 51
- method-call BuiltinCallModel::repeat() line 53
- method-call BuiltinCallModel::replace() line 54
- method-call BuiltinCallModel::transform() line 57
- static-call Domain::opaque() line 60
- static-call TypeShape::of() line 60
- class-const Origin::Call() line 60
- function-call
array_keysline 62 - class-const BuiltinCallModel::STRING_RESULTS() line 62
public function supports(string $name): boolWhether the standard registry models the function.
Parameters
$name | string |
Returns
boolTest cases 2
Calls 1
- static-call Registry::withBuiltins() line 72
The standard registry's interpretation of the given arguments.
Parameters
$name | string | |
$arguments | list<Domain> |
Returns
Test cases 8
BuiltinCallModelTest::testEvaluateKnowsTheTypeOfAResultItCouldNotResolvecallsBuiltinCallModelTest::testEvaluateOfACountingFunctionKnowsOnlyTheTypecallsBuiltinCallModelTest::testEvaluateOfAFunctionItDoesNotModelFallsBackToAStringcallsBuiltinCallModelTest::testEvaluateOfAStringReturningFunctionKnowsOnlyTheTypecallsBuiltinCallModelTest::testEvaluateOfEveryModelledFunctioncallsBuiltinCallModelTest::testEvaluateOfStrvalPassesTheValueThroughcallsBuiltinCallModelTest::testEvaluateResolvesSprintfcallsBuiltinCallModelTest::testEvaluateResolvesTheStringTransformationscalls
Calls 4
- static-call Registry::withBuiltins() line 82
- static-call Domain::opaque() line 83
- static-call TypeShape::of() line 83
- class-const Origin::Call() line 83
public function normalize(string $name): stringThe case-insensitive fully qualified name.
Parameters
$name | string |
Returns
stringTest cases 1
Calls 2
- method-call Registry::normalize() line 91
- new Registry line 91
The result of sprintf(), resolved as far as the format and the arguments allow.
A format the analyzer knows only in part — "SELECT * FROM $table WHERE id IN (%s)" — still has conversions in the parts it knows, so those are filled in and the gaps are carried through, rather than the whole result becoming one gap because one piece of the format was not fixed.
Returns
Test cases 5
BuiltinCallModelTest::testSprintfFillsAPartlyKnownFormatcallsBuiltinCallModelTest::testSprintfGivesUpWhenTheFormatDidNotResolvecallsBuiltinCallModelTest::testSprintfKeepsALiteralPercentSigncallsBuiltinCallModelTest::testSprintfLeavesAGapForAnArgumentThatDidNotResolvecallsBuiltinCallModelTest::testSprintfOfAFormatThatIsNotTextKeepsItsOriginButNotItsExpressioncalls
Called from 2
Calls 5
- method-call BuiltinCallModel::formatPattern() line 109
- static-call Domain::opaque() line 110
- static-call TypeShape::of() line 110
- method-call BuiltinCallModel::originOf() line 110
- class-const Origin::Call() line 110
public function formatPattern(TextPattern $format, list<Domain> $arguments): DomainA known or partly known format with its conversions filled in by the arguments.
Parameters
$format | TextPattern | |
$arguments | list<Domain> |
Returns
Test cases 4
BuiltinCallModelTest::testFormatPatternCarriesAGapInTheFormatAndKeepsCountingArgumentsPastItcallsBuiltinCallModelTest::testFormatPatternFillsEachConversionWithTheNextArgumentcallsBuiltinCallModelTest::testFormatPatternKeepsEveryAlternativeOfAnArgumentcallsBuiltinCallModelTest::testFormatPatternLeavesAGapForAConversionWithoutAnArgumentcalls
Called from 1
Calls 9
- static-call Domain::literal() line 124
- static-call Domain::of() line 128
- static-call Domain::asTerm() line 128
- static-call TextPattern::fromSegments() line 128
- method-call BuiltinCallModel::splitFormat() line 131
- function-call
str_starts_withline 132 - static-call Domain::opaque() line 137
- static-call TypeShape::unknown() line 137
- class-const Origin::Call() line 137
Where the unresolved part of a value comes from, or the fallback when nothing in it says.
Returns
Test cases 2
The result of vsprintf(), which takes its arguments as one array.
Parameters
$arguments | list<Domain> |
Returns
Test cases 2
Called from 1
Calls 5
- static-call Domain::unknown() line 167
- static-call Domain::opaque() line 169
- static-call TypeShape::of() line 169
- class-const Origin::Call() line 169
- method-call BuiltinCallModel::sprintf() line 172
public function splitFormat(string $format): list<string>A format string split into literal runs and conversion specifications.
Parameters
$format | string |
Returns
list<string>Test cases 2
Called from 1
The result of implode(), resolved when the array is known element by element.
Parameters
$arguments | list<Domain> |
Returns
Test cases 6
BuiltinCallModelTest::testImplodeGivesUpWithoutAKnownArraycallsBuiltinCallModelTest::testImplodeJoinsTheElementsOfAKnownArraycallsBuiltinCallModelTest::testImplodeLeavesAGapWhenTheArrayIsIncompletecallsBuiltinCallModelTest::testImplodeOfAnIncompleteArrayEndsInAStringGapcallsBuiltinCallModelTest::testImplodeWithoutAKnownArrayKeepsTheOriginOfThePiecescallsBuiltinCallModelTest::testImplodeWithoutGlueJoinsTheElementsDirectlycalls
Called from 2
Calls 8
- function-call
countline 197 - static-call Domain::literal() line 197
- method-call BuiltinCallModel::arrayArgument() line 198
- static-call Domain::unknown() line 200
- static-call Domain::opaque() line 202
- static-call TypeShape::of() line 202
- method-call BuiltinCallModel::originOf() line 202
- class-const Origin::Call() line 202
The array argument of an implode call, whichever position it is written in.
Parameters
$arguments | list<Domain> |
Returns
Test cases 1
A representative placeholder array, independent of its runtime length.
Parameters
$arguments | list<Domain> |
Returns
Test cases 2
Called from 1
Calls 4
- static-call Domain::unknown() line 239
- static-call Domain::of() line 244
- new ArrayTerm line 244
- new ArrayEntry line 244
The result of str_repeat(), resolved when both arguments are known.
Parameters
$arguments | list<Domain> |
Returns
Test cases 3
Called from 1
Calls 7
- static-call Domain::unknown() line 254
- function-call
is_intline 256 - static-call Domain::opaque() line 257
- static-call TypeShape::of() line 257
- class-const Origin::Call() line 257
- static-call Domain::literal() line 260
- function-call
str_repeatline 260
The result of a one-argument string transformation.
Parameters
$function | string | |
$arguments | list<Domain> |
Returns
Test cases 2
Called from 1
Calls 12
- static-call Domain::unknown() line 270
- static-call Domain::opaque() line 272
- static-call TypeShape::of() line 272
- class-const Origin::Call() line 272
- static-call Domain::literal() line 276
- function-call
strtolowerline 277 - function-call
strtoupperline 278 - function-call
ucfirstline 279 - function-call
lcfirstline 280 - function-call
ltrimline 281 - function-call
rtrimline 282 - function-call
trimline 283
The result of str_replace(), resolved when every argument is a known string.
Parameters
$arguments | list<Domain> |
Returns
Test cases 2
Called from 1
Calls 6
- static-call Domain::unknown() line 294
- static-call Domain::opaque() line 298
- static-call TypeShape::of() line 298
- class-const Origin::Call() line 298
- static-call Domain::literal() line 301
- function-call
str_replaceline 301
Private surface 1§
Implementation details, listed for orientation only.
private const STRING_RESULTS = ['json_encode' => true, 'addslashes' => true, 'htmlspecialchars' => true, 'str_…Test cases 69§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 43
BuiltinCallModelTest::testArrayArgumentFindsTheArrayInAnyPositioncallsBuiltinCallModelTest::testEvaluateKnowsTheTypeOfAResultItCouldNotResolvecallsBuiltinCallModelTest::testEvaluateOfACountingFunctionKnowsOnlyTheTypecallsBuiltinCallModelTest::testEvaluateOfAFunctionItDoesNotModelFallsBackToAStringcallsBuiltinCallModelTest::testEvaluateOfAStringReturningFunctionKnowsOnlyTheTypecallsBuiltinCallModelTest::testEvaluateOfEveryModelledFunctioncallsBuiltinCallModelTest::testEvaluateOfStrvalPassesTheValueThroughcallsBuiltinCallModelTest::testEvaluateResolvesSprintfcallsBuiltinCallModelTest::testEvaluateResolvesTheStringTransformationscallsBuiltinCallModelTest::testFillDeclinesOtherOrMissingValuescallsBuiltinCallModelTest::testFillKeepsOnlyARepresentativePlaceholdercallsBuiltinCallModelTest::testFormatPatternCarriesAGapInTheFormatAndKeepsCountingArgumentsPastItcallsBuiltinCallModelTest::testFormatPatternFillsEachConversionWithTheNextArgumentcallsBuiltinCallModelTest::testFormatPatternKeepsEveryAlternativeOfAnArgumentcallsBuiltinCallModelTest::testFormatPatternLeavesAGapForAConversionWithoutAnArgumentcallsBuiltinCallModelTest::testImplodeGivesUpWithoutAKnownArraycallsBuiltinCallModelTest::testImplodeJoinsTheElementsOfAKnownArraycallsBuiltinCallModelTest::testImplodeLeavesAGapWhenTheArrayIsIncompletecallsBuiltinCallModelTest::testImplodeOfAnIncompleteArrayEndsInAStringGapcallsBuiltinCallModelTest::testImplodeWithoutAKnownArrayKeepsTheOriginOfThePiecescallsBuiltinCallModelTest::testImplodeWithoutGlueJoinsTheElementsDirectlycallsBuiltinCallModelTest::testNormalizecallsBuiltinCallModelTest::testOriginOfFallsBackWhenNothingInTheValueIsOpaquecallsBuiltinCallModelTest::testOriginOfIsTheOriginOfTheFirstOpaqueAlternativecallsBuiltinCallModelTest::testRegisterInstallsModelsIntoAnEmptyRegistrycallsBuiltinCallModelTest::testRepeatGivesUpOnAnUnreasonableCountcallsBuiltinCallModelTest::testRepeatResolvesAKnownRepetitioncallsBuiltinCallModelTest::testRepeatResolvesTheBoundsOfAReasonableCountcallsBuiltinCallModelTest::testReplaceGivesUpWhenAnArgumentIsNotKnowncallsBuiltinCallModelTest::testReplaceResolvesWhenEveryArgumentIsKnowncallsBuiltinCallModelTest::testSplitFormatListsThePiecesOfAFormatStartingWithAConversioncallsBuiltinCallModelTest::testSplitFormatSeparatesLiteralsFromConversionscallsBuiltinCallModelTest::testSprintfFillsAPartlyKnownFormatcallsBuiltinCallModelTest::testSprintfGivesUpWhenTheFormatDidNotResolvecallsBuiltinCallModelTest::testSprintfKeepsALiteralPercentSigncallsBuiltinCallModelTest::testSprintfLeavesAGapForAnArgumentThatDidNotResolvecallsBuiltinCallModelTest::testSprintfOfAFormatThatIsNotTextKeepsItsOriginButNotItsExpressioncallsBuiltinCallModelTest::testSupportsEveryModelledFunctioncallsBuiltinCallModelTest::testSupportsTheFunctionsThatShapeQueryTextcallsBuiltinCallModelTest::testTransformCoversEachOneArgumentFunctioncallsBuiltinCallModelTest::testTransformGivesUpWithoutAKnownSubjectcallsBuiltinCallModelTest::testVsprintfGivesUpWithoutAKnownArraycallsBuiltinCallModelTest::testVsprintfTakesItsArgumentsFromAnArraycalls
Other tests reaching this symbol 26
CatalogCommandTestcallsCallEvaluatorTestcallsConstantReaderTestcallsCalleeReturnsTestcallsCallersTestcallsDeriverTestcallsEntryBinderTestcallsCallbackEffectsTestcallsPropertyWritesTestcallsSliceExecutorTestcallsExpressionEvaluatorTestcallsRegistryTestcallsInterpreterTestcallsModelQueriesTestcallsReferenceEvaluatorTestcallsCatalogTestcallsCallContextTestcallsQueryModelInterfaceTestcallsBuilderCallsTestcallsBuilderQueriesTestcallsCallbackModelTestcallsCallModelTestcallsAnalyzerTestcallsConfigurationTestcallsJsonReporterTestcallsTextReporterTestcalls