%PDF- %PDF-
| Direktori : /home/graphicd/www/vebto/vendor/roave/better-reflection/src/Util/ |
| 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;
}
}