HEX
Server: LiteSpeed
System: Linux sv4.hami.host 5.14.0-611.54.3.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 7 16:31:24 EDT 2026 x86_64
User: armgroup (1008)
PHP: 8.2.32
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open, mail, socket_create, socket_create_listen, socket_create_pair, link, dl, openlog, syslog, stream_socket_server, curl_multi_init
Upload Files
File: /home/armgroup/libs/vendor/bensampo/laravel-enum/src/PHPStan/UniqueValuesRule.php
<?php declare(strict_types=1);

namespace BenSampo\Enum\PHPStan;

use BenSampo\Enum\Enum;
use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Node\InClassNode;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleErrorBuilder;

/** @implements Rule<InClassNode> */
final class UniqueValuesRule implements Rule
{
    public function getNodeType(): string
    {
        return InClassNode::class;
    }

    public function processNode(Node $node, Scope $scope): array
    {
        assert($node instanceof InClassNode);

        $reflection = $node->getClassReflection();
        if (! $reflection->isSubclassOf(Enum::class)) {
            return [];
        }

        $constants = [];
        foreach ($reflection->getNativeReflection()->getReflectionConstants() as $constant) {
            $constants[$constant->name] = $constant->getValue();
        }

        $duplicateConstants = [];
        foreach ($constants as $name => $value) {
            $constantsWithValue = array_filter($constants, fn (mixed $v): bool => $v === $value);
            if (count($constantsWithValue) > 1) {
                $duplicateConstants[] = array_keys($constantsWithValue);
            }
        }
        $duplicateConstants = array_unique($duplicateConstants);

        if (count($duplicateConstants) > 0) {
            $fqcn = $reflection->getName();
            $constantsString = json_encode($duplicateConstants);

            return [
                RuleErrorBuilder::message("Enum class {$fqcn} contains constants with duplicate values: {$constantsString}.")
                    ->build(),
            ];
        }

        return [];
    }
}