Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions src/TimeShift.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use CloudCastle\Clock\Exception\InvalidClockValueException;
use DateMalformedStringException;
use DateTimeImmutable;
use ReflectionMethod;

/**
* Применение строки-модификатора к моменту с полной валидацией.
Expand Down Expand Up @@ -36,7 +37,7 @@
$parsed = date_parse($modifier);

if ($parsed['error_count'] > 0) {
throw InvalidClockValueException::invalidModifier($modifier);

Check warning on line 40 in src/TimeShift.php

View workflow job for this annotation

GitHub Actions / PHP 8.5

Escaped Mutant for Mutator "Throw_": @@ @@ } $parsed = date_parse($modifier); if ($parsed['error_count'] > 0) { - throw InvalidClockValueException::invalidModifier($modifier); + InvalidClockValueException::invalidModifier($modifier); } try { $shifted = self::rawModify($moment, $modifier);

Check warning on line 40 in src/TimeShift.php

View workflow job for this annotation

GitHub Actions / PHP 8.3

Escaped Mutant for Mutator "Throw_": @@ @@ } $parsed = date_parse($modifier); if ($parsed['error_count'] > 0) { - throw InvalidClockValueException::invalidModifier($modifier); + InvalidClockValueException::invalidModifier($modifier); } try { $shifted = self::rawModify($moment, $modifier);

Check warning on line 40 in src/TimeShift.php

View workflow job for this annotation

GitHub Actions / PHP 8.4

Escaped Mutant for Mutator "Throw_": @@ @@ } $parsed = date_parse($modifier); if ($parsed['error_count'] > 0) { - throw InvalidClockValueException::invalidModifier($modifier); + InvalidClockValueException::invalidModifier($modifier); } try { $shifted = self::rawModify($moment, $modifier);
}

try {
Expand All @@ -46,23 +47,26 @@
throw InvalidClockValueException::invalidModifier($modifier);
}

if ($shifted === false) {
if (!$shifted instanceof DateTimeImmutable) {
throw InvalidClockValueException::invalidModifier($modifier);
}

return $shifted;
}

/**
* Сырой вызов `modify()` с широкой сигнатурой.
* Сырой вызов `modify()` с непрозрачным для анализаторов результатом.
*
* До PHP 8.3 провал возвращает `false`, с 8.3 — бросает
* {@see \DateMalformedStringException}; широкий тип возврата делает
* обработку обоих каналов корректной для анализаторов на всей
* матрице PHP 8.1–8.5.
* Тип возврата родного `modify()` различается между эпохами стабов
* (до PHP 8.3 — `DateTimeImmutable|false`, с 8.3 — только момент,
* хотя tentative-совместимые наследники могут вернуть `false` на любой
* версии), поэтому прямой вызов не проходит строгий анализ одновременно
* на всей матрице 8.1–8.5. Рефлексия возвращает `mixed`: вызывающий
* обязан проверить результат, и ветка провала честно достижима везде.
* Путь не горячий — сюда попадают только строковые модификаторы.
*/
private static function rawModify(DateTimeImmutable $moment, string $modifier): DateTimeImmutable|false
private static function rawModify(DateTimeImmutable $moment, string $modifier): mixed
{
return $moment->modify($modifier);
return (new ReflectionMethod($moment, 'modify'))->invoke($moment, $modifier);
}
}
Loading