From d18eeb133f7da766f0341734aa983d05f2b317fd Mon Sep 17 00:00:00 2001
From: Klaus Purer <klaus.purer@protonmail.ch>
Date: Sat, 18 Jan 2025 18:05:53 +0100
Subject: [PATCH] fix(FullyQualifiedNamespace): Do not check names in PHP
 attributes for now (#3483583)

---
 .../Classes/FullyQualifiedNamespaceSniff.php  |  5 +++
 .../FullyQualifiedNamespaceUnitTest.4.inc     |  2 +-
 ...ullyQualifiedNamespaceUnitTest.4.inc.fixed | 13 ++++----
 .../FullyQualifiedNamespaceUnitTest.php       |  6 +---
 .../Commenting/ClassCommentUnitTest.inc.fixed |  4 +--
 .../FunctionCommentUnitTest.inc.fixed         |  4 +--
 tests/Drupal/good/good.php                    | 32 +++++++++++++++++++
 7 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/coder_sniffer/Drupal/Sniffs/Classes/FullyQualifiedNamespaceSniff.php b/coder_sniffer/Drupal/Sniffs/Classes/FullyQualifiedNamespaceSniff.php
index ee6e564f..eac0e35a 100644
--- a/coder_sniffer/Drupal/Sniffs/Classes/FullyQualifiedNamespaceSniff.php
+++ b/coder_sniffer/Drupal/Sniffs/Classes/FullyQualifiedNamespaceSniff.php
@@ -65,6 +65,11 @@ class FullyQualifiedNamespaceSniff implements Sniff
             return;
         }
 
+        // Skip names in PHP attributes, no standards defined yet.
+        if (isset($tokens[$stackPtr]['attribute_closer']) === true) {
+            return $tokens[$stackPtr]['attribute_closer'];
+        }
+
         // Check if this is a use statement and ignore those.
         $before = $phpcsFile->findPrevious([T_STRING, T_NS_SEPARATOR, T_WHITESPACE, T_COMMA, T_AS], $stackPtr, null, true);
         if ($tokens[$before]['code'] === T_USE || $tokens[$before]['code'] === T_NAMESPACE) {
diff --git a/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc b/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc
index 1badbe14..5b79ae8f 100644
--- a/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc
+++ b/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc
@@ -8,7 +8,7 @@ use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Session\AccountInterface;
 
 /**
- * Test action which is always usable.
+ * Fully qualified names are allowed, there is no standard yet.
  */
 #[\Drupal\action_link\Attribute\StateAction(
   id: 'test_always',
diff --git a/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc.fixed b/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc.fixed
index 07dd59e1..5b79ae8f 100644
--- a/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc.fixed
+++ b/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.4.inc.fixed
@@ -2,17 +2,18 @@
 
 namespace Drupal\action_link_test_plugins\Plugin\StateAction;
 
-use Drupal\Core\StringTranslation\TranslatableMarkup;
-use Drupal\action_link\Attribute\StateAction;
+use Drupal\action_link\Entity\ActionLinkInterface;
 use Drupal\action_link\Plugin\StateAction\StateActionBase;
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Session\AccountInterface;
 
 /**
- * Test action which is always usable.
+ * Fully qualified names are allowed, there is no standard yet.
  */
-#[StateAction(
+#[\Drupal\action_link\Attribute\StateAction(
   id: 'test_always',
-  label: new TranslatableMarkup('Test Always'),
-  description: new TranslatableMarkup('Test Always'),
+  label: new \Drupal\Core\StringTranslation\TranslatableMarkup('Test Always'),
+  description: new \Drupal\Core\StringTranslation\TranslatableMarkup('Test Always'),
   directions: [
     'change' => 'change',
   ]
diff --git a/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.php b/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.php
index 1ec06c33..aa80f26a 100644
--- a/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.php
+++ b/tests/Drupal/Classes/FullyQualifiedNamespaceUnitTest.php
@@ -38,11 +38,7 @@ class FullyQualifiedNamespaceUnitTest extends CoderSniffUnitTest
         case 'FullyQualifiedNamespaceUnitTest.3.inc':
             return [10 => 2];
         case 'FullyQualifiedNamespaceUnitTest.4.inc':
-            return [
-                13 => 1,
-                15 => 1,
-                16 => 1,
-            ];
+            return [];
         }//end switch
 
         return [];
diff --git a/tests/Drupal/Commenting/ClassCommentUnitTest.inc.fixed b/tests/Drupal/Commenting/ClassCommentUnitTest.inc.fixed
index 805cb8a3..3c04bade 100644
--- a/tests/Drupal/Commenting/ClassCommentUnitTest.inc.fixed
+++ b/tests/Drupal/Commenting/ClassCommentUnitTest.inc.fixed
@@ -5,8 +5,6 @@
  * Testing class/trait comments.
  */
 
-use Some\Attribute;
-
 /**
  *
  */
@@ -62,7 +60,7 @@ class WrongSpacing {
 /**
  * This is correct.
  */
-#[Attribute(foo: 'bar')]
+#[Some\Attribute(foo: 'bar')]
 #[Other\Attribute(baz: 'qux')]
 class DoubleAttribute {
 
diff --git a/tests/Drupal/Commenting/FunctionCommentUnitTest.inc.fixed b/tests/Drupal/Commenting/FunctionCommentUnitTest.inc.fixed
index 4647d931..817400ca 100644
--- a/tests/Drupal/Commenting/FunctionCommentUnitTest.inc.fixed
+++ b/tests/Drupal/Commenting/FunctionCommentUnitTest.inc.fixed
@@ -5,8 +5,6 @@
  * Some function comment tests.
  */
 
-use Some\Attribute;
-
 /**
  * Test.
  *
@@ -581,7 +579,7 @@ class Test41 {
   /**
    * Method docblock.
    */
-  #[Attribute(foo: 'bar')]
+  #[Some\Attribute(foo: 'bar')]
   #[Other\Attribute(baz: 'qux')]
   public function method() {
   }
diff --git a/tests/Drupal/good/good.php b/tests/Drupal/good/good.php
index bd8d911b..26fdb6d6 100644
--- a/tests/Drupal/good/good.php
+++ b/tests/Drupal/good/good.php
@@ -1914,3 +1914,35 @@ enum PUROSELY_WRONG_BUT_OK: int {
   case One = 1;
   case Two = 2;
 }
+
+/**
+ * Fully qualified class name is allowed in PHP attributes for now.
+ */
+#[\Drupal\action_link\Attribute\StateAction(
+  id: 'test_always',
+  label: new \Drupal\Core\StringTranslation\TranslatableMarkup('Test Always'),
+  description: new \Drupal\Core\StringTranslation\TranslatableMarkup('Test Always'),
+  directions: [
+    'change' => 'change',
+  ]
+)]
+class TestAlways extends StateActionBase {
+
+  /**
+   * Partial names are ok in attributes for now.
+   */
+  #[Assert\NotBlank]
+  private bool $bar;
+
+  /**
+   * Partially qualified names are ok in attributes for now.
+   */
+  #[CLI\Command(
+    name: 'example',
+    aliases: ['example-foo']
+  )]
+  #[CLI\Option(name: 'pretty_format', description: 'Display the count in pretty format.')]
+  public function test(array $options = ['pretty-format' => TRUE]): void {
+  }
+
+}
-- 
GitLab