classNameImportSkipVoters = $classNameImportSkipVoters;
$this->useImportsResolver = $useImportsResolver;
}
public function shouldSkipNameForFullyQualifiedObjectType(File $file, Node $node, FullyQualifiedObjectType $fullyQualifiedObjectType) : bool
{
foreach ($this->classNameImportSkipVoters as $classNameImportSkipVoter) {
if ($classNameImportSkipVoter->shouldSkip($file, $fullyQualifiedObjectType, $node)) {
return \true;
}
}
return \false;
}
/**
* @param array $uses
*/
public function shouldSkipName(FullyQualified $fullyQualified, array $uses) : bool
{
if (\substr_count($fullyQualified->toCodeString(), '\\') === 1) {
return $this->shouldSkipShortName($fullyQualified);
}
// verify long name, as short name verify may conflict
// see test PR: https://github.com/rectorphp/rector-src/pull/6208
// ref https://3v4l.org/21H5j vs https://3v4l.org/GIHSB
$originalName = $fullyQualified->getAttribute(AttributeKey::ORIGINAL_NAME);
if ($originalName instanceof Name && $originalName->getLast() === $originalName->toString()) {
return \true;
}
$stringName = $fullyQualified->toString();
$lastUseName = $fullyQualified->getLast();
$nameLastName = \strtolower($lastUseName);
foreach ($uses as $use) {
$prefix = $this->useImportsResolver->resolvePrefix($use);
$useName = $prefix . $stringName;
foreach ($use->uses as $useUse) {
$useUseLastName = \strtolower($useUse->name->getLast());
if ($useUseLastName !== $nameLastName) {
continue;
}
if ($this->isConflictedShortNameInUse($useUse, $useName, $lastUseName, $stringName)) {
return \true;
}
return $prefix . $useUse->name->toString() !== $stringName;
}
}
return \false;
}
private function shouldSkipShortName(FullyQualified $fullyQualified) : bool
{
// is scalar name?
if (\in_array($fullyQualified->toLowerString(), ['true', 'false', 'bool'], \true)) {
return \true;
}
if ($fullyQualified->isSpecialClassName()) {
return \true;
}
if ($this->isFunctionOrConstantImport($fullyQualified)) {
return \true;
}
// Importing root namespace classes (like \DateTime) is optional
return !SimpleParameterProvider::provideBoolParameter(Option::IMPORT_SHORT_CLASSES);
}
private function isFunctionOrConstantImport(FullyQualified $fullyQualified) : bool
{
if ($fullyQualified->getAttribute(AttributeKey::IS_CONSTFETCH_NAME) === \true) {
return \true;
}
return $fullyQualified->getAttribute(AttributeKey::IS_FUNCCALL_NAME) === \true;
}
private function isConflictedShortNameInUse(UseUse $useUse, string $useName, string $lastUseName, string $stringName) : bool
{
if (!$useUse->alias instanceof Identifier && $useName !== $stringName && $lastUseName === $stringName) {
return \true;
}
return $useUse->alias instanceof Identifier && $useUse->alias->toString() === $stringName;
}
}