93 lines
2.3 KiB
PHP
93 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* This file is part of PHP CS Fixer.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
|
*
|
|
* This source file is subject to the MIT license that is bundled
|
|
* with this source code in the file LICENSE.
|
|
*/
|
|
|
|
namespace PhpCsFixer\Fixer;
|
|
|
|
use PhpCsFixer\Preg;
|
|
use PhpCsFixer\Tokenizer\Tokens;
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
trait Indentation
|
|
{
|
|
private function getLineIndentation(Tokens $tokens, int $index): string
|
|
{
|
|
$newlineTokenIndex = $this->getPreviousNewlineTokenIndex($tokens, $index);
|
|
|
|
if (null === $newlineTokenIndex) {
|
|
return '';
|
|
}
|
|
|
|
return $this->extractIndent($this->computeNewLineContent($tokens, $newlineTokenIndex));
|
|
}
|
|
|
|
private function extractIndent(string $content): string
|
|
{
|
|
if (Preg::match('/\R(\h*)[^\r\n]*$/D', $content, $matches)) {
|
|
return $matches[1];
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
private function getPreviousNewlineTokenIndex(Tokens $tokens, int $index): ?int
|
|
{
|
|
while ($index > 0) {
|
|
$index = $tokens->getPrevTokenOfKind($index, [[T_WHITESPACE], [T_INLINE_HTML]]);
|
|
|
|
if (null === $index) {
|
|
break;
|
|
}
|
|
|
|
if ($this->isNewLineToken($tokens, $index)) {
|
|
return $index;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private function computeNewLineContent(Tokens $tokens, int $index): string
|
|
{
|
|
$content = $tokens[$index]->getContent();
|
|
|
|
if (0 !== $index && $tokens[$index - 1]->equalsAny([[T_OPEN_TAG], [T_CLOSE_TAG]])) {
|
|
$content = Preg::replace('/\S/', '', $tokens[$index - 1]->getContent()).$content;
|
|
}
|
|
|
|
return $content;
|
|
}
|
|
|
|
private function isNewLineToken(Tokens $tokens, int $index): bool
|
|
{
|
|
$token = $tokens[$index];
|
|
|
|
if (
|
|
$token->isGivenKind(T_OPEN_TAG)
|
|
&& isset($tokens[$index + 1])
|
|
&& !$tokens[$index + 1]->isWhitespace()
|
|
&& Preg::match('/\R/', $token->getContent())
|
|
) {
|
|
return true;
|
|
}
|
|
|
|
if (!$tokens[$index]->isGivenKind([T_WHITESPACE, T_INLINE_HTML])) {
|
|
return false;
|
|
}
|
|
|
|
return (bool) Preg::match('/\R/', $this->computeNewLineContent($tokens, $index));
|
|
}
|
|
}
|