%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/graphicd/www/vebto/vendor/roave/better-reflection/src/Util/
Upload File :
Create Path :
Current File : /home/graphicd/www/vebto/vendor/roave/better-reflection/src/Util/CalculateReflectionColum.php

<?php

declare(strict_types=1);

namespace Roave\BetterReflection\Util;

use PhpParser\Node;
use Roave\BetterReflection\Util\Exception\InvalidNodePosition;
use Roave\BetterReflection\Util\Exception\NoNodePosition;
use function strlen;
use function strrpos;

/**
 * @internal
 */
final class CalculateReflectionColum
{
    /**
     * @throws InvalidNodePosition
     * @throws NoNodePosition
     */
    public static function getStartColumn(string $source, Node $node) : int
    {
        if (! $node->hasAttribute('startFilePos')) {
            throw NoNodePosition::fromNode($node);
        }

        return self::calculateColumn($source, $node->getStartFilePos());
    }

    /**
     * @throws InvalidNodePosition
     * @throws NoNodePosition
     */
    public static function getEndColumn(string $source, Node $node) : int
    {
        if (! $node->hasAttribute('endFilePos')) {
            throw NoNodePosition::fromNode($node);
        }

        return self::calculateColumn($source, $node->getEndFilePos());
    }

    /**
     * @throws InvalidNodePosition
     */
    private static function calculateColumn(string $source, int $position) : int
    {
        $sourceLength = strlen($source);

        if ($position > $sourceLength) {
            throw InvalidNodePosition::fromPosition($position);
        }

        $lineStartPosition = strrpos($source, "\n", $position - $sourceLength);
        if ($lineStartPosition === false) {
            return $position + 1;
        }

        return $position - $lineStartPosition;
    }
}

Zerion Mini Shell 1.0