Files
development/vendor/microsoft/tolerant-php-parser/src/PositionUtilities.php
Clemens Schwaighofer f94b350ba4 Install phan/phpstan local
2023-02-08 12:02:18 +09:00

47 lines
2.0 KiB
PHP

<?php
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
namespace Microsoft\PhpParser;
class PositionUtilities {
/**
* Gets a Range from 0-indexed position into $text.
* Out of bounds positions are handled gracefully. Positions greater than the length of text length
* are resolved to the end of the text, and negative positions are resolved to the beginning.
*/
public static function getRangeFromPosition(int $pos, int $length, string $text): Range {
$start = self::getLineCharacterPositionFromPosition($pos, $text);
$end = self::getLineCharacterPositionFromPosition($pos + $length, $text);
return new Range($start, $end);
}
/**
* Gets 0-indexed LineCharacterPosition from 0-indexed position into $text.
*
* Out of bounds positions are handled gracefully. Positions greater than the length of text length
* are resolved to text length, and negative positions are resolved to 0.
* TODO consider throwing exception instead.
*/
public static function getLineCharacterPositionFromPosition(int $pos, string $text) : LineCharacterPosition {
$textLength = \strlen($text);
if ($pos >= $textLength) {
$pos = $textLength;
} elseif ($pos < 0) {
$pos = 0;
}
// Start strrpos check from the character before the current character,
// in case the current character is a newline
$startAt = max(-($textLength - $pos) - 1, -$textLength);
$lastNewlinePos = \strrpos($text, "\n", $startAt);
$char = $pos - ($lastNewlinePos === false ? 0 : $lastNewlinePos + 1);
$line = $pos > 0 ? \substr_count($text, "\n", 0, $pos) : 0;
return new LineCharacterPosition($line, $char);
}
}