From 5aaf92bb9311ea6ddda2779f2c8d615b179ab1b7 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Thu, 21 Mar 2024 08:36:58 +0000
Subject: [PATCH] Issue #3426959: Convert ViewsArea plugin discovery to
 attributes

---
 .../src/Plugin/views/area/ListingEmpty.php      |  4 ++--
 .../node/src/Plugin/views/area/ListingEmpty.php |  4 ++--
 core/modules/views/src/Attribute/ViewsArea.php  | 17 +++++++++++++++++
 .../src/Plugin/views/area/AreaPluginBase.php    |  2 +-
 .../views/src/Plugin/views/area/Broken.php      |  4 ++--
 .../views/src/Plugin/views/area/DisplayLink.php |  4 ++--
 .../views/src/Plugin/views/area/Entity.php      |  4 ++--
 .../src/Plugin/views/area/HTTPStatusCode.php    |  4 ++--
 .../views/src/Plugin/views/area/Messages.php    |  5 +++--
 .../views/src/Plugin/views/area/Result.php      |  4 ++--
 .../views/src/Plugin/views/area/Text.php        |  4 ++--
 .../views/src/Plugin/views/area/TextCustom.php  |  4 ++--
 .../views/src/Plugin/views/area/Title.php       |  4 ++--
 .../views/src/Plugin/views/area/View.php        |  4 ++--
 .../src/Plugin/views/area/TestExample.php       |  4 ++--
 15 files changed, 45 insertions(+), 27 deletions(-)
 create mode 100644 core/modules/views/src/Attribute/ViewsArea.php

diff --git a/core/modules/block_content/src/Plugin/views/area/ListingEmpty.php b/core/modules/block_content/src/Plugin/views/area/ListingEmpty.php
index 545dfb0bdeed..b4ee4737e19b 100644
--- a/core/modules/block_content/src/Plugin/views/area/ListingEmpty.php
+++ b/core/modules/block_content/src/Plugin/views/area/ListingEmpty.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Access\AccessManagerInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Url;
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Plugin\views\area\AreaPluginBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -12,9 +13,8 @@
  * Defines an area plugin to display a block add link.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("block_content_listing_empty")
  */
+#[ViewsArea("block_content_listing_empty")]
 class ListingEmpty extends AreaPluginBase {
 
   /**
diff --git a/core/modules/node/src/Plugin/views/area/ListingEmpty.php b/core/modules/node/src/Plugin/views/area/ListingEmpty.php
index 08e1d272232e..ab50224976e5 100644
--- a/core/modules/node/src/Plugin/views/area/ListingEmpty.php
+++ b/core/modules/node/src/Plugin/views/area/ListingEmpty.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Access\AccessManagerInterface;
 use Drupal\Core\Url;
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Plugin\views\area\AreaPluginBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -11,9 +12,8 @@
  * Defines an area plugin to display a node/add link.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("node_listing_empty")
  */
+#[ViewsArea("node_listing_empty")]
 class ListingEmpty extends AreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Attribute/ViewsArea.php b/core/modules/views/src/Attribute/ViewsArea.php
new file mode 100644
index 000000000000..d0495eee67d6
--- /dev/null
+++ b/core/modules/views/src/Attribute/ViewsArea.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Drupal\views\Attribute;
+
+use Drupal\Component\Plugin\Attribute\PluginID;
+
+/**
+ * Defines a Plugin attribute object for views area handlers.
+ *
+ * @see \Drupal\views\Plugin\views\area\AreaPluginBase
+ *
+ * @ingroup views_area_handlers
+ */
+#[\Attribute(\Attribute::TARGET_CLASS)]
+class ViewsArea extends PluginID {
+
+}
diff --git a/core/modules/views/src/Plugin/views/area/AreaPluginBase.php b/core/modules/views/src/Plugin/views/area/AreaPluginBase.php
index a1a9ccf87a31..dda6daf883ad 100644
--- a/core/modules/views/src/Plugin/views/area/AreaPluginBase.php
+++ b/core/modules/views/src/Plugin/views/area/AreaPluginBase.php
@@ -13,7 +13,7 @@
  * Plugins governing areas of views, such as header, footer, and empty text.
  *
  * Area handler plugins extend \Drupal\views\Plugin\views\area\AreaPluginBase.
- * They must be annotated with \Drupal\views\Annotation\ViewsArea annotation,
+ * They must be attributed with \Drupal\views\Attribute\ViewsArea attribute,
  * and they must be in namespace directory Plugin\views\area.
  *
  * @ingroup views_plugins
diff --git a/core/modules/views/src/Plugin/views/area/Broken.php b/core/modules/views/src/Plugin/views/area/Broken.php
index 7bd6cdbd83ff..91df26e1901f 100644
--- a/core/modules/views/src/Plugin/views/area/Broken.php
+++ b/core/modules/views/src/Plugin/views/area/Broken.php
@@ -2,15 +2,15 @@
 
 namespace Drupal\views\Plugin\views\area;
 
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Plugin\views\BrokenHandlerTrait;
 
 /**
  * A special handler to take the place of missing or broken handlers.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("broken")
  */
+#[ViewsArea("broken")]
 class Broken extends AreaPluginBase {
   use BrokenHandlerTrait;
 
diff --git a/core/modules/views/src/Plugin/views/area/DisplayLink.php b/core/modules/views/src/Plugin/views/area/DisplayLink.php
index 6167edf5693b..6568445d9ee0 100644
--- a/core/modules/views/src/Plugin/views/area/DisplayLink.php
+++ b/core/modules/views/src/Plugin/views/area/DisplayLink.php
@@ -6,15 +6,15 @@
 use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Form\FormBuilderInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Plugin\views\display\PathPluginBase;
 
 /**
  * Views area display_link handler.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("display_link")
  */
+#[ViewsArea("display_link")]
 class DisplayLink extends AreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/Entity.php b/core/modules/views/src/Plugin/views/area/Entity.php
index 221fb44ab27c..bde1ea4684f0 100644
--- a/core/modules/views/src/Plugin/views/area/Entity.php
+++ b/core/modules/views/src/Plugin/views/area/Entity.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\ViewExecutable;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -14,9 +15,8 @@
  * Provides an area handler which renders an entity in a certain view mode.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("entity")
  */
+#[ViewsArea("entity")]
 class Entity extends TokenizeAreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php b/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php
index 5d3f42adf2a4..e41b87aa028f 100644
--- a/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php
+++ b/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php
@@ -3,15 +3,15 @@
 namespace Drupal\views\Plugin\views\area;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Attribute\ViewsArea;
 use Symfony\Component\HttpFoundation\Response;
 
 /**
  * Alter the HTTP response status code used by the view.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("http_status_code")
  */
+#[ViewsArea("http_status_code")]
 class HTTPStatusCode extends AreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/Messages.php b/core/modules/views/src/Plugin/views/area/Messages.php
index c26b995ed388..0d3f434a2bd6 100644
--- a/core/modules/views/src/Plugin/views/area/Messages.php
+++ b/core/modules/views/src/Plugin/views/area/Messages.php
@@ -2,13 +2,14 @@
 
 namespace Drupal\views\Plugin\views\area;
 
+use Drupal\views\Attribute\ViewsArea;
+
 /**
  * Provides an area for messages.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("messages")
  */
+#[ViewsArea("messages")]
 class Messages extends AreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/Result.php b/core/modules/views/src/Plugin/views/area/Result.php
index 6405a9bf4320..cd5c3179863a 100644
--- a/core/modules/views/src/Plugin/views/area/Result.php
+++ b/core/modules/views/src/Plugin/views/area/Result.php
@@ -4,15 +4,15 @@
 
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Plugin\views\style\DefaultSummary;
 
 /**
  * Views area handler to display some configurable result summary.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("result")
  */
+#[ViewsArea("result")]
 class Result extends AreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/Text.php b/core/modules/views/src/Plugin/views/area/Text.php
index d9751b0294da..f37c7eb8b3aa 100644
--- a/core/modules/views/src/Plugin/views/area/Text.php
+++ b/core/modules/views/src/Plugin/views/area/Text.php
@@ -3,14 +3,14 @@
 namespace Drupal\views\Plugin\views\area;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Attribute\ViewsArea;
 
 /**
  * Views area text handler.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("text")
  */
+#[ViewsArea("text")]
 class Text extends TokenizeAreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/TextCustom.php b/core/modules/views/src/Plugin/views/area/TextCustom.php
index 190210280ab9..25f9954d2bbd 100644
--- a/core/modules/views/src/Plugin/views/area/TextCustom.php
+++ b/core/modules/views/src/Plugin/views/area/TextCustom.php
@@ -4,14 +4,14 @@
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Component\Utility\Xss;
+use Drupal\views\Attribute\ViewsArea;
 
 /**
  * Views area text handler.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("text_custom")
  */
+#[ViewsArea("text_custom")]
 class TextCustom extends TokenizeAreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/Title.php b/core/modules/views/src/Plugin/views/area/Title.php
index d6139e0a104b..1e57273b4120 100644
--- a/core/modules/views/src/Plugin/views/area/Title.php
+++ b/core/modules/views/src/Plugin/views/area/Title.php
@@ -3,14 +3,14 @@
 namespace Drupal\views\Plugin\views\area;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Attribute\ViewsArea;
 
 /**
  * Views area title override handler.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("title")
  */
+#[ViewsArea("title")]
 class Title extends AreaPluginBase {
 
   /**
diff --git a/core/modules/views/src/Plugin/views/area/View.php b/core/modules/views/src/Plugin/views/area/View.php
index 6dae7802f705..e9956063d30d 100644
--- a/core/modules/views/src/Plugin/views/area/View.php
+++ b/core/modules/views/src/Plugin/views/area/View.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Views;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -11,9 +12,8 @@
  * Views area handlers. Insert a view inside of an area.
  *
  * @ingroup views_area_handlers
- *
- * @ViewsArea("view")
  */
+#[ViewsArea("view")]
 class View extends AreaPluginBase {
 
   /**
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/area/TestExample.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/area/TestExample.php
index 74818e8bb31d..917fa0f8ccda 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/area/TestExample.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/area/TestExample.php
@@ -4,15 +4,15 @@
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\views\Attribute\ViewsArea;
 use Drupal\views\Plugin\views\area\AreaPluginBase;
 
 /**
  * Test area plugin.
  *
  * @see \Drupal\views\Tests\Handler\AreaTest
- *
- * @ViewsArea("test_example")
  */
+#[ViewsArea("test_example")]
 class TestExample extends AreaPluginBase {
 
   /**
-- 
GitLab