From 323b220d8d1c47abc395718f3e7fe55d04ae813b Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sat, 14 Nov 2026 18:17:42 +0100 Subject: [PATCH] [CodingStyle] Keep partially qualified names as written on import names Names written as Field\TextField, ORM\Column or namespace\Sub\Foo are no longer imported. Fully qualified names and names created by rules are still imported. --- .../Fixture/prevent_duplication.php.inc | 32 ------------- ...ce_of.php.inc => skip_instance_of.php.inc} | 28 ----------- ...hp.inc => skip_keep_static_method.php.inc} | 21 --------- .../Fixture/skip_prevent_duplication.php.inc | 15 ++++++ .../class_imported_as_alias.php.inc | 23 --------- .../partial_expression.php.inc | 31 ------------ .../skip_class_imported_as_alias.php.inc | 11 +++++ .../skip_partial_expression.php.inc | 15 ++++++ .../ClassNameImportSkipper.php | 17 +++++++ ...name_different_namespaced_function.php.inc | 23 --------- .../Fixture/inner_with_subnamespace.php.inc | 29 ------------ .../Fixture/inner_with_subnamespace2.php.inc | 29 ------------ ...name_different_namespaced_function.php.inc | 11 +++++ .../skip_inner_with_subnamespace.php.inc | 13 +++++ .../skip_inner_with_subnamespace2.php.inc | 13 +++++ .../AutoImportAliasedNamespaceTest.php | 28 +++++++++++ .../fully_qualified_still_imported.php.inc | 47 +++++++++++++++++++ .../Fixture/skip_aliased_attribute.php.inc | 14 ++++++ .../Fixture/skip_aliased_docblock.php.inc | 18 +++++++ .../Fixture/skip_aliased_new.php.inc | 15 ++++++ .../skip_aliased_with_direct_import.php.inc | 17 +++++++ .../Fixture/skip_plain_namespace_use.php.inc | 13 +++++ ...skip_plain_namespace_use_attribute.php.inc | 15 ++++++ .../skip_plain_namespace_use_docblock.php.inc | 18 +++++++ .../Fixture/skip_relative_name.php.inc | 11 +++++ .../Source/Constraints/Choice.php | 12 +++++ .../Source/Constraints/NotBlank.php | 12 +++++ .../Source/Field/TextField.php | 12 +++++ .../Source/Mapping/Column.php | 12 +++++ .../Source/Mapping/Entity.php | 12 +++++ .../config/configured_rule.php | 8 ++++ .../Fixture/namespaced_use_class.php.inc | 23 --------- .../namespaced_use_single_namespace.php.inc | 31 ------------ .../Fixture/skip_namespaced_use_class.php.inc | 11 +++++ ...ip_namespaced_use_single_namespace.php.inc | 15 ++++++ 35 files changed, 385 insertions(+), 270 deletions(-) delete mode 100644 rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/prevent_duplication.php.inc rename rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/{instance_of.php.inc => skip_instance_of.php.inc} (50%) rename rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/{keep_static_method.php.inc => skip_keep_static_method.php.inc} (50%) create mode 100644 rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_prevent_duplication.php.inc delete mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/class_imported_as_alias.php.inc delete mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/partial_expression.php.inc create mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_class_imported_as_alias.php.inc create mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_partial_expression.php.inc delete mode 100644 tests/Issues/AutoImport/Fixture/do_not_rename_different_namespaced_function.php.inc delete mode 100644 tests/Issues/AutoImport/Fixture/inner_with_subnamespace.php.inc delete mode 100644 tests/Issues/AutoImport/Fixture/inner_with_subnamespace2.php.inc create mode 100644 tests/Issues/AutoImport/Fixture/skip_do_not_rename_different_namespaced_function.php.inc create mode 100644 tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace.php.inc create mode 100644 tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace2.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/AutoImportAliasedNamespaceTest.php create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/fully_qualified_still_imported.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_aliased_attribute.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_aliased_docblock.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_aliased_new.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_aliased_with_direct_import.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_plain_namespace_use.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_plain_namespace_use_attribute.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_plain_namespace_use_docblock.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Fixture/skip_relative_name.php.inc create mode 100644 tests/Issues/AutoImportAliasedNamespace/Source/Constraints/Choice.php create mode 100644 tests/Issues/AutoImportAliasedNamespace/Source/Constraints/NotBlank.php create mode 100644 tests/Issues/AutoImportAliasedNamespace/Source/Field/TextField.php create mode 100644 tests/Issues/AutoImportAliasedNamespace/Source/Mapping/Column.php create mode 100644 tests/Issues/AutoImportAliasedNamespace/Source/Mapping/Entity.php create mode 100644 tests/Issues/AutoImportAliasedNamespace/config/configured_rule.php delete mode 100644 tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_class.php.inc delete mode 100644 tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_single_namespace.php.inc create mode 100644 tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_class.php.inc create mode 100644 tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_single_namespace.php.inc diff --git a/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/prevent_duplication.php.inc b/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/prevent_duplication.php.inc deleted file mode 100644 index d3ef75ca8bc..00000000000 --- a/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/prevent_duplication.php.inc +++ /dev/null @@ -1,32 +0,0 @@ - ------ - diff --git a/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/instance_of.php.inc b/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_instance_of.php.inc similarity index 50% rename from rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/instance_of.php.inc rename to rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_instance_of.php.inc index 173bad67663..bde72ece06d 100644 --- a/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/instance_of.php.inc +++ b/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_instance_of.php.inc @@ -25,31 +25,3 @@ final class ImportPartialInstanceOf } ?> ------ - diff --git a/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/keep_static_method.php.inc b/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_keep_static_method.php.inc similarity index 50% rename from rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/keep_static_method.php.inc rename to rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_keep_static_method.php.inc index 91d516ff7a4..db94464f878 100644 --- a/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/keep_static_method.php.inc +++ b/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_keep_static_method.php.inc @@ -18,24 +18,3 @@ abstract class KeepStaticMethod } ?> ------ - diff --git a/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_prevent_duplication.php.inc b/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_prevent_duplication.php.inc new file mode 100644 index 00000000000..592d8bd8343 --- /dev/null +++ b/rules-tests/CodingStyle/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/skip_prevent_duplication.php.inc @@ -0,0 +1,15 @@ + diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/class_imported_as_alias.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/class_imported_as_alias.php.inc deleted file mode 100644 index f741e1423ca..00000000000 --- a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/class_imported_as_alias.php.inc +++ /dev/null @@ -1,23 +0,0 @@ - ------ - diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/partial_expression.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/partial_expression.php.inc deleted file mode 100644 index dd0368a73bf..00000000000 --- a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/partial_expression.php.inc +++ /dev/null @@ -1,31 +0,0 @@ - ------ - diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_class_imported_as_alias.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_class_imported_as_alias.php.inc new file mode 100644 index 00000000000..a13348d94ad --- /dev/null +++ b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_class_imported_as_alias.php.inc @@ -0,0 +1,11 @@ + diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_partial_expression.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_partial_expression.php.inc new file mode 100644 index 00000000000..8dffc00fd25 --- /dev/null +++ b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNames/skip_partial_expression.php.inc @@ -0,0 +1,15 @@ + diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php index 69dae6f76a0..aa60f75fdca 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php @@ -69,6 +69,10 @@ public function shouldSkipNameForFullyQualifiedObjectType(File $file, Node $node */ public function shouldSkipName(FullyQualified $fullyQualified, array $uses): bool { + if ($this->isWrittenPartiallyQualified($fullyQualified)) { + return true; + } + if (substr_count($fullyQualified->toCodeString(), '\\') === 1) { return $this->isFunctionOrConstantImport($fullyQualified); } @@ -99,6 +103,19 @@ public function shouldSkipName(FullyQualified $fullyQualified, array $uses): boo return false; } + /** + * Keep names written as "Field\TextField" or "namespace\Sub\Foo" as they are + */ + private function isWrittenPartiallyQualified(FullyQualified $fullyQualified): bool + { + $originalName = $fullyQualified->getAttribute(AttributeKey::ORIGINAL_NAME); + if (! $originalName instanceof Name) { + return false; + } + + return $originalName->isQualified() || $originalName->isRelative(); + } + private function isFunctionOrConstantImport(FullyQualified $fullyQualified): bool { if ($fullyQualified->getAttribute(AttributeKey::IS_CONSTFETCH_NAME) === true) { diff --git a/tests/Issues/AutoImport/Fixture/do_not_rename_different_namespaced_function.php.inc b/tests/Issues/AutoImport/Fixture/do_not_rename_different_namespaced_function.php.inc deleted file mode 100644 index 96ca045cb02..00000000000 --- a/tests/Issues/AutoImport/Fixture/do_not_rename_different_namespaced_function.php.inc +++ /dev/null @@ -1,23 +0,0 @@ - ------ - ------ - diff --git a/tests/Issues/AutoImport/Fixture/inner_with_subnamespace2.php.inc b/tests/Issues/AutoImport/Fixture/inner_with_subnamespace2.php.inc deleted file mode 100644 index 3bbd9928c55..00000000000 --- a/tests/Issues/AutoImport/Fixture/inner_with_subnamespace2.php.inc +++ /dev/null @@ -1,29 +0,0 @@ - ------ - diff --git a/tests/Issues/AutoImport/Fixture/skip_do_not_rename_different_namespaced_function.php.inc b/tests/Issues/AutoImport/Fixture/skip_do_not_rename_different_namespaced_function.php.inc new file mode 100644 index 00000000000..48c7dbd32c9 --- /dev/null +++ b/tests/Issues/AutoImport/Fixture/skip_do_not_rename_different_namespaced_function.php.inc @@ -0,0 +1,11 @@ + diff --git a/tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace.php.inc b/tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace.php.inc new file mode 100644 index 00000000000..490ede9ca06 --- /dev/null +++ b/tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace.php.inc @@ -0,0 +1,13 @@ + diff --git a/tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace2.php.inc b/tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace2.php.inc new file mode 100644 index 00000000000..122aac7a1d0 --- /dev/null +++ b/tests/Issues/AutoImport/Fixture/skip_inner_with_subnamespace2.php.inc @@ -0,0 +1,13 @@ + diff --git a/tests/Issues/AutoImportAliasedNamespace/AutoImportAliasedNamespaceTest.php b/tests/Issues/AutoImportAliasedNamespace/AutoImportAliasedNamespaceTest.php new file mode 100644 index 00000000000..e9ca63ae3c5 --- /dev/null +++ b/tests/Issues/AutoImportAliasedNamespace/AutoImportAliasedNamespaceTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/tests/Issues/AutoImportAliasedNamespace/Fixture/fully_qualified_still_imported.php.inc b/tests/Issues/AutoImportAliasedNamespace/Fixture/fully_qualified_still_imported.php.inc new file mode 100644 index 00000000000..37c9d567f04 --- /dev/null +++ b/tests/Issues/AutoImportAliasedNamespace/Fixture/fully_qualified_still_imported.php.inc @@ -0,0 +1,47 @@ + +----- + diff --git a/tests/Issues/AutoImportAliasedNamespace/Fixture/skip_aliased_attribute.php.inc b/tests/Issues/AutoImportAliasedNamespace/Fixture/skip_aliased_attribute.php.inc new file mode 100644 index 00000000000..02e26bc7293 --- /dev/null +++ b/tests/Issues/AutoImportAliasedNamespace/Fixture/skip_aliased_attribute.php.inc @@ -0,0 +1,14 @@ +withImportNames(); diff --git a/tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_class.php.inc b/tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_class.php.inc deleted file mode 100644 index 21e92a6d9fa..00000000000 --- a/tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_class.php.inc +++ /dev/null @@ -1,23 +0,0 @@ - ------ - diff --git a/tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_single_namespace.php.inc b/tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_single_namespace.php.inc deleted file mode 100644 index e21b79a1171..00000000000 --- a/tests/Issues/NamespacedUseAutoImport/Fixture/namespaced_use_single_namespace.php.inc +++ /dev/null @@ -1,31 +0,0 @@ - ------ - diff --git a/tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_class.php.inc b/tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_class.php.inc new file mode 100644 index 00000000000..7469ca4ef37 --- /dev/null +++ b/tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_class.php.inc @@ -0,0 +1,11 @@ + diff --git a/tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_single_namespace.php.inc b/tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_single_namespace.php.inc new file mode 100644 index 00000000000..05645e155b3 --- /dev/null +++ b/tests/Issues/NamespacedUseAutoImport/Fixture/skip_namespaced_use_single_namespace.php.inc @@ -0,0 +1,15 @@ +