diff --git a/.gitattributes b/.gitattributes index ed1e6ce..8079d31 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,4 +8,5 @@ phpstan-tests.neon export-ignore phpstan.neon export-ignore phpunit.xml.dist export-ignore resources/ export-ignore +static-analysis/ export-ignore tests/ export-ignore diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 817b034..2baddc9 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -12,6 +12,7 @@ ./src + ./static-analysis ./tests diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..7abdda9 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/static-analysis/UuidIsImmutable.php b/static-analysis/UuidIsImmutable.php new file mode 100644 index 0000000..0cedc3b --- /dev/null +++ b/static-analysis/UuidIsImmutable.php @@ -0,0 +1,91 @@ + + * @license http://opensource.org/licenses/MIT MIT + */ + +declare(strict_types=1); + +namespace Ramsey\Uuid\StaticAnalysis; + +use Ramsey\Uuid\Uuid; +use Ramsey\Uuid\UuidInterface; + +/** + * This is a static analysis fixture to verify that the API signature + * of a UUID allows for pure operations. Almost all methods will seem to be + * redundant or trivial: that's normal, we're just verifying the + * transitivity of immutable type signatures. + * + * Please note that this does not guarantee that the internals of the UUID + * library are pure/safe, but just that the declared API to the outside world + * is seen as immutable. + */ +final class UuidIsImmutable +{ + /** @psalm-pure */ + public static function pureCompareTo(UuidInterface $a, UuidInterface $b): int + { + return $a->compareTo($b); + } + + /** @psalm-pure */ + public static function pureEquals(UuidInterface $a, ?object $b): bool + { + return $a->equals($b); + } + + /** + * @return mixed[] + * + * @psalm-pure + */ + public static function pureGetters(UuidInterface $a): array + { + return [ + $a->getBytes(), + $a->getNumberConverter(), + $a->getHex(), + $a->getFieldsHex(), + $a->getClockSeqHiAndReservedHex(), + $a->getClockSeqLowHex(), + $a->getClockSequenceHex(), + $a->getDateTime(), + $a->getInteger(), + $a->getLeastSignificantBitsHex(), + $a->getMostSignificantBitsHex(), + $a->getNodeHex(), + $a->getTimeHiAndVersionHex(), + $a->getTimeLowHex(), + $a->getTimeMidHex(), + $a->getTimestampHex(), + $a->getUrn(), + $a->getVariant(), + $a->getVersion(), + $a->toString(), + $a->__toString(), + ]; + } + + /** + * @return UuidInterface[]|bool[] + * + * @psalm-pure + */ + public static function pureStaticUuidApi(): array + { + $id = Uuid::fromString('ff6f8cb0-c57d-11e1-9b21-0800200c9a66'); + + return [ + Uuid::fromBytes($id->getBytes()), + Uuid::fromInteger($id->getInteger()), + Uuid::isValid('ff6f8cb0-c57d-11e1-9b21-0800200c9a66'), + ]; + } +}