fuc-new/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseFromSameNamespaceSniff.php
2026-05-02 16:20:44 +08:00

91 lines
2.3 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php declare(strict_types = 1);
namespace SlevomatCodingStandard\Sniffs\Namespaces;
use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Sniffs\Sniff;
use SlevomatCodingStandard\Helpers\FixerHelper;
use SlevomatCodingStandard\Helpers\NamespaceHelper;
use SlevomatCodingStandard\Helpers\StringHelper;
use SlevomatCodingStandard\Helpers\TokenHelper;
use SlevomatCodingStandard\Helpers\UseStatementHelper;
use function sprintf;
use function strlen;
use function substr;
use const T_AS;
use const T_SEMICOLON;
use const T_USE;
class UseFromSameNamespaceSniff implements Sniff
{
public const CODE_USE_FROM_SAME_NAMESPACE = 'UseFromSameNamespace';
/**
* @return array<int, (int|string)>
*/
public function register(): array
{
return [
T_USE,
];
}
/**
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
* @param int $usePointer
*/
public function process(File $phpcsFile, $usePointer): void
{
if (!UseStatementHelper::isImportUse($phpcsFile, $usePointer)) {
return;
}
$namespaceName = NamespaceHelper::findCurrentNamespaceName($phpcsFile, $usePointer);
if ($namespaceName === null) {
$namespaceName = '';
}
$usedTypeName = UseStatementHelper::getFullyQualifiedTypeNameFromUse($phpcsFile, $usePointer);
if (!StringHelper::startsWith($usedTypeName, $namespaceName)) {
return;
}
$asPointer = $this->findAsPointer($phpcsFile, $usePointer);
if ($asPointer !== null) {
return;
}
$usedTypeNameRest = substr($usedTypeName, strlen($namespaceName));
if (!NamespaceHelper::isFullyQualifiedName($usedTypeNameRest) && $namespaceName !== '') {
return;
}
if (NamespaceHelper::hasNamespace($usedTypeNameRest)) {
return;
}
$fix = $phpcsFile->addFixableError(sprintf(
'Use %s is from the same namespace that is prohibited.',
$usedTypeName
), $usePointer, self::CODE_USE_FROM_SAME_NAMESPACE);
if (!$fix) {
return;
}
$endPointer = TokenHelper::findNext($phpcsFile, T_SEMICOLON, $usePointer) + 1;
$phpcsFile->fixer->beginChangeset();
FixerHelper::removeBetweenIncluding($phpcsFile, $usePointer, $endPointer);
$phpcsFile->fixer->endChangeset();
}
private function findAsPointer(File $phpcsFile, int $startPointer): ?int
{
return TokenHelper::findNextLocal($phpcsFile, T_AS, $startPointer);
}
}