From 3f64e2bf2ce9f58861fc6d50aa67d52a4ccb1ee4 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Sat, 6 Apr 2024 11:02:39 +0100
Subject: [PATCH] Issue #3421015 by godotislate: Convert MigrateDestination
 plugin discovery to attributes

(cherry picked from commit 38e722aa6f1ac54cfe199f4116232829d410c872)
---
 .../ban/src/Plugin/migrate/destination/BlockedIp.php  |  6 ++----
 .../src/Plugin/migrate/destination/EntityBlock.php    |  6 +++---
 .../src/Plugin/migrate/destination/EntityComment.php  |  6 +++---
 .../Plugin/migrate/destination/EntityCommentType.php  |  6 +++---
 .../Plugin/migrate/destination/EntityImageStyle.php   |  6 ++----
 .../Plugin/migrate/destination/DefaultLangcode.php    |  6 ++----
 .../migrate/src/Plugin/migrate/destination/Config.php |  6 ++----
 .../migrate/src/Plugin/migrate/destination/Entity.php | 11 ++++++-----
 .../migrate/destination/EntityBaseFieldOverride.php   |  6 ++----
 .../migrate/destination/EntityContentComplete.php     | 11 ++++++-----
 .../migrate/destination/EntityFieldInstance.php       |  7 +++----
 .../migrate/destination/EntityFieldStorageConfig.php  |  7 +++----
 .../src/Plugin/migrate/destination/EntityRevision.php | 11 ++++++-----
 .../src/Plugin/migrate/destination/EntityViewMode.php |  7 +++----
 .../Plugin/migrate/destination/NullDestination.php    | 10 +++++-----
 .../migrate/destination/PerComponentEntityDisplay.php |  7 +++----
 .../destination/PerComponentEntityFormDisplay.php     |  7 +++----
 .../Plugin/migrate/destination/DummyDestination.php   | 10 ++++++----
 .../src/Plugin/migrate/destination/EntityNodeType.php |  6 +++---
 .../Plugin/migrate/destination/EntitySearchPage.php   |  6 ++----
 .../Plugin/migrate/destination/EntityShortcutSet.php  |  6 +++---
 .../Plugin/migrate/destination/ShortcutSetUsers.php   |  6 +++---
 .../src/Plugin/migrate/destination/NodeCounter.php    | 10 +++++-----
 .../Plugin/migrate/destination/EntityDateFormat.php   |  6 +++---
 .../Plugin/migrate/destination/d7/ThemeSettings.php   |  6 ++----
 .../migrate/destination/EntityTaxonomyVocabulary.php  |  6 +++---
 .../src/Plugin/migrate/destination/EntityUser.php     |  6 ++----
 .../src/Plugin/migrate/destination/EntityUserRole.php |  6 ++----
 .../user/src/Plugin/migrate/destination/UserData.php  |  6 +++---
 29 files changed, 94 insertions(+), 112 deletions(-)

diff --git a/core/modules/ban/src/Plugin/migrate/destination/BlockedIp.php b/core/modules/ban/src/Plugin/migrate/destination/BlockedIp.php
index b0c0e482daef..70f9f2cc7da7 100644
--- a/core/modules/ban/src/Plugin/migrate/destination/BlockedIp.php
+++ b/core/modules/ban/src/Plugin/migrate/destination/BlockedIp.php
@@ -4,6 +4,7 @@
 
 use Drupal\ban\BanIpManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Plugin\migrate\destination\DestinationBase;
 use Drupal\migrate\Row;
@@ -11,11 +12,8 @@
 
 /**
  * Destination for blocked IP addresses.
- *
- * @MigrateDestination(
- *   id = "blocked_ip"
- * )
  */
+#[MigrateDestination('blocked_ip')]
 class BlockedIp extends DestinationBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/core/modules/block/src/Plugin/migrate/destination/EntityBlock.php b/core/modules/block/src/Plugin/migrate/destination/EntityBlock.php
index 33ebcdda0d95..7fd997c6f541 100644
--- a/core/modules/block/src/Plugin/migrate/destination/EntityBlock.php
+++ b/core/modules/block/src/Plugin/migrate/destination/EntityBlock.php
@@ -3,15 +3,15 @@
 namespace Drupal\block\Plugin\migrate\destination;
 
 use Drupal\Core\Config\Schema\SchemaIncompleteException;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 use Drupal\migrate\Row;
 
 /**
- * @MigrateDestination(
- *   id = "entity:block"
- * )
+ * Migrate destination for block entity.
  */
+#[MigrateDestination('entity:block')]
 class EntityBlock extends EntityConfigBase {
 
   /**
diff --git a/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php b/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php
index 2c8fd56b2f59..3b04631fd89f 100644
--- a/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php
+++ b/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php
@@ -7,16 +7,16 @@
 use Drupal\Core\Field\FieldTypePluginManagerInterface;
 use Drupal\Core\Session\AccountSwitcherInterface;
 use Drupal\Core\State\StateInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
 use Drupal\migrate\Row;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * @MigrateDestination(
- *   id = "entity:comment"
- * )
+ * Comment entity destination.
  */
+#[MigrateDestination('entity:comment')]
 class EntityComment extends EntityContentBase {
 
   /**
diff --git a/core/modules/comment/src/Plugin/migrate/destination/EntityCommentType.php b/core/modules/comment/src/Plugin/migrate/destination/EntityCommentType.php
index 9bee87a3a1dc..231bab0838a4 100644
--- a/core/modules/comment/src/Plugin/migrate/destination/EntityCommentType.php
+++ b/core/modules/comment/src/Plugin/migrate/destination/EntityCommentType.php
@@ -2,14 +2,14 @@
 
 namespace Drupal\comment\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 use Drupal\migrate\Row;
 
 /**
- * @MigrateDestination(
- *   id = "entity:comment_type"
- * )
+ * Comment type destination.
  */
+#[MigrateDestination('entity:comment_type')]
 class EntityCommentType extends EntityConfigBase {
 
   /**
diff --git a/core/modules/image/src/Plugin/migrate/destination/EntityImageStyle.php b/core/modules/image/src/Plugin/migrate/destination/EntityImageStyle.php
index 84a390e4c053..f1922ffac18e 100644
--- a/core/modules/image/src/Plugin/migrate/destination/EntityImageStyle.php
+++ b/core/modules/image/src/Plugin/migrate/destination/EntityImageStyle.php
@@ -3,6 +3,7 @@
 namespace Drupal\image\Plugin\migrate\destination;
 
 use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 use Drupal\migrate\Row;
@@ -12,11 +13,8 @@
  *
  * Every migration that uses this destination must have an optional
  * dependency on the d6_file migration to ensure it runs first.
- *
- * @MigrateDestination(
- *   id = "entity:image_style"
- * )
  */
+#[MigrateDestination('entity:image_style')]
 class EntityImageStyle extends EntityConfigBase {
 
   /**
diff --git a/core/modules/language/src/Plugin/migrate/destination/DefaultLangcode.php b/core/modules/language/src/Plugin/migrate/destination/DefaultLangcode.php
index 4d13e9adb4b9..8a6451b52b2f 100644
--- a/core/modules/language/src/Plugin/migrate/destination/DefaultLangcode.php
+++ b/core/modules/language/src/Plugin/migrate/destination/DefaultLangcode.php
@@ -3,17 +3,15 @@
 namespace Drupal\language\Plugin\migrate\destination;
 
 use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\Plugin\migrate\destination\Config;
 use Drupal\migrate\Row;
 
 /**
  * Provides a destination plugin for the default langcode config.
- *
- * @MigrateDestination(
- *   id = "default_langcode"
- * )
  */
+#[MigrateDestination('default_langcode')]
 class DefaultLangcode extends Config {
 
   /**
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/Config.php b/core/modules/migrate/src/Plugin/migrate/destination/Config.php
index 3c037466fbad..ea560e183222 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/Config.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/Config.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Entity\DependencyTrait;
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -64,11 +65,8 @@
  * "d6_variable_translation" source plugin.
  *
  * @see \Drupal\migrate_drupal\Plugin\migrate\source\d6\VariableTranslation
- *
- * @MigrateDestination(
- *   id = "config"
- * )
  */
+#[MigrateDestination('config')]
 class Config extends DestinationBase implements ContainerFactoryPluginInterface, DependentPluginInterface {
 
   use DependencyTrait;
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/Entity.php b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php
index 503a537a9781..49cbf873987e 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/Entity.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php
@@ -9,7 +9,9 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\EntityFieldDefinitionTrait;
+use Drupal\migrate\Plugin\Derivative\MigrateEntity;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -57,12 +59,11 @@
  * @endcode
  *
  * This will save the processed, migrated row as a node of type 'custom'.
- *
- * @MigrateDestination(
- *   id = "entity",
- *   deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntity"
- * )
  */
+#[MigrateDestination(
+  id: 'entity',
+  deriver: MigrateEntity::class
+)]
 abstract class Entity extends DestinationBase implements ContainerFactoryPluginInterface, DependentPluginInterface {
 
   use DependencyTrait;
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityBaseFieldOverride.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityBaseFieldOverride.php
index e6b3682eb0bb..0d22d6708297 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/EntityBaseFieldOverride.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityBaseFieldOverride.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Row;
 
 /**
@@ -41,11 +42,8 @@
  *   required:
  *     - d6_node_type
  * @endcode
- *
- * @MigrateDestination(
- *   id = "entity:base_field_override"
- * )
  */
+#[MigrateDestination('entity:base_field_override')]
 class EntityBaseFieldOverride extends EntityConfigBase {
 
   /**
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityContentComplete.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentComplete.php
index f4d565a6014c..2823b572fada 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/EntityContentComplete.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentComplete.php
@@ -5,18 +5,19 @@
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityChangedInterface;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\EntityFieldDefinitionTrait;
+use Drupal\migrate\Plugin\Derivative\MigrateEntityComplete;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Row;
 
 /**
  * Provides a destination for migrating the entire entity revision table.
- *
- * @MigrateDestination(
- *   id = "entity_complete",
- *   deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntityComplete"
- * )
  */
+#[MigrateDestination(
+  id: 'entity_complete',
+  deriver: MigrateEntityComplete::class
+)]
 class EntityContentComplete extends EntityContentBase {
 
   use EntityFieldDefinitionTrait;
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldInstance.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldInstance.php
index 090ec3a93a7c..70051aedf132 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldInstance.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldInstance.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
+
 /**
  * Provides destination plugin for field_config configuration entities.
  *
@@ -40,11 +42,8 @@
  *
  * @see \Drupal\field\Entity\FieldConfig
  * @see \Drupal\field\Entity\FieldConfigBase
- *
- * @MigrateDestination(
- *   id = "entity:field_config"
- * )
  */
+#[MigrateDestination('entity:field_config')]
 class EntityFieldInstance extends EntityConfigBase {
 
   /**
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php
index 0b9714a79b11..0a3530869b30 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
+
 /**
  * Provides destination plugin for field_storage_config configuration entities.
  *
@@ -45,11 +47,8 @@
  *
  * For an example on how to migrate a Field instance of this FieldStorage,
  * refer to \Drupal\migrate\Plugin\migrate\destination\EntityFieldInstance.
- *
- * @MigrateDestination(
- *   id = "entity:field_storage_config"
- * )
  */
+#[MigrateDestination('entity:field_storage_config')]
 class EntityFieldStorageConfig extends EntityConfigBase {
 
   /**
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php
index 25bf5c7e96ff..fcf5148c90df 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php
@@ -8,7 +8,9 @@
 use Drupal\Core\Field\FieldTypePluginManagerInterface;
 use Drupal\Core\Session\AccountSwitcherInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\MigrateException;
+use Drupal\migrate\Plugin\Derivative\MigrateEntityRevision;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 
@@ -104,12 +106,11 @@
  *   required:
  *     - custom_article_migration
  * @endcode
- *
- * @MigrateDestination(
- *   id = "entity_revision",
- *   deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntityRevision"
- * )
  */
+#[MigrateDestination(
+  id: 'entity_revision',
+  deriver: MigrateEntityRevision::class
+)]
 class EntityRevision extends EntityContentBase {
 
   /**
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityViewMode.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityViewMode.php
index b2c25a45970d..14cea6058cf4 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/EntityViewMode.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityViewMode.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
+
 /**
  * Provides entity view mode destination plugin.
  *
@@ -23,11 +25,8 @@
  *
  * This will add the results of the process ("mode", "label" and
  * "targetEntityType") to an "entity_view_mode" entity.
- *
- * @MigrateDestination(
- *   id = "entity:entity_view_mode"
- * )
  */
+#[MigrateDestination('entity:entity_view_mode')]
 class EntityViewMode extends EntityConfigBase {
 
   /**
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/NullDestination.php b/core/modules/migrate/src/Plugin/migrate/destination/NullDestination.php
index 96ba3a7ea575..170072b9dff0 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/NullDestination.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/NullDestination.php
@@ -2,16 +2,16 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Row;
 
 /**
  * Provides null destination plugin.
- *
- * @MigrateDestination(
- *   id = "null",
- *   requirements_met = false
- * )
  */
+#[MigrateDestination(
+  id: 'null',
+  requirements_met: FALSE
+)]
 class NullDestination extends DestinationBase {
 
   /**
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityDisplay.php b/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityDisplay.php
index 499ff0f45f4d..17675bd7c2da 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityDisplay.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityDisplay.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
+
 /**
  * This class imports one component of an entity display.
  *
@@ -43,11 +45,8 @@
  * This will add the "user_picture" image field to the "default" view mode of
  * the "user" bundle of the "user" entity type with options as defined by the
  * "options" constant, for example the label will be hidden.
- *
- * @MigrateDestination(
- *   id = "component_entity_display"
- * )
  */
+#[MigrateDestination('component_entity_display')]
 class PerComponentEntityDisplay extends ComponentEntityDisplayBase {
 
   const MODE_NAME = 'view_mode';
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityFormDisplay.php b/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityFormDisplay.php
index 667e8fbcb0db..b449dbcfd4e4 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityFormDisplay.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/PerComponentEntityFormDisplay.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
+
 /**
  * This class imports one component of an entity form display.
  *
@@ -36,11 +38,8 @@
  *
  * This will add a "comment" field on the "default" form mode of the "node"
  * entity type with options defined by the "options" constant.
- *
- * @MigrateDestination(
- *   id = "component_entity_form_display"
- * )
  */
+#[MigrateDestination('component_entity_form_display')]
 class PerComponentEntityFormDisplay extends ComponentEntityDisplayBase {
 
   const MODE_NAME = 'form_mode';
diff --git a/core/modules/migrate/tests/modules/migrate_events_test/src/Plugin/migrate/destination/DummyDestination.php b/core/modules/migrate/tests/modules/migrate_events_test/src/Plugin/migrate/destination/DummyDestination.php
index 568c207af838..77b55e0d2db8 100644
--- a/core/modules/migrate/tests/modules/migrate_events_test/src/Plugin/migrate/destination/DummyDestination.php
+++ b/core/modules/migrate/tests/modules/migrate_events_test/src/Plugin/migrate/destination/DummyDestination.php
@@ -2,15 +2,17 @@
 
 namespace Drupal\migrate_events_test\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\migrate\destination\DestinationBase;
 use Drupal\migrate\Row;
 
 /**
- * @MigrateDestination(
- *   id = "dummy",
- *   requirements_met = true
- * )
+ * Migration dummy destination.
  */
+#[MigrateDestination(
+  id: 'dummy',
+  requirements_met: TRUE
+)]
 class DummyDestination extends DestinationBase {
 
   /**
diff --git a/core/modules/node/src/Plugin/migrate/destination/EntityNodeType.php b/core/modules/node/src/Plugin/migrate/destination/EntityNodeType.php
index cdee1f5fcfa8..9ea39ebda9aa 100644
--- a/core/modules/node/src/Plugin/migrate/destination/EntityNodeType.php
+++ b/core/modules/node/src/Plugin/migrate/destination/EntityNodeType.php
@@ -2,14 +2,14 @@
 
 namespace Drupal\node\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 use Drupal\migrate\Row;
 
 /**
- * @MigrateDestination(
- *   id = "entity:node_type"
- * )
+ * Migration destination for node type entity.
  */
+#[MigrateDestination('entity:node_type')]
 class EntityNodeType extends EntityConfigBase {
 
   /**
diff --git a/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php b/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php
index e2210c703411..ab008f33302f 100644
--- a/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php
+++ b/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Plugin\MigrationInterface;
@@ -17,11 +18,8 @@
 
 /**
  * Migrate destination for search page.
- *
- * @MigrateDestination(
- *   id = "entity:search_page"
- * )
  */
+#[MigrateDestination('entity:search_page')]
 class EntitySearchPage extends EntityConfigBase {
 
   /**
diff --git a/core/modules/shortcut/src/Plugin/migrate/destination/EntityShortcutSet.php b/core/modules/shortcut/src/Plugin/migrate/destination/EntityShortcutSet.php
index fddf08a71261..0f0ec102a847 100644
--- a/core/modules/shortcut/src/Plugin/migrate/destination/EntityShortcutSet.php
+++ b/core/modules/shortcut/src/Plugin/migrate/destination/EntityShortcutSet.php
@@ -2,14 +2,14 @@
 
 namespace Drupal\shortcut\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Row;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 
 /**
- * @MigrateDestination(
- *   id = "entity:shortcut_set"
- * )
+ * Migration destination for shortcut set entity.
  */
+#[MigrateDestination('entity:shortcut_set')]
 class EntityShortcutSet extends EntityConfigBase {
 
   /**
diff --git a/core/modules/shortcut/src/Plugin/migrate/destination/ShortcutSetUsers.php b/core/modules/shortcut/src/Plugin/migrate/destination/ShortcutSetUsers.php
index b6775372e340..f52892f4d381 100644
--- a/core/modules/shortcut/src/Plugin/migrate/destination/ShortcutSetUsers.php
+++ b/core/modules/shortcut/src/Plugin/migrate/destination/ShortcutSetUsers.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\shortcut\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\shortcut\ShortcutSetStorageInterface;
 use Drupal\user\Entity\User;
 use Drupal\migrate\Plugin\MigrationInterface;
@@ -11,10 +12,9 @@
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 
 /**
- * @MigrateDestination(
- *   id = "shortcut_set_users"
- * )
+ * Migration destination for shortcut_set_users.
  */
+#[MigrateDestination('shortcut_set_users')]
 class ShortcutSetUsers extends DestinationBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php b/core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php
index 83bc648298f6..80149345a71d 100644
--- a/core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php
+++ b/core/modules/statistics/src/Plugin/migrate/destination/NodeCounter.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Database\Connection;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\migrate\destination\DestinationBase;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
@@ -13,12 +14,11 @@
 
 /**
  * Destination for node counter.
- *
- * @MigrateDestination(
- *   id = "node_counter",
- *   destination_module = "statistics"
- * )
  */
+#[MigrateDestination(
+  id: 'node_counter',
+  destination_module: 'statistics'
+)]
 class NodeCounter extends DestinationBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/core/modules/system/src/Plugin/migrate/destination/EntityDateFormat.php b/core/modules/system/src/Plugin/migrate/destination/EntityDateFormat.php
index 5bc98b9bc74a..a65960b06fd5 100644
--- a/core/modules/system/src/Plugin/migrate/destination/EntityDateFormat.php
+++ b/core/modules/system/src/Plugin/migrate/destination/EntityDateFormat.php
@@ -4,13 +4,13 @@
 
 use Drupal\Core\Datetime\DateFormatInterface;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 
 /**
- * @MigrateDestination(
- *   id = "entity:date_format"
- * )
+ * Migration destination for date format entity.
  */
+#[MigrateDestination('entity:date_format')]
 class EntityDateFormat extends EntityConfigBase {
 
   /**
diff --git a/core/modules/system/src/Plugin/migrate/destination/d7/ThemeSettings.php b/core/modules/system/src/Plugin/migrate/destination/d7/ThemeSettings.php
index ee1567457d9a..fb3f49cb5915 100644
--- a/core/modules/system/src/Plugin/migrate/destination/d7/ThemeSettings.php
+++ b/core/modules/system/src/Plugin/migrate/destination/d7/ThemeSettings.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Drupal\migrate\Plugin\migrate\destination\DestinationBase;
@@ -11,11 +12,8 @@
 
 /**
  * Persist theme settings to the config system.
- *
- * @MigrateDestination(
- *   id = "d7_theme_settings"
- * )
  */
+#[MigrateDestination('d7_theme_settings')]
 class ThemeSettings extends DestinationBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyVocabulary.php b/core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyVocabulary.php
index 20990337acf4..79afcaa4cec8 100644
--- a/core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyVocabulary.php
+++ b/core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyVocabulary.php
@@ -4,14 +4,14 @@
 
 namespace Drupal\taxonomy\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 use Drupal\migrate\Row;
 
 /**
- * @MigrateDestination(
- *   id = "entity:taxonomy_vocabulary"
- * )
+ * Migration destination for taxonomy vocabulary.
  */
+#[MigrateDestination('entity:taxonomy_vocabulary')]
 class EntityTaxonomyVocabulary extends EntityConfigBase {
 
   /**
diff --git a/core/modules/user/src/Plugin/migrate/destination/EntityUser.php b/core/modules/user/src/Plugin/migrate/destination/EntityUser.php
index f9ecc201c2f7..c05661bbb01f 100644
--- a/core/modules/user/src/Plugin/migrate/destination/EntityUser.php
+++ b/core/modules/user/src/Plugin/migrate/destination/EntityUser.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Field\Plugin\Field\FieldType\EmailItem;
 use Drupal\Core\Password\PasswordInterface;
 use Drupal\Core\Session\AccountSwitcherInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
 use Drupal\migrate\Row;
@@ -61,11 +62,8 @@
  * on different password hash types and a list of other user properties, refer
  * to the handbook documentation:
  * @see https://www.drupal.org/docs/8/api/migrate-api/migrate-destination-plugins-examples/migrating-users
- *
- * @MigrateDestination(
- *   id = "entity:user"
- * )
  */
+#[MigrateDestination('entity:user')]
 class EntityUser extends EntityContentBase {
 
   /**
diff --git a/core/modules/user/src/Plugin/migrate/destination/EntityUserRole.php b/core/modules/user/src/Plugin/migrate/destination/EntityUserRole.php
index a70a3d995977..02bf9c7f2bac 100644
--- a/core/modules/user/src/Plugin/migrate/destination/EntityUserRole.php
+++ b/core/modules/user/src/Plugin/migrate/destination/EntityUserRole.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
@@ -12,11 +13,8 @@
 
 /**
  * Provides a destination plugin for migrating user role entities.
- *
- * @MigrateDestination(
- *   id = "entity:user_role"
- * )
  */
+#[MigrateDestination('entity:user_role')]
 class EntityUserRole extends EntityConfigBase {
 
   /**
diff --git a/core/modules/user/src/Plugin/migrate/destination/UserData.php b/core/modules/user/src/Plugin/migrate/destination/UserData.php
index b3d46558a538..183e3d9b901a 100644
--- a/core/modules/user/src/Plugin/migrate/destination/UserData.php
+++ b/core/modules/user/src/Plugin/migrate/destination/UserData.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\user\Plugin\migrate\destination;
 
+use Drupal\migrate\Attribute\MigrateDestination;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\user\UserData as UserDataStorage;
 use Drupal\migrate\Row;
@@ -10,10 +11,9 @@
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 
 /**
- * @MigrateDestination(
- *   id = "user_data"
- * )
+ * Migration destination for user data.
  */
+#[MigrateDestination('user_data')]
 class UserData extends DestinationBase implements ContainerFactoryPluginInterface {
 
   /**
-- 
GitLab