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; } }