summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci/pipeline.yml4
-rw-r--r--composer.json6
-rw-r--r--composer.lock560
-rw-r--r--composer/Metapackage/CoreRecommended/composer.json2
-rw-r--r--composer/Metapackage/DevDependencies/composer.json6
-rw-r--r--composer/Metapackage/PinnedDevDependencies/composer.json47
-rw-r--r--composer/Template/LegacyProject/LICENSE.txt339
-rw-r--r--composer/Template/RecommendedProject/LICENSE.txt339
-rw-r--r--core/.cspell.json2
-rw-r--r--core/.phpstan-baseline.php2043
-rw-r--r--core/.phpunit-next.xml165
-rw-r--r--core/core.services.yml2
-rw-r--r--core/lib/Drupal/Core/Action/ConfigurableActionBase.php24
-rw-r--r--core/lib/Drupal/Core/Display/VariantBase.php21
-rw-r--r--core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginBase.php39
-rw-r--r--core/lib/Drupal/Core/Layout/LayoutDefault.php27
-rw-r--r--core/lib/Drupal/Core/Plugin/ConfigurablePluginBase.php31
-rw-r--r--core/lib/Drupal/Core/Plugin/ConfigurableTrait.php81
-rw-r--r--core/lib/Drupal/Core/Test/PhpUnitTestDiscovery.php346
-rw-r--r--core/lib/Drupal/Core/Test/RunTests/TestFileParser.php7
-rw-r--r--core/lib/Drupal/Core/Test/TestDiscovery.php41
-rw-r--r--core/modules/field/field.module4
-rw-r--r--core/modules/field/src/Hook/FieldHooks.php4
-rw-r--r--core/modules/image/src/ImageEffectBase.php12
-rw-r--r--core/modules/jsonapi/src/Controller/EntityResource.php12
-rw-r--r--core/modules/jsonapi/tests/modules/jsonapi_test_field_type/config/schema/jsonapi_test_field_type.schema.yml11
-rw-r--r--core/modules/jsonapi/tests/modules/jsonapi_test_field_type/src/Plugin/Field/FieldType/EntityReferenceUuidItem.php241
-rw-r--r--core/modules/jsonapi/tests/src/Functional/JsonApiRelationshipTest.php157
-rw-r--r--core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageNegotiationSettingsTest.php1
-rw-r--r--core/modules/link/tests/src/Functional/LinkFieldUITest.php1
-rw-r--r--core/modules/navigation/navigation.services.yml3
-rw-r--r--core/modules/navigation/src/Menu/NavigationMenuLinkTreeManipulators.php159
-rw-r--r--core/modules/navigation/src/Plugin/Block/NavigationMenuBlock.php2
-rw-r--r--core/modules/navigation/tests/src/Kernel/NavigationMenuBlockTest.php64
-rw-r--r--core/modules/navigation/tests/src/Unit/NavigationMenuLinkTreeManipulatorsTest.php308
-rw-r--r--core/modules/node/node.module9
-rw-r--r--core/modules/node/src/NodeAccessControlHandlerInterface.php2
-rw-r--r--core/modules/node/src/NodeGrantDatabaseStorageInterface.php6
-rw-r--r--core/modules/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php1
-rw-r--r--core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php1
-rw-r--r--core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php25
-rw-r--r--core/modules/sqlite/src/Driver/Database/sqlite/Schema.php5
-rw-r--r--core/modules/system/src/Hook/SystemHooks.php4
-rw-r--r--core/modules/system/system.module4
-rw-r--r--core/modules/system/tests/src/Functional/Entity/Traits/EntityDefinitionTestTrait.php56
-rw-r--r--core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php11
-rw-r--r--core/modules/taxonomy/src/Hook/TaxonomyHooks.php5
-rw-r--r--core/modules/taxonomy/taxonomy.module7
-rw-r--r--core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeTest.php1
-rw-r--r--core/modules/workflows/src/Plugin/WorkflowTypeBase.php20
-rw-r--r--core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php11
-rw-r--r--core/phpunit.xml.dist25
-rwxr-xr-xcore/scripts/run-tests.sh222
-rw-r--r--core/tests/Drupal/KernelTests/Core/Database/DriverSpecificSchemaTestBase.php10
-rw-r--r--core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiFindAllClassFilesTest.php71
-rw-r--r--core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiGetTestClassesTest.php108
-rw-r--r--core/tests/Drupal/KernelTests/Core/Test/PhpUnitTestDiscoveryTest.php43
-rw-r--r--core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php7
-rw-r--r--core/tests/Drupal/Tests/Core/Plugin/ConfigurablePluginBaseTest.php47
-rw-r--r--core/tests/Drupal/Tests/Core/Plugin/ConfigurableTraitTest.php205
-rw-r--r--core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php24
-rw-r--r--core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php26
-rw-r--r--core/tests/Drupal/Tests/Core/Test/RunTests/TestFileParserTest.php18
-rw-r--r--core/tests/Drupal/Tests/Core/Test/TestDiscoveryTest.php40
-rw-r--r--core/tests/PHPStan/composer.json2
65 files changed, 3520 insertions, 2607 deletions
diff --git a/.gitlab-ci/pipeline.yml b/.gitlab-ci/pipeline.yml
index c311b1a03a63..06f5c83acbca 100644
--- a/.gitlab-ci/pipeline.yml
+++ b/.gitlab-ci/pipeline.yml
@@ -104,7 +104,7 @@ variables:
script:
- sudo -u www-data -E -H composer run-script drupal-phpunit-upgrade-check
# Need to pass this along directly.
- - sudo -u www-data -E -H php ./core/scripts/run-tests.sh --color --keep-results --types "$TESTSUITE" --concurrency "$CONCURRENCY" --repeat "1" --sqlite "./sites/default/files/tests.sqlite" --dburl $SIMPLETEST_DB --url $SIMPLETEST_BASE_URL --verbose --non-html --all --ci-parallel-node-index $CI_PARALLEL_NODE_INDEX --ci-parallel-node-total $CI_PARALLEL_NODE_TOTAL
+ - sudo -u www-data -E -H php ./core/scripts/run-tests.sh --debug-discovery --color --keep-results --types "$TESTSUITE" --concurrency "$CONCURRENCY" --repeat "1" --sqlite "./sites/default/files/tests.sqlite" --dburl $SIMPLETEST_DB --url $SIMPLETEST_BASE_URL --verbose --non-html --all --ci-parallel-node-index $CI_PARALLEL_NODE_INDEX --ci-parallel-node-total $CI_PARALLEL_NODE_TOTAL
.run-repeat-class-test: &run-repeat-class-test
script:
@@ -234,7 +234,7 @@ variables:
script:
- sudo -u www-data -E -H composer run-script drupal-phpunit-upgrade-check
# Run a small subset of tests to prove non W3C testing still works.
- - sudo -u www-data -E -H php ./core/scripts/run-tests.sh --color --keep-results --types "$TESTSUITE" --concurrency "$CONCURRENCY" --repeat "1" --sqlite "./sites/default/files/tests.sqlite" --dburl $SIMPLETEST_DB --url $SIMPLETEST_BASE_URL --verbose --non-html javascript
+ - sudo -u www-data -E -H php ./core/scripts/run-tests.sh --debug-discovery --color --keep-results --types "$TESTSUITE" --concurrency "$CONCURRENCY" --repeat "1" --sqlite "./sites/default/files/tests.sqlite" --dburl $SIMPLETEST_DB --url $SIMPLETEST_BASE_URL --verbose --non-html javascript
after_script:
- sed -i "s#$CI_PROJECT_DIR/##" ./sites/default/files/simpletest/phpunit-*.xml || true
diff --git a/composer.json b/composer.json
index e508f79cfd4f..735482c6ba62 100644
--- a/composer.json
+++ b/composer.json
@@ -24,7 +24,7 @@
"justinrainbow/json-schema": "^5.2 || ^6.3",
"lullabot/mink-selenium2-driver": "^1.7.3",
"lullabot/php-webdriver": "^2.0.5",
- "mglaman/phpstan-drupal": "^1.2.11 || ^2.0.4",
+ "mglaman/phpstan-drupal": "^2.0.7",
"micheh/phpcs-gitlab": "^1.1 || ^2.0",
"mikey179/vfsstream": "^1.6.11",
"open-telemetry/exporter-otlp": "^1",
@@ -32,8 +32,8 @@
"php-http/guzzle7-adapter": "^1.0",
"phpspec/prophecy-phpunit": "^2",
"phpstan/extension-installer": "^1.4.3",
- "phpstan/phpstan": "^1.12.4 || ^2.1.14",
- "phpstan/phpstan-phpunit": "^1.3.16 || ^2.0.6",
+ "phpstan/phpstan": "^2.1.17",
+ "phpstan/phpstan-phpunit": "^2.0.6",
"phpunit/phpunit": "^10.5.19 || ^11.5.3",
"symfony/browser-kit": "^7.3",
"symfony/css-selector": "^7.3",
diff --git a/composer.lock b/composer.lock
index daeae0497531..24834277046b 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "b958b8cb17ca5b5abe9f6cd8b9469f7f",
+ "content-hash": "cb5ffa459396dd81c6c044041488251c",
"packages": [
{
"name": "asm89/stack-cors",
@@ -2051,29 +2051,29 @@
},
{
"name": "sebastian/diff",
- "version": "5.1.1",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
- "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0",
- "symfony/process": "^6.4"
+ "phpunit/phpunit": "^11.0",
+ "symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.1-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -2106,7 +2106,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
- "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
+ "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2"
},
"funding": [
{
@@ -2114,7 +2114,7 @@
"type": "github"
}
],
- "time": "2024-03-02T07:15:17+00:00"
+ "time": "2024-07-03T04:53:05+00:00"
},
{
"name": "symfony/console",
@@ -5961,16 +5961,16 @@
},
{
"name": "mglaman/phpstan-drupal",
- "version": "2.0.5",
+ "version": "2.0.7",
"source": {
"type": "git",
"url": "https://github.com/mglaman/phpstan-drupal.git",
- "reference": "c50f146e1dbb331c800ddfed38cdf482e4ea0052"
+ "reference": "42cca54ee8bccec83a674ac45d1d17586777187e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/c50f146e1dbb331c800ddfed38cdf482e4ea0052",
- "reference": "c50f146e1dbb331c800ddfed38cdf482e4ea0052",
+ "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/42cca54ee8bccec83a674ac45d1d17586777187e",
+ "reference": "42cca54ee8bccec83a674ac45d1d17586777187e",
"shasum": ""
},
"require": {
@@ -6042,7 +6042,7 @@
"description": "Drupal extension and rules for PHPStan",
"support": {
"issues": "https://github.com/mglaman/phpstan-drupal/issues",
- "source": "https://github.com/mglaman/phpstan-drupal/tree/2.0.5"
+ "source": "https://github.com/mglaman/phpstan-drupal/tree/2.0.7"
},
"funding": [
{
@@ -6058,7 +6058,7 @@
"type": "tidelift"
}
],
- "time": "2025-04-15T16:10:24+00:00"
+ "time": "2025-05-22T18:06:14+00:00"
},
{
"name": "micheh/phpcs-gitlab",
@@ -7514,16 +7514,16 @@
},
{
"name": "phpstan/phpstan",
- "version": "2.1.14",
+ "version": "2.1.17",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "8f2e03099cac24ff3b379864d171c5acbfc6b9a2"
+ "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8f2e03099cac24ff3b379864d171c5acbfc6b9a2",
- "reference": "8f2e03099cac24ff3b379864d171c5acbfc6b9a2",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053",
+ "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053",
"shasum": ""
},
"require": {
@@ -7568,25 +7568,25 @@
"type": "github"
}
],
- "time": "2025-05-02T15:32:28+00:00"
+ "time": "2025-05-21T20:55:28+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
- "version": "2.0.2",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
- "reference": "9d8e7d4e32711715ad78a1fb6ec368df9af01fdf"
+ "reference": "468e02c9176891cc901143da118f09dc9505fc2f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/9d8e7d4e32711715ad78a1fb6ec368df9af01fdf",
- "reference": "9d8e7d4e32711715ad78a1fb6ec368df9af01fdf",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f",
+ "reference": "468e02c9176891cc901143da118f09dc9505fc2f",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.13"
+ "phpstan/phpstan": "^2.1.15"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
@@ -7613,9 +7613,9 @@
"description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
"support": {
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
- "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.2"
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3"
},
- "time": "2025-04-26T19:59:57+00:00"
+ "time": "2025-05-14T10:56:57+00:00"
},
{
"name": "phpstan/phpstan-phpunit",
@@ -7672,35 +7672,35 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "10.1.16",
+ "version": "11.0.9",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "7e308268858ed6baedc8704a304727d20bc07c77"
+ "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77",
- "reference": "7e308268858ed6baedc8704a304727d20bc07c77",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7",
+ "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.19.1 || ^5.1.0",
- "php": ">=8.1",
- "phpunit/php-file-iterator": "^4.1.0",
- "phpunit/php-text-template": "^3.0.1",
- "sebastian/code-unit-reverse-lookup": "^3.0.0",
- "sebastian/complexity": "^3.2.0",
- "sebastian/environment": "^6.1.0",
- "sebastian/lines-of-code": "^2.0.2",
- "sebastian/version": "^4.0.1",
+ "nikic/php-parser": "^5.4.0",
+ "php": ">=8.2",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-text-template": "^4.0.1",
+ "sebastian/code-unit-reverse-lookup": "^4.0.1",
+ "sebastian/complexity": "^4.0.1",
+ "sebastian/environment": "^7.2.0",
+ "sebastian/lines-of-code": "^3.0.1",
+ "sebastian/version": "^5.0.2",
"theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^10.1"
+ "phpunit/phpunit": "^11.5.2"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -7709,7 +7709,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "10.1.x-dev"
+ "dev-main": "11.0.x-dev"
}
},
"autoload": {
@@ -7738,7 +7738,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9"
},
"funding": [
{
@@ -7746,32 +7746,32 @@
"type": "github"
}
],
- "time": "2024-08-22T04:31:57+00:00"
+ "time": "2025-02-25T13:26:39+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "4.1.0",
+ "version": "5.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c"
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c",
- "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -7799,7 +7799,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0"
},
"funding": [
{
@@ -7807,28 +7807,28 @@
"type": "github"
}
],
- "time": "2023-08-31T06:24:48+00:00"
+ "time": "2024-08-27T05:02:59+00:00"
},
{
"name": "phpunit/php-invoker",
- "version": "4.0.0",
+ "version": "5.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git",
- "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
- "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2",
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
"ext-pcntl": "*",
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"suggest": {
"ext-pcntl": "*"
@@ -7836,7 +7836,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -7862,7 +7862,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
- "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
+ "security": "https://github.com/sebastianbergmann/php-invoker/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1"
},
"funding": [
{
@@ -7870,32 +7871,32 @@
"type": "github"
}
],
- "time": "2023-02-03T06:56:09+00:00"
+ "time": "2024-07-03T05:07:44+00:00"
},
{
"name": "phpunit/php-text-template",
- "version": "3.0.1",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748"
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748",
- "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -7922,7 +7923,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
- "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1"
},
"funding": [
{
@@ -7930,32 +7931,32 @@
"type": "github"
}
],
- "time": "2023-08-31T14:07:24+00:00"
+ "time": "2024-07-03T05:08:43+00:00"
},
{
"name": "phpunit/php-timer",
- "version": "6.0.0",
+ "version": "7.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
- "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "6.0-dev"
+ "dev-main": "7.0-dev"
}
},
"autoload": {
@@ -7981,7 +7982,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
- "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
+ "security": "https://github.com/sebastianbergmann/php-timer/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1"
},
"funding": [
{
@@ -7989,20 +7991,20 @@
"type": "github"
}
],
- "time": "2023-02-03T06:57:52+00:00"
+ "time": "2024-07-03T05:09:35+00:00"
},
{
"name": "phpunit/phpunit",
- "version": "10.5.46",
+ "version": "11.5.22",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "8080be387a5be380dda48c6f41cee4a13aadab3d"
+ "reference": "4cd72faaa8f811e4cc63040cba167757660a5538"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8080be387a5be380dda48c6f41cee4a13aadab3d",
- "reference": "8080be387a5be380dda48c6f41cee4a13aadab3d",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4cd72faaa8f811e4cc63040cba167757660a5538",
+ "reference": "4cd72faaa8f811e4cc63040cba167757660a5538",
"shasum": ""
},
"require": {
@@ -8015,23 +8017,23 @@
"myclabs/deep-copy": "^1.13.1",
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
- "php": ">=8.1",
- "phpunit/php-code-coverage": "^10.1.16",
- "phpunit/php-file-iterator": "^4.1.0",
- "phpunit/php-invoker": "^4.0.0",
- "phpunit/php-text-template": "^3.0.1",
- "phpunit/php-timer": "^6.0.0",
- "sebastian/cli-parser": "^2.0.1",
- "sebastian/code-unit": "^2.0.0",
- "sebastian/comparator": "^5.0.3",
- "sebastian/diff": "^5.1.1",
- "sebastian/environment": "^6.1.0",
- "sebastian/exporter": "^5.1.2",
- "sebastian/global-state": "^6.0.2",
- "sebastian/object-enumerator": "^5.0.0",
- "sebastian/recursion-context": "^5.0.0",
- "sebastian/type": "^4.0.0",
- "sebastian/version": "^4.0.1"
+ "php": ">=8.2",
+ "phpunit/php-code-coverage": "^11.0.9",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-invoker": "^5.0.1",
+ "phpunit/php-text-template": "^4.0.1",
+ "phpunit/php-timer": "^7.0.1",
+ "sebastian/cli-parser": "^3.0.2",
+ "sebastian/code-unit": "^3.0.3",
+ "sebastian/comparator": "^6.3.1",
+ "sebastian/diff": "^6.0.2",
+ "sebastian/environment": "^7.2.1",
+ "sebastian/exporter": "^6.3.0",
+ "sebastian/global-state": "^7.0.2",
+ "sebastian/object-enumerator": "^6.0.1",
+ "sebastian/type": "^5.1.2",
+ "sebastian/version": "^5.0.2",
+ "staabm/side-effects-detector": "^1.0.5"
},
"suggest": {
"ext-soap": "To be able to generate mocks based on WSDL files"
@@ -8042,7 +8044,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "10.5-dev"
+ "dev-main": "11.5-dev"
}
},
"autoload": {
@@ -8074,7 +8076,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.46"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.22"
},
"funding": [
{
@@ -8098,7 +8100,7 @@
"type": "tidelift"
}
],
- "time": "2025-05-02T06:46:24+00:00"
+ "time": "2025-06-06T02:48:05+00:00"
},
{
"name": "ramsey/collection",
@@ -8330,28 +8332,28 @@
},
{
"name": "sebastian/cli-parser",
- "version": "2.0.1",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084"
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084",
- "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180",
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -8375,7 +8377,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2"
},
"funding": [
{
@@ -8383,32 +8385,32 @@
"type": "github"
}
],
- "time": "2024-03-02T07:12:49+00:00"
+ "time": "2024-07-03T04:41:36+00:00"
},
{
"name": "sebastian/code-unit",
- "version": "2.0.0",
+ "version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
- "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
+ "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
- "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64",
+ "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -8431,7 +8433,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
- "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
+ "security": "https://github.com/sebastianbergmann/code-unit/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3"
},
"funding": [
{
@@ -8439,32 +8442,32 @@
"type": "github"
}
],
- "time": "2023-02-03T06:58:43+00:00"
+ "time": "2025-03-19T07:56:08+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
- "version": "3.0.0",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
- "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e",
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -8486,7 +8489,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
- "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
+ "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1"
},
"funding": [
{
@@ -8494,36 +8498,39 @@
"type": "github"
}
],
- "time": "2023-02-03T06:59:15+00:00"
+ "time": "2024-07-03T04:45:54+00:00"
},
{
"name": "sebastian/comparator",
- "version": "5.0.3",
+ "version": "6.3.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e"
+ "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e",
- "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959",
+ "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-mbstring": "*",
- "php": ">=8.1",
- "sebastian/diff": "^5.0",
- "sebastian/exporter": "^5.0"
+ "php": ">=8.2",
+ "sebastian/diff": "^6.0",
+ "sebastian/exporter": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^10.5"
+ "phpunit/phpunit": "^11.4"
+ },
+ "suggest": {
+ "ext-bcmath": "For comparing BcMath\\Number objects"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "6.3-dev"
}
},
"autoload": {
@@ -8563,7 +8570,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
- "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1"
},
"funding": [
{
@@ -8571,33 +8578,33 @@
"type": "github"
}
],
- "time": "2024-10-18T14:56:07+00:00"
+ "time": "2025-03-07T06:57:01+00:00"
},
{
"name": "sebastian/complexity",
- "version": "3.2.0",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "68ff824baeae169ec9f2137158ee529584553799"
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799",
- "reference": "68ff824baeae169ec9f2137158ee529584553799",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0",
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.18 || ^5.0",
- "php": ">=8.1"
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.2-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -8621,7 +8628,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
"security": "https://github.com/sebastianbergmann/complexity/security/policy",
- "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0"
+ "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1"
},
"funding": [
{
@@ -8629,27 +8636,27 @@
"type": "github"
}
],
- "time": "2023-12-21T08:37:17+00:00"
+ "time": "2024-07-03T04:49:50+00:00"
},
{
"name": "sebastian/environment",
- "version": "6.1.0",
+ "version": "7.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
+ "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
- "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4",
+ "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.3"
},
"suggest": {
"ext-posix": "*"
@@ -8657,7 +8664,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "6.1-dev"
+ "dev-main": "7.2-dev"
}
},
"autoload": {
@@ -8685,42 +8692,54 @@
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy",
- "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
+ "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/environment",
+ "type": "tidelift"
}
],
- "time": "2024-03-23T08:47:14+00:00"
+ "time": "2025-05-21T11:55:47+00:00"
},
{
"name": "sebastian/exporter",
- "version": "5.1.2",
+ "version": "6.3.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "955288482d97c19a372d3f31006ab3f37da47adf"
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf",
- "reference": "955288482d97c19a372d3f31006ab3f37da47adf",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3",
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
- "php": ">=8.1",
- "sebastian/recursion-context": "^5.0"
+ "php": ">=8.2",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.1-dev"
+ "dev-main": "6.1-dev"
}
},
"autoload": {
@@ -8763,7 +8782,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy",
- "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0"
},
"funding": [
{
@@ -8771,35 +8790,35 @@
"type": "github"
}
],
- "time": "2024-03-02T07:17:12+00:00"
+ "time": "2024-12-05T09:17:50+00:00"
},
{
"name": "sebastian/global-state",
- "version": "6.0.2",
+ "version": "7.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9"
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
- "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7",
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7",
"shasum": ""
},
"require": {
- "php": ">=8.1",
- "sebastian/object-reflector": "^3.0",
- "sebastian/recursion-context": "^5.0"
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
"ext-dom": "*",
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "6.0-dev"
+ "dev-main": "7.0-dev"
}
},
"autoload": {
@@ -8825,7 +8844,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"security": "https://github.com/sebastianbergmann/global-state/security/policy",
- "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2"
},
"funding": [
{
@@ -8833,33 +8852,33 @@
"type": "github"
}
],
- "time": "2024-03-02T07:19:19+00:00"
+ "time": "2024-07-03T04:57:36+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "2.0.2",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0"
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0",
- "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a",
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.18 || ^5.0",
- "php": ">=8.1"
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -8883,7 +8902,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1"
},
"funding": [
{
@@ -8891,34 +8910,34 @@
"type": "github"
}
],
- "time": "2023-12-21T08:38:20+00:00"
+ "time": "2024-07-03T04:58:38+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "5.0.0",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
- "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa",
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa",
"shasum": ""
},
"require": {
- "php": ">=8.1",
- "sebastian/object-reflector": "^3.0",
- "sebastian/recursion-context": "^5.0"
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -8940,7 +8959,8 @@
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
+ "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1"
},
"funding": [
{
@@ -8948,32 +8968,32 @@
"type": "github"
}
],
- "time": "2023-02-03T07:08:32+00:00"
+ "time": "2024-07-03T05:00:13+00:00"
},
{
"name": "sebastian/object-reflector",
- "version": "3.0.0",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
- "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9",
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -8995,7 +9015,8 @@
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
- "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
+ "security": "https://github.com/sebastianbergmann/object-reflector/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1"
},
"funding": [
{
@@ -9003,32 +9024,32 @@
"type": "github"
}
],
- "time": "2023-02-03T07:06:18+00:00"
+ "time": "2024-07-03T05:01:32+00:00"
},
{
"name": "sebastian/recursion-context",
- "version": "5.0.0",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
- "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16",
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -9058,7 +9079,8 @@
"homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0"
+ "security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2"
},
"funding": [
{
@@ -9066,32 +9088,32 @@
"type": "github"
}
],
- "time": "2023-02-03T07:05:40+00:00"
+ "time": "2024-07-03T05:10:34+00:00"
},
{
"name": "sebastian/type",
- "version": "4.0.0",
+ "version": "5.1.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
+ "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
- "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e",
+ "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.1-dev"
}
},
"autoload": {
@@ -9114,7 +9136,8 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
+ "security": "https://github.com/sebastianbergmann/type/security/policy",
+ "source": "https://github.com/sebastianbergmann/type/tree/5.1.2"
},
"funding": [
{
@@ -9122,29 +9145,29 @@
"type": "github"
}
],
- "time": "2023-02-03T07:10:45+00:00"
+ "time": "2025-03-18T13:35:50+00:00"
},
{
"name": "sebastian/version",
- "version": "4.0.1",
+ "version": "5.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
- "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -9167,7 +9190,8 @@
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
- "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
+ "security": "https://github.com/sebastianbergmann/version/security/policy",
+ "source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
},
"funding": [
{
@@ -9175,7 +9199,7 @@
"type": "github"
}
],
- "time": "2023-02-07T11:34:05+00:00"
+ "time": "2024-10-09T05:16:32+00:00"
},
{
"name": "seld/jsonlint",
@@ -9557,6 +9581,58 @@
"time": "2025-05-11T03:36:00+00:00"
},
{
+ "name": "staabm/side-effects-detector",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/staabm/side-effects-detector.git",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^1.12.6",
+ "phpunit/phpunit": "^9.6.21",
+ "symfony/var-dumper": "^5.4.43",
+ "tomasvotruba/type-coverage": "1.0.0",
+ "tomasvotruba/unused-public": "1.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "lib/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A static analysis tool to detect side effects in PHP code",
+ "keywords": [
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/staabm/side-effects-detector/issues",
+ "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-20T05:08:20+00:00"
+ },
+ {
"name": "symfony/browser-kit",
"version": "v7.3.0",
"source": {
@@ -10051,8 +10127,8 @@
},
"prefer-stable": true,
"prefer-lowest": false,
- "platform": [],
- "platform-dev": [],
+ "platform": {},
+ "platform-dev": {},
"platform-overrides": {
"php": "8.3.0"
},
diff --git a/composer/Metapackage/CoreRecommended/composer.json b/composer/Metapackage/CoreRecommended/composer.json
index 1bc33217aec2..069bed420fc6 100644
--- a/composer/Metapackage/CoreRecommended/composer.json
+++ b/composer/Metapackage/CoreRecommended/composer.json
@@ -32,7 +32,7 @@
"psr/log": "~3.0.2",
"ralouphie/getallheaders": "~3.0.3",
"revolt/event-loop": "~v1.0.7",
- "sebastian/diff": "~5.1.1",
+ "sebastian/diff": "~6.0.2",
"symfony/console": "~v7.3.0",
"symfony/dependency-injection": "~v7.3.0",
"symfony/deprecation-contracts": "~v3.6.0",
diff --git a/composer/Metapackage/DevDependencies/composer.json b/composer/Metapackage/DevDependencies/composer.json
index 925698516b2a..6e2436f30377 100644
--- a/composer/Metapackage/DevDependencies/composer.json
+++ b/composer/Metapackage/DevDependencies/composer.json
@@ -15,7 +15,7 @@
"justinrainbow/json-schema": "^5.2 || ^6.3",
"lullabot/mink-selenium2-driver": "^1.7.3",
"lullabot/php-webdriver": "^2.0.5",
- "mglaman/phpstan-drupal": "^1.2.11 || ^2.0.4",
+ "mglaman/phpstan-drupal": "^2.0.7",
"micheh/phpcs-gitlab": "^1.1 || ^2.0",
"mikey179/vfsstream": "^1.6.11",
"open-telemetry/exporter-otlp": "^1",
@@ -23,8 +23,8 @@
"php-http/guzzle7-adapter": "^1.0",
"phpspec/prophecy-phpunit": "^2",
"phpstan/extension-installer": "^1.4.3",
- "phpstan/phpstan": "^1.12.4 || ^2.1.14",
- "phpstan/phpstan-phpunit": "^1.3.16 || ^2.0.6",
+ "phpstan/phpstan": "^2.1.17",
+ "phpstan/phpstan-phpunit": "^2.0.6",
"phpunit/phpunit": "^10.5.19 || ^11.5.3",
"symfony/browser-kit": "^7.3",
"symfony/css-selector": "^7.3",
diff --git a/composer/Metapackage/PinnedDevDependencies/composer.json b/composer/Metapackage/PinnedDevDependencies/composer.json
index 8ee808aa7101..5663a6af2551 100644
--- a/composer/Metapackage/PinnedDevDependencies/composer.json
+++ b/composer/Metapackage/PinnedDevDependencies/composer.json
@@ -27,7 +27,7 @@
"lullabot/mink-selenium2-driver": "v1.7.4",
"lullabot/php-webdriver": "v2.0.6",
"marc-mabe/php-enum": "v4.7.1",
- "mglaman/phpstan-drupal": "2.0.5",
+ "mglaman/phpstan-drupal": "2.0.7",
"micheh/phpcs-gitlab": "2.0.0",
"mikey179/vfsstream": "v1.6.12",
"myclabs/deep-copy": "1.13.1",
@@ -52,38 +52,39 @@
"phpspec/prophecy-phpunit": "v2.3.0",
"phpstan/extension-installer": "1.4.3",
"phpstan/phpdoc-parser": "2.1.0",
- "phpstan/phpstan": "2.1.14",
- "phpstan/phpstan-deprecation-rules": "2.0.2",
+ "phpstan/phpstan": "2.1.17",
+ "phpstan/phpstan-deprecation-rules": "2.0.3",
"phpstan/phpstan-phpunit": "2.0.6",
- "phpunit/php-code-coverage": "10.1.16",
- "phpunit/php-file-iterator": "4.1.0",
- "phpunit/php-invoker": "4.0.0",
- "phpunit/php-text-template": "3.0.1",
- "phpunit/php-timer": "6.0.0",
- "phpunit/phpunit": "10.5.46",
+ "phpunit/php-code-coverage": "11.0.9",
+ "phpunit/php-file-iterator": "5.1.0",
+ "phpunit/php-invoker": "5.0.1",
+ "phpunit/php-text-template": "4.0.1",
+ "phpunit/php-timer": "7.0.1",
+ "phpunit/phpunit": "11.5.22",
"ramsey/collection": "2.1.1",
"ramsey/uuid": "4.8.1",
"react/promise": "v3.2.0",
- "sebastian/cli-parser": "2.0.1",
- "sebastian/code-unit": "2.0.0",
- "sebastian/code-unit-reverse-lookup": "3.0.0",
- "sebastian/comparator": "5.0.3",
- "sebastian/complexity": "3.2.0",
- "sebastian/environment": "6.1.0",
- "sebastian/exporter": "5.1.2",
- "sebastian/global-state": "6.0.2",
- "sebastian/lines-of-code": "2.0.2",
- "sebastian/object-enumerator": "5.0.0",
- "sebastian/object-reflector": "3.0.0",
- "sebastian/recursion-context": "5.0.0",
- "sebastian/type": "4.0.0",
- "sebastian/version": "4.0.1",
+ "sebastian/cli-parser": "3.0.2",
+ "sebastian/code-unit": "3.0.3",
+ "sebastian/code-unit-reverse-lookup": "4.0.1",
+ "sebastian/comparator": "6.3.1",
+ "sebastian/complexity": "4.0.1",
+ "sebastian/environment": "7.2.1",
+ "sebastian/exporter": "6.3.0",
+ "sebastian/global-state": "7.0.2",
+ "sebastian/lines-of-code": "3.0.1",
+ "sebastian/object-enumerator": "6.0.1",
+ "sebastian/object-reflector": "4.0.1",
+ "sebastian/recursion-context": "6.0.2",
+ "sebastian/type": "5.1.2",
+ "sebastian/version": "5.0.2",
"seld/jsonlint": "1.11.0",
"seld/phar-utils": "1.2.1",
"seld/signal-handler": "2.0.2",
"sirbrillig/phpcs-variable-analysis": "v2.12.0",
"slevomat/coding-standard": "8.18.1",
"squizlabs/php_codesniffer": "3.13.0",
+ "staabm/side-effects-detector": "1.0.5",
"symfony/browser-kit": "v7.3.0",
"symfony/css-selector": "v7.3.0",
"symfony/dom-crawler": "v7.3.0",
diff --git a/composer/Template/LegacyProject/LICENSE.txt b/composer/Template/LegacyProject/LICENSE.txt
new file mode 100644
index 000000000000..94fb84639c4b
--- /dev/null
+++ b/composer/Template/LegacyProject/LICENSE.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/composer/Template/RecommendedProject/LICENSE.txt b/composer/Template/RecommendedProject/LICENSE.txt
new file mode 100644
index 000000000000..94fb84639c4b
--- /dev/null
+++ b/composer/Template/RecommendedProject/LICENSE.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/core/.cspell.json b/core/.cspell.json
index 8baf6e3d342e..a4cd0b12b3e9 100644
--- a/core/.cspell.json
+++ b/core/.cspell.json
@@ -7,7 +7,7 @@
"**/.*.json",
".*ignore",
"composer.lock",
- "composer/Metapackage/PinnedDevDependencies/composer.json",
+ "../composer/Metapackage/PinnedDevDependencies/composer.json",
"assets/vendor/**",
"misc/jquery.form.js",
"lib/Drupal/Component/Diff/**",
diff --git a/core/.phpstan-baseline.php b/core/.phpstan-baseline.php
index d8dbb74df2b1..e52a99b406fc 100644
--- a/core/.phpstan-baseline.php
+++ b/core/.phpstan-baseline.php
@@ -1238,12 +1238,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/lib/Drupal/Core/Action/ActionManager.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Core\\\\Action\\\\ConfigurableActionBase\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/lib/Drupal/Core/Action/ConfigurableActionBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Core\\\\Action\\\\ConfigurableActionBase\\:\\:validateConfigurationForm\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -3968,12 +3962,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/lib/Drupal/Core/Display/VariantBase.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Core\\\\Display\\\\VariantBase\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/lib/Drupal/Core/Display/VariantBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Core\\\\Display\\\\VariantBase\\:\\:setWeight\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -5162,12 +5150,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginBase.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Core\\\\Entity\\\\EntityReferenceSelection\\\\SelectionPluginBase\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Core\\\\Entity\\\\EntityReferenceSelection\\\\SelectionPluginBase\\:\\:submitConfigurationForm\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -7166,6 +7148,12 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/lib/Drupal/Core/Field/FormatterInterface.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Method Drupal\\\\Core\\\\Field\\\\FormatterPluginManager\\:\\:getInstance\\(\\) return type with generic interface Drupal\\\\Core\\\\Field\\\\FormatterInterface does not specify its types\\: T$#',
+ 'identifier' => 'missingType.generics',
+ 'count' => 1,
+ 'path' => __DIR__ . '/lib/Drupal/Core/Field/FormatterPluginManager.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Core\\\\Field\\\\Plugin\\\\Field\\\\FieldFormatter\\\\EntityReferenceFormatterBase\\:\\:prepareView\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -7238,6 +7226,12 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Variable \\$target_type_info in empty\\(\\) always exists and is not falsy\\.$#',
+ 'identifier' => 'empty.variable',
+ 'count' => 1,
+ 'path' => __DIR__ . '/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Core\\\\Field\\\\Plugin\\\\Field\\\\FieldType\\\\LanguageItem\\:\\:onChange\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -8528,12 +8522,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/lib/Drupal/Core/Layout/LayoutDefault.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Core\\\\Layout\\\\LayoutDefault\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/lib/Drupal/Core/Layout/LayoutDefault.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Core\\\\Layout\\\\LayoutDefault\\:\\:setContext\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -10634,12 +10622,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/lib/Drupal/Core/TypedData/Plugin/DataType/DurationIso8601.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Core\\\\TypedData\\\\Plugin\\\\DataType\\\\ItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Core\\\\TypedData\\\\Plugin\\\\DataType\\\\ItemList\\:\\:onChange\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -14570,12 +14552,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\content_moderation\\\\Plugin\\\\Field\\\\ModerationStateFieldItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\content_moderation\\\\Plugin\\\\Field\\\\ModerationStateFieldItemList\\:\\:onChange\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -14786,192 +14762,24 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateStorageSchemaTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:addEntityTypeAndBundleToWorkflow\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:basicModerationTestCases\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:moderationWithSpecialLanguagesTestCases\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationStateTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\content_moderation\\\\Kernel\\\\ContentModerationSyncingTest\\:\\:addEntityTypeAndBundleToWorkflow\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -16580,174 +16388,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/field/tests/src/FunctionalJavascript/EntityReference/EntityReferenceAdminTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\Entity\\\\Update\\\\SqlContentEntityStorageSchemaColumnTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/field/tests/src/Kernel/Entity/Update/SqlContentEntityStorageSchemaColumnTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\field\\\\Kernel\\\\EntityReference\\\\EntityReferenceFormatterTest\\:\\:createEntityReferenceField\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -19040,12 +18680,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/image/src/Form/ImageStyleFormBase.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\image\\\\ImageEffectBase\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/image/src/ImageEffectBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\image\\\\ImageEffectBase\\:\\:transformDimensions\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -21596,6 +21230,12 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/layout_builder/src/Plugin/Block/FieldBlock.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Method Drupal\\\\layout_builder\\\\Plugin\\\\Block\\\\FieldBlock\\:\\:getFormatter\\(\\) return type with generic interface Drupal\\\\Core\\\\Field\\\\FormatterInterface does not specify its types\\: T$#',
+ 'identifier' => 'missingType.generics',
+ 'count' => 1,
+ 'path' => __DIR__ . '/modules/layout_builder/src/Plugin/Block/FieldBlock.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\layout_builder\\\\Plugin\\\\Block\\\\InlineBlock\\:\\:blockSubmit\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -25346,6 +24986,13 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/migrate/tests/src/Unit/MigrateLookupTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 5,
+ 'path' => __DIR__ . '/modules/migrate/tests/src/Unit/MigrateSourceTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\migrate\\\\Unit\\\\StubSourceGeneratorPlugin\\:\\:getCacheCounts\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -27998,12 +27645,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/path/src/Plugin/Field/FieldType/PathFieldItemList.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\path\\\\Plugin\\\\Field\\\\FieldType\\\\PathFieldItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/path/src/Plugin/Field/FieldType/PathFieldItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\path\\\\Plugin\\\\Field\\\\FieldType\\\\PathFieldItemList\\:\\:setValue\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -29384,12 +29025,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/search/src/Plugin/Block/SearchBlock.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\search\\\\Plugin\\\\ConfigurableSearchPluginBase\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/search/src/Plugin/ConfigurableSearchPluginBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\search\\\\Plugin\\\\ConfigurableSearchPluginBase\\:\\:validateConfigurationForm\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -32044,12 +31679,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedReferenceTestFieldItemList.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedReferenceTestFieldItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedReferenceTestFieldItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedReferenceTestFieldItemList\\:\\:setValue\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -32068,12 +31697,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestBundleFieldItemList.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestBundleFieldItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestBundleFieldItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestBundleFieldItemList\\:\\:setValue\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -32092,12 +31715,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestCacheableIntegerItemList.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestCacheableIntegerItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestCacheableIntegerItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestCacheableIntegerItemList\\:\\:setValue\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -32116,12 +31733,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestCacheableStringItemList.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestCacheableStringItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestCacheableStringItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestCacheableStringItemList\\:\\:setValue\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -32140,12 +31751,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestFieldItemList.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestFieldItemList\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#',
- 'identifier' => 'missingType.generics',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/src/Plugin/Field/ComputedTestFieldItemList.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\entity_test\\\\Plugin\\\\Field\\\\ComputedTestFieldItemList\\:\\:setValue\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -32452,180 +32057,12 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestMapFieldResourceTestBase.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:setUpAuthorization\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestResourceTestBase\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/system/tests/modules/entity_test/tests/src/Functional/Rest/EntityTestResourceTestBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\entity_test\\\\Functional\\\\Rest\\\\EntityTestTextItemNormalizerTest\\:\\:assertAuthenticationEdgeCases\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -40916,6 +40353,12 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/views/src/Plugin/views/field/EntityField.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Method Drupal\\\\views\\\\Plugin\\\\views\\\\field\\\\EntityField\\:\\:getFormatterInstance\\(\\) return type with generic interface Drupal\\\\Core\\\\Field\\\\FormatterInterface does not specify its types\\: T$#',
+ 'identifier' => 'missingType.generics',
+ 'count' => 1,
+ 'path' => __DIR__ . '/modules/views/src/Plugin/views/field/EntityField.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\views\\\\Plugin\\\\views\\\\field\\\\EntityField\\:\\:init\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -44828,174 +44271,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/views/tests/src/Kernel/Entity/FieldEntityTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\EventSubscriber\\\\ViewsEntitySchemaSubscriberIntegrationTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/views/tests/src/Kernel/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\views\\\\Kernel\\\\Handler\\\\AreaEmptyTest\\:\\:viewsData\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -46268,12 +45543,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/modules/workflows/src/Form/WorkflowTransitionEditForm.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\workflows\\\\Plugin\\\\WorkflowTypeBase\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/modules/workflows/src/Plugin/WorkflowTypeBase.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\workflows\\\\Plugin\\\\WorkflowTypeConfigureFormBase\\:\\:setPlugin\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -49010,348 +48279,12 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Element/PathElementFormTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\ContentEntityNonRevisionableFieldTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/ContentEntityNonRevisionableFieldTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Variable \\$title might not be defined\\.$#',
'identifier' => 'variable.undefined',
'count' => 2,
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/CreateSampleEntityTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\DefaultTableMappingIntegrationTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/DefaultTableMappingIntegrationTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\Element\\\\EntityAutocompleteElementFormTest\\:\\:submitForm\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -49394,522 +48327,18 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDecoupledTranslationRevisionsTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateMultipleTypesTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateMultipleTypesTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:baseFieldDeleteWithExistingDataTestCases\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:initialValueFromFieldTestCases\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateProviderTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateProviderTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDefinitionUpdateTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityDeriverTest\\:\\:derivativesProvider\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -49964,174 +48393,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityReferenceFieldTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntitySchemaTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntitySchemaTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\EntityTypedDataDefinitionTest\\:\\:entityDefinitionIsInternalProvider\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -50144,174 +48405,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/EntityViewBuilderTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:addBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:addBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:addBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:addEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:addLongNameBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:addRevisionableBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:applyEntityUpdates\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:deleteEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:doEntityUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:doFieldUpdate\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:enableNewEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:makeBaseFieldEntityKey\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:modifyBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:modifyBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:removeBaseField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:removeBaseFieldIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:removeBundleField\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:removeEntityIndex\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:renameBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:renameDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:renameRevisionBaseTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:renameRevisionDataTable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:resetEntityType\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:updateEntityTypeToNotRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:updateEntityTypeToNotTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:updateEntityTypeToRevisionable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:updateEntityTypeToRevisionableAndTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\KernelTests\\\\Core\\\\Entity\\\\FieldableEntityDefinitionUpdateTest\\:\\:updateEntityTypeToTranslatable\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/Entity/FieldableEntityDefinitionUpdateTest.php',
-];
-$ignoreErrors[] = [
'message' => '#^Variable \\$e might not be defined\\.$#',
'identifier' => 'variable.undefined',
'count' => 1,
@@ -50648,6 +48741,12 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/KernelTests/Core/TypedData/TypedDataTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Method Drupal\\\\KernelTests\\\\KernelTestBase\\:\\:__construct\\(\\) overrides @final method PHPUnit\\\\Framework\\\\TestCase\\:\\:__construct\\(\\)\\.$#',
+ 'identifier' => 'method.parentMethodFinalByPhpDoc',
+ 'count' => 1,
+ 'path' => __DIR__ . '/tests/Drupal/KernelTests/KernelTestBase.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\KernelTests\\\\KernelTestBase\\:\\:assertNoTitle\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -51057,6 +49156,12 @@ Client\\:\\:getConfig will be removed in guzzlehttp/guzzle\\:8\\.0\\.$#',
'path' => __DIR__ . '/tests/Drupal/Tests/BrowserTestBase.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Method Drupal\\\\Tests\\\\BrowserTestBase\\:\\:__construct\\(\\) overrides @final method PHPUnit\\\\Framework\\\\TestCase\\:\\:__construct\\(\\)\\.$#',
+ 'identifier' => 'method.parentMethodFinalByPhpDoc',
+ 'count' => 1,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/BrowserTestBase.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\BrowserTestBase\\:\\:changeDatabasePrefix\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -51933,6 +50038,13 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/Access/AccessResultTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 1,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Access/CsrfTokenGeneratorTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Access\\\\TestController\\:\\:accessAllow\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -51999,12 +50111,26 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 1,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Asset\\\\CssCollectionRendererUnitTest\\:\\:providerTestRender\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
'path' => __DIR__ . '/tests/Drupal/Tests/Core/Asset/CssCollectionRendererUnitTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 1,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Asset/CssOptimizerUnitTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Function Drupal\\\\Core\\\\Asset\\\\file_uri_scheme\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -52497,6 +50623,13 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/DrupalKernel/ValidateHostnameTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 2,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Enhancer/ParamConversionEnhancerTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Entity\\\\EntityConstraintViolationListTest\\:\\:setupEntity\\(\\) return type with generic interface Drupal\\\\Core\\\\Field\\\\FieldItemListInterface does not specify its types\\: T$#',
'identifier' => 'missingType.generics',
'count' => 1,
@@ -52923,6 +51056,13 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/Form/FormBuilderTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 5,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Form/FormCacheTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Form\\\\FormElementHelperTest\\:\\:getElementByNameProvider\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -53097,6 +51237,13 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/Form/FormTestBase.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 7,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Form/FormValidatorTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Form\\\\FormValidatorTest\\:\\:providerTestHandleErrorsWithLimitedValidation\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -53248,6 +51395,13 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/ParamConverter/EntityRevisionParamConverterTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 4,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/ParamConverter/ParamConverterManagerTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\ParamConverter\\\\ParamConverterManagerTest\\:\\:providerTestSetRouteParameterConverters\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -53392,12 +51546,6 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/Plugin/FilteredPluginManagerTraitTest.php',
];
$ignoreErrors[] = [
- 'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Plugin\\\\Fixtures\\\\TestConfigurablePlugin\\:\\:setConfiguration\\(\\) has no return type specified\\.$#',
- 'identifier' => 'missingType.return',
- 'count' => 1,
- 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php',
-];
-$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Plugin\\\\LazyPluginCollectionTestBase\\:\\:setupPluginCollection\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
@@ -54130,6 +52278,13 @@ $ignoreErrors[] = [
'path' => __DIR__ . '/tests/Drupal/Tests/Core/Utility/CallableResolverTest.php',
];
$ignoreErrors[] = [
+ 'message' => '#^Call to deprecated method isType\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+https\\://github\\.com/sebastianbergmann/phpunit/issues/6052$#',
+ 'identifier' => 'staticMethod.deprecated',
+ 'count' => 5,
+ 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php',
+];
+$ignoreErrors[] = [
'message' => '#^Method Drupal\\\\Tests\\\\Core\\\\Utility\\\\TokenTest\\:\\:providerTestReplaceEscaping\\(\\) has no return type specified\\.$#',
'identifier' => 'missingType.return',
'count' => 1,
diff --git a/core/.phpunit-next.xml b/core/.phpunit-next.xml
new file mode 100644
index 000000000000..bb6f9e96087f
--- /dev/null
+++ b/core/.phpunit-next.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<!-- This is a near-copy of phpunit.xml.dist, used to test with upcoming
+ PHPUnit versions.
+
+ Current differences:
+ * for PHPUnit 11: removed duplicate directories from <testsuites>,
+ required in PHPUnit 10, but that cause duplication warnings in
+ PHPUnit 11.
+-->
+
+
+<!-- For how to customize PHPUnit configuration, see core/tests/README.md. -->
+<!-- TODO set checkForUnintentionallyCoveredCode="true" once https://www.drupal.org/node/2626832 is resolved. -->
+<!-- PHPUnit expects functional tests to be run with either a privileged user
+ or your current system user. See core/tests/README.md and
+ https://www.drupal.org/node/2116263 for details.
+-->
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ bootstrap="tests/bootstrap.php"
+ colors="true"
+ beStrictAboutTestsThatDoNotTestAnything="true"
+ beStrictAboutOutputDuringTests="true"
+ beStrictAboutChangesToGlobalState="true"
+ failOnRisky="true"
+ failOnWarning="true"
+ displayDetailsOnTestsThatTriggerErrors="true"
+ displayDetailsOnTestsThatTriggerWarnings="true"
+ displayDetailsOnTestsThatTriggerDeprecations="true"
+ cacheResult="false"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
+ cacheDirectory=".phpunit.cache">
+ <php>
+ <!-- Set error reporting to E_ALL. -->
+ <ini name="error_reporting" value="32767"/>
+ <!-- Do not limit the amount of memory tests take to run. -->
+ <ini name="memory_limit" value="-1"/>
+ <!-- Example SIMPLETEST_BASE_URL value: http://localhost -->
+ <env name="SIMPLETEST_BASE_URL" value=""/>
+ <!-- Example SIMPLETEST_DB value: mysql://username:password@localhost/database_name#table_prefix -->
+ <env name="SIMPLETEST_DB" value=""/>
+ <!-- By default, browser tests will output links that use the base URL set
+ in SIMPLETEST_BASE_URL. However, if your SIMPLETEST_BASE_URL is an internal
+ path (such as may be the case in a virtual or Docker-based environment),
+ you can set the base URL used in the browser test output links to something
+ reachable from your host machine here. This will allow you to follow them
+ directly and view the output. -->
+ <env name="BROWSERTEST_OUTPUT_BASE_URL" value=""/>
+ <!-- The environment variable SYMFONY_DEPRECATIONS_HELPER is used to configure
+ the behavior of the deprecation tests.
+ Drupal core's testing framework is setting this variable to its defaults.
+ Projects with their own requirements need to manage this variable
+ explicitly.
+ -->
+ <!-- To disable deprecation testing completely uncomment the next line. -->
+ <!-- <env name="SYMFONY_DEPRECATIONS_HELPER" value="disabled"/> -->
+ <!-- Deprecation errors can be selectively ignored by specifying a file of
+ regular expression patterns for exclusion.
+ Uncomment the line below to specify a custom deprecations ignore file.
+ NOTE: it may be required to specify the full path to the file to run tests
+ correctly.
+ -->
+ <!-- <env name="SYMFONY_DEPRECATIONS_HELPER" value="ignoreFile=.deprecation-ignore.txt"/> -->
+ <!-- Example for changing the driver class for mink tests MINK_DRIVER_CLASS value: 'Drupal\FunctionalJavascriptTests\DrupalSelenium2Driver' -->
+ <env name="MINK_DRIVER_CLASS" value=""/>
+ <!-- Example for changing the driver args to mink tests MINK_DRIVER_ARGS value: '["http://127.0.0.1:8510"]' -->
+ <env name="MINK_DRIVER_ARGS" value=""/>
+ <!-- Example for changing the driver args to webdriver tests MINK_DRIVER_ARGS_WEBDRIVER value: '["chrome", { "goog:chromeOptions": { "w3c": false } }, "http://localhost:4444/wd/hub"]' For using the Firefox browser, replace "chrome" with "firefox" -->
+ <env name="MINK_DRIVER_ARGS_WEBDRIVER" value=""/>
+ </php>
+ <extensions>
+ <!-- Functional tests HTML output logging. -->
+ <bootstrap class="Drupal\TestTools\Extension\HtmlLogging\HtmlOutputLogger">
+ <!-- The directory where the browser output will be stored. If a relative
+ path is specified, it will be relative to the current working directory
+ of the process running the PHPUnit CLI. In CI environments, this can be
+ overridden by the value set for the "BROWSERTEST_OUTPUT_DIRECTORY"
+ environment variable.
+ -->
+ <parameter name="outputDirectory" value="sites/simpletest/browser_output"/>
+ <!-- By default browser tests print the individual links in the test run
+ report. To avoid overcrowding the output in CI environments, you can
+ set the "verbose" parameter or the "BROWSERTEST_OUTPUT_VERBOSE"
+ environment variable to "false". In GitLabCI, the output is saved
+ anyway as an artifact that can be browsed or downloaded from Gitlab.
+ -->
+ <parameter name="verbose" value="true"/>
+ </bootstrap>
+ <!-- Debug dump() printer. -->
+ <bootstrap class="Drupal\TestTools\Extension\Dump\DebugDump">
+ <parameter name="colors" value="true"/>
+ <parameter name="printCaller" value="true"/>
+ </bootstrap>
+ </extensions>
+ <testsuites>
+ <testsuite name="unit-component">
+ <directory>tests/Drupal/Tests/Component</directory>
+ </testsuite>
+ <testsuite name="unit">
+ <directory>tests/Drupal/Tests</directory>
+ <exclude>tests/Drupal/Tests/Component</exclude>
+ <directory>modules/**/tests/src/Unit</directory>
+ <directory>profiles/**/tests/src/Unit</directory>
+ <directory>themes/**/tests/src/Unit</directory>
+ <directory>../modules/*/**/tests/src/Unit</directory>
+ <directory>../profiles/*/**/tests/src/Unit</directory>
+ <directory>../themes/*/**/tests/src/Unit</directory>
+ </testsuite>
+ <testsuite name="kernel">
+ <directory>tests/Drupal/KernelTests</directory>
+ <directory>modules/**/tests/src/Kernel</directory>
+ <directory>recipes/*/tests/src/Kernel</directory>
+ <directory>profiles/**/tests/src/Kernel</directory>
+ <directory>themes/**/tests/src/Kernel</directory>
+ <directory>../modules/*/**/tests/src/Kernel</directory>
+ <directory>../profiles/*/**/tests/src/Kernel</directory>
+ <directory>../themes/*/**/tests/src/Kernel</directory>
+ </testsuite>
+ <testsuite name="functional">
+ <directory>tests/Drupal/FunctionalTests</directory>
+ <directory>modules/**/tests/src/Functional</directory>
+ <directory>profiles/**/tests/src/Functional</directory>
+ <directory>recipes/*/tests/src/Functional</directory>
+ <directory>themes/**/tests/src/Functional</directory>
+ <directory>../modules/*/**/tests/src/Functional</directory>
+ <directory>../profiles/*/**/tests/src/Functional</directory>
+ <directory>../themes/*/**/tests/src/Functional</directory>
+ </testsuite>
+ <testsuite name="functional-javascript">
+ <directory>tests/Drupal/FunctionalJavascriptTests</directory>
+ <directory>modules/**/tests/src/FunctionalJavascript</directory>
+ <directory>recipes/*/tests/src/FunctionalJavascript</directory>
+ <directory>profiles/**/tests/src/FunctionalJavascript</directory>
+ <directory>themes/**/tests/src/FunctionalJavascript</directory>
+ <directory>../modules/*/**/tests/src/FunctionalJavascript</directory>
+ <directory>../profiles/*/**/tests/src/FunctionalJavascript</directory>
+ <directory>../themes/*/**/tests/src/FunctionalJavascript</directory>
+ </testsuite>
+ <testsuite name="build">
+ <directory>tests/Drupal/BuildTests</directory>
+ <directory>modules/**/tests/src/Build</directory>
+ <directory>../modules/*/**/tests/src/Build</directory>
+ </testsuite>
+ </testsuites>
+ <!-- Settings for coverage reports. -->
+ <source ignoreSuppressionOfDeprecations="true">
+ <include>
+ <directory>./includes</directory>
+ <directory>./lib</directory>
+ <directory>./modules</directory>
+ <directory>../modules</directory>
+ <directory>../sites</directory>
+ </include>
+ <exclude>
+ <directory>./lib/Drupal/Component</directory>
+ <directory>./modules/*/src/Tests</directory>
+ <directory>./modules/*/tests</directory>
+ <directory>../modules/*/src/Tests</directory>
+ <directory>../modules/*/tests</directory>
+ <directory>../modules/*/*/src/Tests</directory>
+ <directory>../modules/*/*/tests</directory>
+ </exclude>
+ </source>
+</phpunit>
diff --git a/core/core.services.yml b/core/core.services.yml
index 534266780de9..31b7a5b6aa52 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -1596,7 +1596,7 @@ services:
arguments: ['@variation_cache.access_policy', '@variation_cache.access_policy_memory', '@cache.access_policy_memory', '@current_user', '@account_switcher']
tags:
- { name: service_collector, call: addAccessPolicy, tag: access_policy }
- Drupal\Core\Session\AccessPolicyChainInterface: '@access_policy_processor'
+ Drupal\Core\Session\AccessPolicyProcessorInterface: '@access_policy_processor'
access_policy.super_user:
class: Drupal\Core\Session\SuperUserAccessPolicy
tags:
diff --git a/core/lib/Drupal/Core/Action/ConfigurableActionBase.php b/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
index dd1e8ccdc541..a2a55f354e6a 100644
--- a/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
+++ b/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
@@ -5,6 +5,7 @@ namespace Drupal\Core\Action;
use Drupal\Component\Plugin\ConfigurableInterface;
use Drupal\Component\Plugin\DependentPluginInterface;
use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\ConfigurableTrait;
use Drupal\Core\Plugin\PluginFormInterface;
/**
@@ -12,6 +13,8 @@ use Drupal\Core\Plugin\PluginFormInterface;
*/
abstract class ConfigurableActionBase extends ActionBase implements ConfigurableInterface, DependentPluginInterface, PluginFormInterface {
+ use ConfigurableTrait;
+
/**
* {@inheritdoc}
*/
@@ -24,27 +27,6 @@ abstract class ConfigurableActionBase extends ActionBase implements Configurable
/**
* {@inheritdoc}
*/
- public function defaultConfiguration() {
- return [];
- }
-
- /**
- * {@inheritdoc}
- */
- public function getConfiguration() {
- return $this->configuration;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setConfiguration(array $configuration) {
- $this->configuration = $configuration + $this->defaultConfiguration();
- }
-
- /**
- * {@inheritdoc}
- */
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
}
diff --git a/core/lib/Drupal/Core/Display/VariantBase.php b/core/lib/Drupal/Core/Display/VariantBase.php
index dafb060d59f6..328bb89a2db0 100644
--- a/core/lib/Drupal/Core/Display/VariantBase.php
+++ b/core/lib/Drupal/Core/Display/VariantBase.php
@@ -4,7 +4,7 @@ namespace Drupal\Core\Display;
use Drupal\Core\Cache\RefinableCacheableDependencyTrait;
use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
use Drupal\Core\Plugin\PluginDependencyTrait;
use Drupal\Core\Session\AccountInterface;
@@ -16,7 +16,7 @@ use Drupal\Core\Session\AccountInterface;
* @see \Drupal\Core\Display\VariantManager
* @see plugin_api
*/
-abstract class VariantBase extends PluginBase implements VariantInterface {
+abstract class VariantBase extends ConfigurablePluginBase implements VariantInterface {
use PluginDependencyTrait;
use RefinableCacheableDependencyTrait;
@@ -24,15 +24,6 @@ abstract class VariantBase extends PluginBase implements VariantInterface {
/**
* {@inheritdoc}
*/
- public function __construct(array $configuration, $plugin_id, $plugin_definition) {
- parent::__construct($configuration, $plugin_id, $plugin_definition);
-
- $this->setConfiguration($configuration);
- }
-
- /**
- * {@inheritdoc}
- */
public function label() {
return $this->configuration['label'];
}
@@ -77,14 +68,6 @@ abstract class VariantBase extends PluginBase implements VariantInterface {
/**
* {@inheritdoc}
*/
- public function setConfiguration(array $configuration) {
- $this->configuration = $configuration + $this->defaultConfiguration();
- return $this;
- }
-
- /**
- * {@inheritdoc}
- */
public function defaultConfiguration() {
return [
'label' => '',
diff --git a/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginBase.php b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginBase.php
index b40e32636719..019f8535ef6d 100644
--- a/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginBase.php
+++ b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginBase.php
@@ -2,32 +2,15 @@
namespace Drupal\Core\Entity\EntityReferenceSelection;
-use Drupal\Component\Plugin\ConfigurableInterface;
use Drupal\Component\Plugin\DependentPluginInterface;
-use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Database\Query\SelectInterface;
use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
/**
* Provides a base class for configurable selection handlers.
*/
-abstract class SelectionPluginBase extends PluginBase implements SelectionInterface, ConfigurableInterface, DependentPluginInterface {
-
- /**
- * Constructs a new selection object.
- *
- * @param array $configuration
- * A configuration array containing information about the plugin instance.
- * @param string $plugin_id
- * The plugin ID for the plugin instance.
- * @param mixed $plugin_definition
- * The plugin implementation definition.
- */
- public function __construct(array $configuration, $plugin_id, $plugin_definition) {
- parent::__construct($configuration, $plugin_id, $plugin_definition);
- $this->setConfiguration($configuration);
- }
+abstract class SelectionPluginBase extends ConfigurablePluginBase implements SelectionInterface, DependentPluginInterface {
/**
* {@inheritdoc}
@@ -42,24 +25,6 @@ abstract class SelectionPluginBase extends PluginBase implements SelectionInterf
/**
* {@inheritdoc}
*/
- public function getConfiguration() {
- return $this->configuration;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setConfiguration(array $configuration) {
- // Merge in defaults.
- $this->configuration = NestedArray::mergeDeep(
- $this->defaultConfiguration(),
- $configuration
- );
- }
-
- /**
- * {@inheritdoc}
- */
public function calculateDependencies() {
return [];
}
diff --git a/core/lib/Drupal/Core/Layout/LayoutDefault.php b/core/lib/Drupal/Core/Layout/LayoutDefault.php
index 67980ba82e20..e9aac0eb4905 100644
--- a/core/lib/Drupal/Core/Layout/LayoutDefault.php
+++ b/core/lib/Drupal/Core/Layout/LayoutDefault.php
@@ -2,18 +2,17 @@
namespace Drupal\Core\Layout;
-use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait;
use Drupal\Core\Plugin\ContextAwarePluginTrait;
-use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
use Drupal\Core\Plugin\PluginFormInterface;
use Drupal\Core\Plugin\PreviewAwarePluginInterface;
/**
* Provides a default class for Layout plugins.
*/
-class LayoutDefault extends PluginBase implements LayoutInterface, PluginFormInterface, PreviewAwarePluginInterface {
+class LayoutDefault extends ConfigurablePluginBase implements LayoutInterface, PluginFormInterface, PreviewAwarePluginInterface {
use ContextAwarePluginAssignmentTrait;
use ContextAwarePluginTrait;
@@ -35,14 +34,6 @@ class LayoutDefault extends PluginBase implements LayoutInterface, PluginFormInt
/**
* {@inheritdoc}
*/
- public function __construct(array $configuration, $plugin_id, $plugin_definition) {
- parent::__construct($configuration, $plugin_id, $plugin_definition);
- $this->setConfiguration($configuration);
- }
-
- /**
- * {@inheritdoc}
- */
public function build(array $regions) {
// Ensure $build only contains defined regions and in the order defined.
$build = [];
@@ -64,20 +55,6 @@ class LayoutDefault extends PluginBase implements LayoutInterface, PluginFormInt
/**
* {@inheritdoc}
*/
- public function getConfiguration() {
- return $this->configuration;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setConfiguration(array $configuration) {
- $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration);
- }
-
- /**
- * {@inheritdoc}
- */
public function defaultConfiguration() {
return [
'label' => '',
diff --git a/core/lib/Drupal/Core/Plugin/ConfigurablePluginBase.php b/core/lib/Drupal/Core/Plugin/ConfigurablePluginBase.php
new file mode 100644
index 000000000000..0d51a8025562
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/ConfigurablePluginBase.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Core\Plugin;
+
+use Drupal\Component\Plugin\ConfigurableInterface;
+
+/**
+ * Base class for plugins that are configurable.
+ *
+ * Provides boilerplate methods for implementing
+ * Drupal\Component\Plugin\ConfigurableInterface. Configurable plugins may
+ * extend this base class instead of PluginBase. If your plugin must extend a
+ * different base class, you may use \Drupal\Component\Plugin\ConfigurableTrait
+ * directly and call setConfiguration() in your constructor.
+ *
+ * @see \Drupal\Core\Plugin\ConfigurableTrait
+ */
+abstract class ConfigurablePluginBase extends PluginBase implements ConfigurableInterface {
+ use ConfigurableTrait;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+ parent::__construct($configuration, $plugin_id, $plugin_definition);
+ $this->setConfiguration($configuration);
+ }
+
+}
diff --git a/core/lib/Drupal/Core/Plugin/ConfigurableTrait.php b/core/lib/Drupal/Core/Plugin/ConfigurableTrait.php
new file mode 100644
index 000000000000..bfe4a6615127
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/ConfigurableTrait.php
@@ -0,0 +1,81 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Core\Plugin;
+
+use Drupal\Component\Utility\NestedArray;
+
+/**
+ * Implementation class for \Drupal\Component\Plugin\ConfigurableInterface.
+ *
+ * In order for configurable plugins to maintain their configuration, the
+ * default configuration must be merged into any explicitly defined
+ * configuration. This trait provides the appropriate getters and setters to
+ * handle this logic, removing the need for excess boilerplate.
+ *
+ * To use this trait implement ConfigurableInterface and add a constructor. In
+ * the constructor call the parent constructor and then call setConfiguration().
+ * That will merge the explicitly defined plugin configuration and the default
+ * plugin configuration.
+ *
+ * @ingroup Plugin
+ */
+trait ConfigurableTrait {
+
+ /**
+ * Configuration information passed into the plugin.
+ *
+ * This property is declared in \Drupal\Component\Plugin\PluginBase as well,
+ * which most classes using this trait will ultimately be extending. It is
+ * re-declared here to make the trait self-contained and to permit use of the
+ * trait in classes that do not extend PluginBase.
+ *
+ * @var array
+ */
+ protected $configuration;
+
+ /**
+ * Gets this plugin's configuration.
+ *
+ * @return array
+ * An associative array containing the plugin's configuration.
+ *
+ * @see \Drupal\Component\Plugin\ConfigurableInterface::getConfiguration()
+ */
+ public function getConfiguration() {
+ return $this->configuration;
+ }
+
+ /**
+ * Sets the configuration for this plugin instance.
+ *
+ * The provided configuration is merged with the plugin's default
+ * configuration. If the same configuration key exists in both configurations,
+ * then the value in the provided configuration will override the default.
+ *
+ * @param array $configuration
+ * An associative array containing the plugin's configuration.
+ *
+ * @return $this
+ *
+ * @see \Drupal\Component\Plugin\ConfigurableInterface::setConfiguration()
+ */
+ public function setConfiguration(array $configuration) {
+ $this->configuration = NestedArray::mergeDeepArray([$this->defaultConfiguration(), $configuration], TRUE);
+ return $this;
+ }
+
+ /**
+ * Gets default configuration for this plugin.
+ *
+ * @return array
+ * An associative array containing the default configuration.
+ *
+ * @see \Drupal\Component\Plugin\ConfigurableInterface::defaultConfiguration()
+ */
+ public function defaultConfiguration() {
+ return [];
+ }
+
+}
diff --git a/core/lib/Drupal/Core/Test/PhpUnitTestDiscovery.php b/core/lib/Drupal/Core/Test/PhpUnitTestDiscovery.php
new file mode 100644
index 000000000000..d9737028821c
--- /dev/null
+++ b/core/lib/Drupal/Core/Test/PhpUnitTestDiscovery.php
@@ -0,0 +1,346 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Core\Test;
+
+use Drupal\Core\Test\Exception\MissingGroupException;
+use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion;
+use PHPUnit\Framework\DataProviderTestSuite;
+use PHPUnit\Framework\Test;
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\TestSuite;
+use PHPUnit\TextUI\Configuration\Builder;
+use PHPUnit\TextUI\Configuration\TestSuiteBuilder;
+
+/**
+ * Discovers available tests using the PHPUnit API.
+ *
+ * @internal
+ */
+class PhpUnitTestDiscovery {
+
+ /**
+ * The map of legacy test suite identifiers to phpunit.xml ones.
+ *
+ * @var array<string,string>
+ */
+ private array $map = [
+ 'PHPUnit-FunctionalJavascript' => 'functional-javascript',
+ 'PHPUnit-Functional' => 'functional',
+ 'PHPUnit-Kernel' => 'kernel',
+ 'PHPUnit-Unit' => 'unit',
+ 'PHPUnit-Unit-Component' => 'unit-component',
+ 'PHPUnit-Build' => 'build',
+ ];
+
+ /**
+ * The reverse map of legacy test suite identifiers to phpunit.xml ones.
+ *
+ * @var array<string,string>
+ */
+ private array $reverseMap;
+
+ /**
+ * The warnings generated during the discovery.
+ *
+ * @var list<string>
+ */
+ private array $warnings = [];
+
+ public function __construct(
+ private string $configurationFilePath,
+ ) {
+ $this->reverseMap = array_flip($this->map);
+ }
+
+ /**
+ * Discovers available tests.
+ *
+ * @param string|null $extension
+ * (optional) The name of an extension to limit discovery to; e.g., 'node'.
+ * @param list<string> $testSuites
+ * (optional) An array of PHPUnit test suites to filter the discovery for.
+ * @param string|null $directory
+ * (optional) Limit discovered tests to a specific directory.
+ *
+ * @return array<string<array<class-string, array{name: class-string, description: string, group: string|int, groups: list<string|int>, type: string, file: string, tests_count: positive-int}>>>
+ * An array of test groups keyed by the group name. Each test group is an
+ * array of test class information arrays as returned by
+ * ::getTestClassInfo(), keyed by test class. If a test class belongs to
+ * multiple groups, it will appear under all group keys it belongs to.
+ */
+ public function getTestClasses(?string $extension = NULL, array $testSuites = [], ?string $directory = NULL): array {
+ $this->warnings = [];
+
+ $args = ['--configuration', $this->configurationFilePath];
+
+ if (!empty($testSuites)) {
+ // Convert $testSuites from Drupal's legacy syntax to the syntax used in
+ // phpunit.xml, that is necessary to PHPUnit to be able to apply the
+ // test suite filter. For example, 'PHPUnit-Unit' to 'unit'.
+ $tmp = [];
+ foreach ($testSuites as $i) {
+ if (!is_string($i)) {
+ throw new \InvalidArgumentException("Test suite must be a string");
+ }
+ if (str_contains($i, ' ')) {
+ throw new \InvalidArgumentException("Test suite name '{$i}' is invalid");
+ }
+ $tmp[] = $this->map[$i] ?? $i;
+ }
+ $args[] = '--testsuite=' . implode(',', $tmp);
+ }
+
+ if ($directory !== NULL) {
+ $args[] = $directory;
+ }
+
+ $phpUnitConfiguration = (new Builder())->build($args);
+
+ // TestSuiteBuilder calls the test data providers during the discovery.
+ // Data providers may be changing the Drupal service container, which leads
+ // to potential issues. We save the current container before running the
+ // discovery, and in case a change is detected, reset it and raise
+ // warnings so that developers can tune their data provider code.
+ if (\Drupal::hasContainer()) {
+ $container = \Drupal::getContainer();
+ $containerObjectId = spl_object_id($container);
+ }
+ $phpUnitTestSuite = (new TestSuiteBuilder())->build($phpUnitConfiguration);
+ if (isset($containerObjectId) && $containerObjectId !== spl_object_id(\Drupal::getContainer())) {
+ $this->warnings[] = '*** The service container was changed during the test discovery ***';
+ $this->warnings[] = 'Probably a test data provider method called \\Drupal::setContainer.';
+ $this->warnings[] = 'Ensure that all the data providers restore the original container before returning data.';
+ assert(isset($container));
+ \Drupal::setContainer($container);
+ }
+
+ $list = $directory === NULL ?
+ $this->getTestList($phpUnitTestSuite, $extension) :
+ $this->getTestListLimitedToDirectory($phpUnitTestSuite, $extension, $testSuites);
+
+ // Sort the groups and tests within the groups by name.
+ uksort($list, 'strnatcasecmp');
+ foreach ($list as &$tests) {
+ uksort($tests, 'strnatcasecmp');
+ }
+
+ return $list;
+ }
+
+ /**
+ * Discovers all class files in all available extensions.
+ *
+ * @param string|null $extension
+ * (optional) The name of an extension to limit discovery to; e.g., 'node'.
+ * @param string|null $directory
+ * (optional) Limit discovered tests to a specific directory.
+ *
+ * @return array
+ * A classmap containing all discovered class files; i.e., a map of
+ * fully-qualified classnames to path names.
+ */
+ public function findAllClassFiles(?string $extension = NULL, ?string $directory = NULL): array {
+ $testClasses = $this->getTestClasses($extension, [], $directory);
+ $classMap = [];
+ foreach ($testClasses as $group) {
+ foreach ($group as $className => $info) {
+ $classMap[$className] = $info['file'];
+ }
+ }
+ return $classMap;
+ }
+
+ /**
+ * Returns the warnings generated during the discovery.
+ *
+ * @return list<string>
+ * The warnings.
+ */
+ public function getWarnings(): array {
+ return $this->warnings;
+ }
+
+ /**
+ * Returns a list of tests from a TestSuite object.
+ *
+ * @param \PHPUnit\Framework\TestSuite $phpUnitTestSuite
+ * The TestSuite object returned by PHPUnit test discovery.
+ * @param string|null $extension
+ * The name of an extension to limit discovery to; e.g., 'node'.
+ *
+ * @return array<string<array<class-string, array{name: class-string, description: string, group: string|int, groups: list<string|int>, type: string, file: string, tests_count: positive-int}>>>
+ * An array of test groups keyed by the group name. Each test group is an
+ * array of test class information arrays as returned by
+ * ::getTestClassInfo(), keyed by test class. If a test class belongs to
+ * multiple groups, it will appear under all group keys it belongs to.
+ */
+ private function getTestList(TestSuite $phpUnitTestSuite, ?string $extension): array {
+ $list = [];
+ foreach ($phpUnitTestSuite->tests() as $testSuite) {
+ foreach ($testSuite->tests() as $testClass) {
+ if ($extension !== NULL && !str_starts_with($testClass->name(), "Drupal\\Tests\\{$extension}\\")) {
+ continue;
+ }
+
+ $item = $this->getTestClassInfo(
+ $testClass,
+ $this->reverseMap[$testSuite->name()] ?? $testSuite->name(),
+ );
+
+ foreach ($item['groups'] as $group) {
+ $list[$group][$item['name']] = $item;
+ }
+ }
+ }
+ return $list;
+ }
+
+ /**
+ * Returns a list of tests from a TestSuite object limited to a directory.
+ *
+ * @param \PHPUnit\Framework\TestSuite $phpUnitTestSuite
+ * The TestSuite object returned by PHPUnit test discovery.
+ * @param string|null $extension
+ * The name of an extension to limit discovery to; e.g., 'node'.
+ * @param list<string> $testSuites
+ * An array of PHPUnit test suites to filter the discovery for.
+ *
+ * @return array<string<array<class-string, array{name: class-string, description: string, group: string|int, groups: list<string|int>, type: string, file: string, tests_count: positive-int}>>>
+ * An array of test groups keyed by the group name. Each test group is an
+ * array of test class information arrays as returned by
+ * ::getTestClassInfo(), keyed by test class. If a test class belongs to
+ * multiple groups, it will appear under all group keys it belongs to.
+ */
+ private function getTestListLimitedToDirectory(TestSuite $phpUnitTestSuite, ?string $extension, array $testSuites): array {
+ $list = [];
+
+ // In this case, PHPUnit found a single test class to run tests for.
+ if ($phpUnitTestSuite->isForTestClass()) {
+ if ($extension !== NULL && !str_starts_with($phpUnitTestSuite->name(), "Drupal\\Tests\\{$extension}\\")) {
+ return [];
+ }
+
+ // Take the test suite name from the class namespace.
+ $testSuite = 'PHPUnit-' . TestDiscovery::getPhpunitTestSuite($phpUnitTestSuite->name());
+ if (!empty($testSuites) && !in_array($testSuite, $testSuites, TRUE)) {
+ return [];
+ }
+
+ $item = $this->getTestClassInfo($phpUnitTestSuite, $testSuite);
+
+ foreach ($item['groups'] as $group) {
+ $list[$group][$item['name']] = $item;
+ }
+ return $list;
+ }
+
+ // Multiple test classes were found.
+ $list = [];
+ foreach ($phpUnitTestSuite->tests() as $testClass) {
+ if ($extension !== NULL && !str_starts_with($testClass->name(), "Drupal\\Tests\\{$extension}\\")) {
+ continue;
+ }
+
+ // Take the test suite name from the class namespace.
+ $testSuite = 'PHPUnit-' . TestDiscovery::getPhpunitTestSuite($testClass->name());
+ if (!empty($testSuites) && !in_array($testSuite, $testSuites, TRUE)) {
+ continue;
+ }
+
+ $item = $this->getTestClassInfo($testClass, $testSuite);
+
+ foreach ($item['groups'] as $group) {
+ $list[$group][$item['name']] = $item;
+ }
+ }
+ return $list;
+
+ }
+
+ /**
+ * Returns the test class information.
+ *
+ * @param \PHPUnit\Framework\Test $testClass
+ * The test class.
+ * @param string $testSuite
+ * The test suite of this test class.
+ *
+ * @return array{name: class-string, description: string, group: string|int, groups: list<string|int>, type: string, file: string, tests_count: positive-int}
+ * The test class information.
+ */
+ private function getTestClassInfo(Test $testClass, string $testSuite): array {
+ $reflection = new \ReflectionClass($testClass->name());
+
+ // Let PHPUnit API return the groups, as it will deal transparently with
+ // annotations or attributes, but skip groups generated by PHPUnit
+ // internally and starting with a double underscore prefix.
+ if (RunnerVersion::getMajor() < 11) {
+ $groups = array_filter($testClass->groups(), function (string $value): bool {
+ return !str_starts_with($value, '__phpunit');
+ });
+ }
+ else {
+ // In PHPUnit 11+, we need to coalesce the groups from individual tests
+ // as they may not be available from the test class level (when tests are
+ // backed by data providers).
+ $tmp = [];
+ foreach ($testClass as $test) {
+ if ($test instanceof DataProviderTestSuite) {
+ foreach ($test as $testWithData) {
+ $tmp = array_merge($tmp, $testWithData->groups());
+ }
+ }
+ else {
+ $tmp = array_merge($tmp, $test->groups());
+ }
+ }
+ $groups = array_filter(array_unique($tmp), function (string $value): bool {
+ return !str_starts_with($value, '__phpunit');
+ });
+ }
+ if (empty($groups)) {
+ throw new MissingGroupException(sprintf('Missing group metadata in test class %s', $testClass->name()));
+ }
+
+ // Let PHPUnit API return the class coverage information.
+ $test = $testClass;
+ while (!$test instanceof TestCase) {
+ $test = $test->tests()[0];
+ }
+ if (($metadata = $test->valueObjectForEvents()->metadata()->isCoversClass()) && $metadata->isNotEmpty()) {
+ $description = sprintf('Tests %s.', $metadata->asArray()[0]->className());
+ }
+ elseif (($metadata = $test->valueObjectForEvents()->metadata()->isCoversDefaultClass()) && $metadata->isNotEmpty()) {
+ $description = sprintf('Tests %s.', $metadata->asArray()[0]->className());
+ }
+ else {
+ $description = TestDiscovery::parseTestClassSummary($reflection->getDocComment());
+ }
+
+ // Find the test cases count.
+ $count = 0;
+ foreach ($testClass->tests() as $testCase) {
+ if ($testCase instanceof TestCase) {
+ // If it's a straight test method, counts 1.
+ $count++;
+ }
+ else {
+ // It's a data provider test suite, count 1 per data set provided.
+ $count += count($testCase->tests());
+ }
+ }
+
+ return [
+ 'name' => $testClass->name(),
+ 'group' => $groups[0],
+ 'groups' => $groups,
+ 'type' => $testSuite,
+ 'description' => $description,
+ 'file' => $reflection->getFileName(),
+ 'tests_count' => $count,
+ ];
+ }
+
+}
diff --git a/core/lib/Drupal/Core/Test/RunTests/TestFileParser.php b/core/lib/Drupal/Core/Test/RunTests/TestFileParser.php
index 12aa757e57ee..8ab5260aa660 100644
--- a/core/lib/Drupal/Core/Test/RunTests/TestFileParser.php
+++ b/core/lib/Drupal/Core/Test/RunTests/TestFileParser.php
@@ -4,9 +4,16 @@ namespace Drupal\Core\Test\RunTests;
use PHPUnit\Framework\TestCase;
+@trigger_error('Drupal\Core\Test\RunTests\TestFileParser is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. There is no replacement. See https://www.drupal.org/node/3447698', E_USER_DEPRECATED);
+
/**
* Parses class names from PHP files without loading them.
*
+ * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. There is no
+ * replacement.
+ *
+ * @see https://www.drupal.org/node/3447698
+ *
* @internal
*/
class TestFileParser {
diff --git a/core/lib/Drupal/Core/Test/TestDiscovery.php b/core/lib/Drupal/Core/Test/TestDiscovery.php
index 1347d0c583f4..468256779b31 100644
--- a/core/lib/Drupal/Core/Test/TestDiscovery.php
+++ b/core/lib/Drupal/Core/Test/TestDiscovery.php
@@ -7,6 +7,7 @@ use Drupal\Component\Annotation\Reflection\MockFileFinder;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Extension\ExtensionDiscovery;
use Drupal\Core\Test\Exception\MissingGroupException;
+use PHPUnit\Framework\Attributes\Group;
/**
* Discovers available tests.
@@ -26,6 +27,11 @@ class TestDiscovery {
* Statically cached list of test classes.
*
* @var array
+ *
+ * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. There is
+ * no replacement.
+ *
+ * @see https://www.drupal.org/node/3447698
*/
protected $testClasses;
@@ -149,8 +155,14 @@ class TestDiscovery {
*
* @todo Remove singular grouping; retain list of groups in 'group' key.
* @see https://www.drupal.org/node/2296615
+ *
+ * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Use
+ * PhpUnitTestDiscovery::getTestClasses() instead.
+ *
+ * @see https://www.drupal.org/node/3447698
*/
public function getTestClasses($extension = NULL, array $types = [], ?string $directory = NULL) {
+ @trigger_error(__METHOD__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Use PhpUnitTestDiscovery::getTestClasses() instead. See https://www.drupal.org/node/3447698', E_USER_DEPRECATED);
if (!isset($extension) && empty($types)) {
if (!empty($this->testClasses)) {
return $this->testClasses;
@@ -175,6 +187,15 @@ class TestDiscovery {
catch (MissingGroupException $e) {
// If the class name ends in Test and is not a migrate table dump.
if (str_ends_with($classname, 'Test') && !str_contains($classname, 'migrate_drupal\Tests\Table')) {
+ $reflection = new \ReflectionClass($classname);
+ $groupAttributes = $reflection->getAttributes(Group::class, \ReflectionAttribute::IS_INSTANCEOF);
+ if (!empty($groupAttributes)) {
+ $group = '##no-group-annotations';
+ $info['group'] = $group;
+ $info['groups'] = [$group];
+ $list[$group][$classname] = $info;
+ continue;
+ }
throw $e;
}
// If the class is @group annotation just skip it. Most likely it is an
@@ -216,8 +237,14 @@ class TestDiscovery {
* @return array
* A classmap containing all discovered class files; i.e., a map of
* fully-qualified classnames to path names.
+ *
+ * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Use
+ * PhpUnitTestDiscovery::findAllClassFiles() instead.
+ *
+ * @see https://www.drupal.org/node/3447698
*/
public function findAllClassFiles($extension = NULL, ?string $directory = NULL) {
+ @trigger_error(__METHOD__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Use PhpUnitTestDiscovery::findAllClassFiles() instead. See https://www.drupal.org/node/3447698', E_USER_DEPRECATED);
$classmap = [];
$namespaces = $this->registerTestNamespaces();
if (isset($extension)) {
@@ -256,8 +283,14 @@ class TestDiscovery {
*
* @todo Limit to '*Test.php' files (~10% less files to reflect/introspect).
* @see https://www.drupal.org/node/2296635
+ *
+ * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. There is
+ * no replacement.
+ *
+ * @see https://www.drupal.org/node/3447698
*/
public static function scanDirectory($namespace_prefix, $path) {
+ @trigger_error(__METHOD__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. There is no replacement. See https://www.drupal.org/node/3447698', E_USER_DEPRECATED);
if (!str_ends_with($namespace_prefix, '\\')) {
throw new \InvalidArgumentException("Namespace prefix for $path must contain a trailing namespace separator.");
}
@@ -312,8 +345,14 @@ class TestDiscovery {
*
* @throws \Drupal\Core\Test\Exception\MissingGroupException
* If the class does not have a @group annotation.
+ *
+ * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. There is
+ * no replacement.
+ *
+ * @see https://www.drupal.org/node/3447698
*/
public static function getTestInfo($classname, $doc_comment = NULL) {
+ @trigger_error(__METHOD__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. There is no replacement. See https://www.drupal.org/node/3447698', E_USER_DEPRECATED);
if ($doc_comment === NULL) {
$reflection = new \ReflectionClass($classname);
$doc_comment = $reflection->getDocComment();
@@ -350,7 +389,7 @@ class TestDiscovery {
$info['type'] = 'PHPUnit-' . static::getPhpunitTestSuite($classname);
if (!empty($annotations['coversDefaultClass'])) {
- $info['description'] = 'Tests ' . $annotations['coversDefaultClass'] . '.';
+ $info['description'] = 'Tests ' . ltrim($annotations['coversDefaultClass']) . '.';
}
else {
$info['description'] = static::parseTestClassSummary($doc_comment);
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 1819df65669d..ee5db3615262 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -16,10 +16,6 @@ use Drupal\Core\Form\FormStateInterface;
require_once __DIR__ . '/field.purge.inc';
/**
- * @} End of "defgroup field".
- */
-
-/**
* Assembles a partial entity structure with initial IDs.
*
* @param object $ids
diff --git a/core/modules/field/src/Hook/FieldHooks.php b/core/modules/field/src/Hook/FieldHooks.php
index 274482f9ada6..e94e084ea3e3 100644
--- a/core/modules/field/src/Hook/FieldHooks.php
+++ b/core/modules/field/src/Hook/FieldHooks.php
@@ -257,6 +257,10 @@ class FieldHooks {
}
/**
+ * @} End of "defgroup field".
+ */
+
+ /**
* Implements hook_config_import_steps_alter().
*/
#[Hook('config_import_steps_alter')]
diff --git a/core/modules/image/src/ImageEffectBase.php b/core/modules/image/src/ImageEffectBase.php
index 58be370c1e6e..745976133be7 100644
--- a/core/modules/image/src/ImageEffectBase.php
+++ b/core/modules/image/src/ImageEffectBase.php
@@ -3,7 +3,7 @@
namespace Drupal\image;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -17,7 +17,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
* @see \Drupal\image\ImageEffectManager
* @see plugin_api
*/
-abstract class ImageEffectBase extends PluginBase implements ImageEffectInterface, ContainerFactoryPluginInterface {
+abstract class ImageEffectBase extends ConfigurablePluginBase implements ImageEffectInterface, ContainerFactoryPluginInterface {
/**
* The image effect ID.
@@ -46,7 +46,6 @@ abstract class ImageEffectBase extends PluginBase implements ImageEffectInterfac
public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerInterface $logger) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
- $this->setConfiguration($configuration);
$this->logger = $logger;
}
@@ -154,13 +153,6 @@ abstract class ImageEffectBase extends PluginBase implements ImageEffectInterfac
/**
* {@inheritdoc}
*/
- public function defaultConfiguration() {
- return [];
- }
-
- /**
- * {@inheritdoc}
- */
public function calculateDependencies() {
return [];
}
diff --git a/core/modules/jsonapi/src/Controller/EntityResource.php b/core/modules/jsonapi/src/Controller/EntityResource.php
index 6416d6cb27ac..53822cdf1f1f 100644
--- a/core/modules/jsonapi/src/Controller/EntityResource.php
+++ b/core/modules/jsonapi/src/Controller/EntityResource.php
@@ -672,9 +672,10 @@ class EntityResource {
return $this->getRelationship($resource_type, $entity, $related, $request, $status);
}
- $main_property_name = $field_definition->getItemDefinition()->getMainPropertyName();
foreach ($new_resource_identifiers as $new_resource_identifier) {
- $new_field_value = [$main_property_name => $this->getEntityFromResourceIdentifier($new_resource_identifier)->id()];
+ // We assume all entity reference fields have an 'entity' computed
+ // property that can be used to assign the needed values.
+ $new_field_value = ['entity' => $this->getEntityFromResourceIdentifier($new_resource_identifier)];
// Remove `arity` from the received extra properties, otherwise this
// will fail field validation.
$new_field_value += array_diff_key($new_resource_identifier->getMeta(), array_flip([ResourceIdentifier::ARITY_KEY]));
@@ -760,9 +761,10 @@ class EntityResource {
* The field definition of the entity field to be updated.
*/
protected function doPatchMultipleRelationship(EntityInterface $entity, array $resource_identifiers, FieldDefinitionInterface $field_definition) {
- $main_property_name = $field_definition->getItemDefinition()->getMainPropertyName();
- $entity->{$field_definition->getName()} = array_map(function (ResourceIdentifier $resource_identifier) use ($main_property_name) {
- $field_properties = [$main_property_name => $this->getEntityFromResourceIdentifier($resource_identifier)->id()];
+ $entity->{$field_definition->getName()} = array_map(function (ResourceIdentifier $resource_identifier) {
+ // We assume all entity reference fields have an 'entity' computed
+ // property that can be used to assign the needed values.
+ $field_properties = ['entity' => $this->getEntityFromResourceIdentifier($resource_identifier)];
// Remove `arity` from the received extra properties, otherwise this
// will fail field validation.
$field_properties += array_diff_key($resource_identifier->getMeta(), array_flip([ResourceIdentifier::ARITY_KEY]));
diff --git a/core/modules/jsonapi/tests/modules/jsonapi_test_field_type/config/schema/jsonapi_test_field_type.schema.yml b/core/modules/jsonapi/tests/modules/jsonapi_test_field_type/config/schema/jsonapi_test_field_type.schema.yml
new file mode 100644
index 000000000000..9d082c7649c3
--- /dev/null
+++ b/core/modules/jsonapi/tests/modules/jsonapi_test_field_type/config/schema/jsonapi_test_field_type.schema.yml
@@ -0,0 +1,11 @@
+field.storage_settings.jsonapi_test_field_type_entity_reference_uuid:
+ type: field.storage_settings.entity_reference
+ label: 'Entity reference field storage settings'
+
+field.field_settings.jsonapi_test_field_type_entity_reference_uuid:
+ type: field.field_settings.entity_reference
+ label: 'Entity reference field settings'
+
+field.value.jsonapi_test_field_type_entity_reference_uuid:
+ type: field.value.entity_reference
+ label: 'Default value'
diff --git a/core/modules/jsonapi/tests/modules/jsonapi_test_field_type/src/Plugin/Field/FieldType/EntityReferenceUuidItem.php b/core/modules/jsonapi/tests/modules/jsonapi_test_field_type/src/Plugin/Field/FieldType/EntityReferenceUuidItem.php
new file mode 100644
index 000000000000..f9aa3e77bbe9
--- /dev/null
+++ b/core/modules/jsonapi/tests/modules/jsonapi_test_field_type/src/Plugin/Field/FieldType/EntityReferenceUuidItem.php
@@ -0,0 +1,241 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\jsonapi_test_field_type\Plugin\Field\FieldType;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\TypedData\EntityDataDefinition;
+use Drupal\Core\Field\Attribute\FieldType;
+use Drupal\Core\Field\EntityReferenceFieldItemList;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\Core\TypedData\DataReferenceDefinition;
+use Drupal\Core\TypedData\DataReferenceTargetDefinition;
+
+/**
+ * Defines the 'entity_reference_uuid' entity field type.
+ *
+ * Supported settings (below the definition's 'settings' key) are:
+ * - target_type: The entity type to reference. Required.
+ *
+ * @property string $target_uuid
+ */
+#[FieldType(
+ id: 'jsonapi_test_field_type_entity_reference_uuid',
+ label: new TranslatableMarkup('Entity reference UUID'),
+ description: new TranslatableMarkup('An entity field containing an entity reference by UUID.'),
+ category: 'reference',
+ default_widget: 'entity_reference_autocomplete',
+ default_formatter: 'entity_reference_label',
+ list_class: EntityReferenceFieldItemList::class,
+)]
+class EntityReferenceUuidItem extends EntityReferenceItem {
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
+ $settings = $field_definition->getSettings();
+ $target_type_info = \Drupal::entityTypeManager()->getDefinition($settings['target_type']);
+
+ $properties = parent::propertyDefinitions($field_definition);
+
+ $target_uuid_definition = DataReferenceTargetDefinition::create('string')
+ ->setLabel(new TranslatableMarkup('@label UUID', ['@label' => $target_type_info->getLabel()]));
+
+ $target_uuid_definition->setRequired(TRUE);
+ $properties['target_uuid'] = $target_uuid_definition;
+
+ $properties['entity'] = DataReferenceDefinition::create('entity')
+ ->setLabel($target_type_info->getLabel())
+ ->setDescription(new TranslatableMarkup('The referenced entity by UUID'))
+ // The entity object is computed out of the entity ID.
+ ->setComputed(TRUE)
+ ->setReadOnly(FALSE)
+ ->setTargetDefinition(EntityDataDefinition::create($settings['target_type']))
+ // We can add a constraint for the target entity type. The list of
+ // referenceable bundles is a field setting, so the corresponding
+ // constraint is added dynamically in ::getConstraints().
+ ->addConstraint('EntityType', $settings['target_type']);
+
+ return $properties;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function mainPropertyName() {
+ return 'target_uuid';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function schema(FieldStorageDefinitionInterface $field_definition) {
+ $columns = [
+ 'target_uuid' => [
+ 'description' => 'The UUID of the target entity.',
+ 'type' => 'varchar_ascii',
+ 'length' => 128,
+ ],
+ ];
+
+ return [
+ 'columns' => $columns,
+ 'indexes' => [
+ 'target_uuid' => ['target_uuid'],
+ ],
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setValue($values, $notify = TRUE): void {
+ if (isset($values) && !is_array($values)) {
+ // If either a scalar or an object was passed as the value for the item,
+ // assign it to the 'entity' or 'target_uuid' depending on values type.
+ if (is_object($values)) {
+ $this->set('entity', $values, $notify);
+ }
+ else {
+ $this->set('target_uuid', $values, $notify);
+ }
+ }
+ else {
+ parent::setValue($values, FALSE);
+ // Support setting the field item with only one property, but make sure
+ // values stay in sync if only property is passed.
+ // NULL is a valid value, so we use array_key_exists().
+ if (is_array($values) && array_key_exists('target_uuid', $values) && !isset($values['entity'])) {
+ $this->onChange('target_uuid', FALSE);
+ }
+ elseif (is_array($values) && !array_key_exists('target_uuid', $values) && isset($values['entity'])) {
+ $this->onChange('entity', FALSE);
+ }
+ elseif (is_array($values) && array_key_exists('target_uuid', $values) && isset($values['entity'])) {
+ // If both properties are passed, verify the passed values match. The
+ // only exception we allow is when we have a new entity: in this case
+ // its actual id and target_uuid will be different, due to the new
+ // entity marker.
+ $entity_uuid = $this->get('entity')->get('uuid');
+ // If the entity has been saved and we're trying to set both the
+ // target_uuid and the entity values with a non-null target UUID, then
+ // the value for target_uuid should match the UUID of the entity value.
+ if (!$this->entity->isNew() && $values['target_uuid'] !== NULL && ($entity_uuid !== $values['target_uuid'])) {
+ throw new \InvalidArgumentException('The target UUID and entity passed to the entity reference item do not match.');
+ }
+ }
+ // Notify the parent if necessary.
+ if ($notify && $this->parent) {
+ $this->parent->onChange($this->getName());
+ }
+ }
+
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function onChange($property_name, $notify = TRUE): void {
+ // Make sure that the target UUID and the target property stay in sync.
+ if ($property_name === 'entity') {
+ $property = $this->get('entity');
+ if ($target_uuid = $property->isTargetNew() ? NULL : $property->getValue()->uuid()) {
+ $this->writePropertyValue('target_uuid', $target_uuid);
+ }
+ }
+ elseif ($property_name === 'target_uuid') {
+ $property = $this->get('entity');
+ $entity_type = $property->getDataDefinition()->getConstraint('EntityType');
+ $entities = \Drupal::entityTypeManager()->getStorage($entity_type)->loadByProperties(['uuid' => $this->get('target_uuid')->getValue()]);
+ if ($entity = array_shift($entities)) {
+ assert($entity instanceof EntityInterface);
+ $this->writePropertyValue('target_uuid', $entity->uuid());
+ $this->writePropertyValue('entity', $entity);
+ }
+ }
+ parent::onChange($property_name, $notify);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isEmpty() {
+ // Avoid loading the entity by first checking the 'target_uuid'.
+ if ($this->target_uuid !== NULL) {
+ return FALSE;
+ }
+ if ($this->entity && $this->entity instanceof EntityInterface) {
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function preSave(): void {
+ if ($this->hasNewEntity()) {
+ // Save the entity if it has not already been saved by some other code.
+ if ($this->entity->isNew()) {
+ $this->entity->save();
+ }
+ // Make sure the parent knows we are updating this property so it can
+ // react properly.
+ $this->target_uuid = $this->entity->uuid();
+ }
+ if (!$this->isEmpty() && $this->target_uuid === NULL) {
+ $this->target_uuid = $this->entity->uuid();
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function generateSampleValue(FieldDefinitionInterface $field_definition): array {
+ $manager = \Drupal::service('plugin.manager.entity_reference_selection');
+
+ // Instead of calling $manager->getSelectionHandler($field_definition)
+ // replicate the behavior to be able to override the sorting settings.
+ $options = [
+ 'target_type' => $field_definition->getFieldStorageDefinition()->getSetting('target_type'),
+ 'handler' => $field_definition->getSetting('handler'),
+ 'handler_settings' => $field_definition->getSetting('handler_settings') ?: [],
+ 'entity' => NULL,
+ ];
+
+ $entity_type = \Drupal::entityTypeManager()->getDefinition($options['target_type']);
+ $options['handler_settings']['sort'] = [
+ 'field' => $entity_type->getKey('uuid'),
+ 'direction' => 'DESC',
+ ];
+ $selection_handler = $manager->getInstance($options);
+
+ // Select a random number of references between the last 50 referenceable
+ // entities created.
+ if ($referenceable = $selection_handler->getReferenceableEntities(NULL, 'CONTAINS', 50)) {
+ $group = array_rand($referenceable);
+ return ['target_uuid' => array_rand($referenceable[$group])];
+ }
+ return [];
+ }
+
+ /**
+ * Determines whether the item holds an unsaved entity.
+ *
+ * This is notably used for "autocreate" widgets, and more generally to
+ * support referencing freshly created entities (they will get saved
+ * automatically as the hosting entity gets saved).
+ *
+ * @return bool
+ * TRUE if the item holds an unsaved entity.
+ */
+ public function hasNewEntity() {
+ return !$this->isEmpty() && $this->target_uuid === NULL && $this->entity->isNew();
+ }
+
+}
diff --git a/core/modules/jsonapi/tests/src/Functional/JsonApiRelationshipTest.php b/core/modules/jsonapi/tests/src/Functional/JsonApiRelationshipTest.php
new file mode 100644
index 000000000000..110e1a6840b3
--- /dev/null
+++ b/core/modules/jsonapi/tests/src/Functional/JsonApiRelationshipTest.php
@@ -0,0 +1,157 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\jsonapi\Functional;
+
+use Drupal\Core\Url;
+use Drupal\entity_test\EntityTestHelper;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use GuzzleHttp\RequestOptions;
+
+/**
+ * JSON:API resource tests.
+ *
+ * @group jsonapi
+ *
+ * @internal
+ */
+class JsonApiRelationshipTest extends JsonApiFunctionalTestBase {
+
+ /**
+ * {@inheritdoc}
+ */
+ protected static $modules = [
+ 'basic_auth',
+ 'entity_test',
+ 'jsonapi_test_field_type',
+ ];
+
+ /**
+ * The entity type ID.
+ */
+ protected string $entityTypeId = 'entity_test';
+
+ /**
+ * The entity bundle.
+ */
+ protected string $bundle = 'entity_test';
+
+ /**
+ * The field name.
+ */
+ protected string $fieldName = 'field_child';
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp(): void {
+ parent::setUp();
+
+ EntityTestHelper::createBundle($this->bundle, 'Parent', $this->entityTypeId);
+
+ FieldStorageConfig::create([
+ 'field_name' => $this->fieldName,
+ 'type' => 'jsonapi_test_field_type_entity_reference_uuid',
+ 'entity_type' => $this->entityTypeId,
+ 'cardinality' => 1,
+ 'settings' => [
+ 'target_type' => $this->entityTypeId,
+ ],
+ ])->save();
+ FieldConfig::create([
+ 'field_name' => $this->fieldName,
+ 'entity_type' => $this->entityTypeId,
+ 'bundle' => $this->bundle,
+ 'label' => $this->randomString(),
+ 'settings' => [
+ 'handler' => 'default',
+ 'handler_settings' => [],
+ ],
+ ])->save();
+
+ \Drupal::service('router.builder')->rebuild();
+ }
+
+ /**
+ * Test relationships without target_id as main property.
+ *
+ * @see https://www.drupal.org/project/drupal/issues/3476224
+ */
+ public function testPatchHandleUUIDPropertyReferenceFieldIssue3127883(): void {
+ $this->config('jsonapi.settings')->set('read_only', FALSE)->save(TRUE);
+ $user = $this->drupalCreateUser([
+ 'administer entity_test content',
+ 'view test entity',
+ ]);
+
+ // Create parent and child entities.
+ $storage = $this->container->get('entity_type.manager')
+ ->getStorage($this->entityTypeId);
+ $parentEntity = $storage
+ ->create([
+ 'type' => $this->bundle,
+ ]);
+ $parentEntity->save();
+ $childUuid = $this->container->get('uuid')->generate();
+ $childEntity = $storage
+ ->create([
+ 'type' => $this->bundle,
+ 'uuid' => $childUuid,
+ ]);
+ $childEntity->save();
+ $uuid = $childEntity->uuid();
+ $this->assertEquals($childUuid, $uuid);
+
+ // 1. Successful PATCH to the related endpoint.
+ $url = Url::fromUri(sprintf('internal:/jsonapi/%s/%s/%s/relationships/%s', $this->entityTypeId, $this->bundle, $parentEntity->uuid(), $this->fieldName));
+ $request_options = [
+ RequestOptions::HEADERS => [
+ 'Content-Type' => 'application/vnd.api+json',
+ 'Accept' => 'application/vnd.api+json',
+ ],
+ RequestOptions::AUTH => [$user->getAccountName(), $user->pass_raw],
+ RequestOptions::JSON => [
+ 'data' => [
+ 'id' => $childUuid,
+ 'type' => sprintf('%s--%s', $this->entityTypeId, $this->bundle),
+ ],
+ ],
+ ];
+ $response = $this->request('PATCH', $url, $request_options);
+ $this->assertSame(204, $response->getStatusCode(), (string) $response->getBody());
+ $parentEntity = $storage->loadUnchanged($parentEntity->id());
+ $this->assertEquals($childEntity->uuid(), $parentEntity->get($this->fieldName)->target_uuid);
+
+ // Reset the relationship.
+ $parentEntity->set($this->fieldName, NULL)
+ ->save();
+ $parentEntity = $storage->loadUnchanged($parentEntity->id());
+ $this->assertTrue($parentEntity->get($this->fieldName)->isEmpty());
+
+ // 2. Successful PATCH to individual endpoint.
+ $url = Url::fromUri(sprintf('internal:/jsonapi/%s/%s/%s', $this->entityTypeId, $this->bundle, $parentEntity->uuid()));
+ $request_options[RequestOptions::JSON] = [
+ 'data' => [
+ 'id' => $parentEntity->uuid(),
+ 'type' => sprintf('%s--%s', $this->entityTypeId, $this->bundle),
+ 'relationships' => [
+ $this->fieldName => [
+ 'data' => [
+ [
+ 'id' => $childUuid,
+ 'type' => sprintf('%s--%s', $this->entityTypeId, $this->bundle),
+ ],
+ ],
+ ],
+ ],
+ ],
+ ];
+ $response = $this->request('PATCH', $url, $request_options);
+ $this->assertSame(200, $response->getStatusCode(), (string) $response->getBody());
+ $parentEntity = $storage->loadUnchanged($parentEntity->id());
+ $this->assertEquals($childEntity->uuid(), $parentEntity->get($this->fieldName)->target_uuid);
+ }
+
+}
diff --git a/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageNegotiationSettingsTest.php b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageNegotiationSettingsTest.php
index 54fdf4b0d21d..fe5ff0ca0627 100644
--- a/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageNegotiationSettingsTest.php
+++ b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageNegotiationSettingsTest.php
@@ -10,6 +10,7 @@ use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
/**
* Tests the migration of language negotiation.
*
+ * @group #slow
* @group migrate_drupal_7
*/
class MigrateLanguageNegotiationSettingsTest extends MigrateDrupal7TestBase {
diff --git a/core/modules/link/tests/src/Functional/LinkFieldUITest.php b/core/modules/link/tests/src/Functional/LinkFieldUITest.php
index 694fb6b36774..5c78abc23910 100644
--- a/core/modules/link/tests/src/Functional/LinkFieldUITest.php
+++ b/core/modules/link/tests/src/Functional/LinkFieldUITest.php
@@ -15,6 +15,7 @@ use Drupal\Tests\field_ui\Traits\FieldUiTestTrait;
* Tests link field UI functionality.
*
* @group link
+ * @group #slow
*/
class LinkFieldUITest extends BrowserTestBase {
diff --git a/core/modules/navigation/navigation.services.yml b/core/modules/navigation/navigation.services.yml
index 88b6826409a2..925efe58a4e1 100644
--- a/core/modules/navigation/navigation.services.yml
+++ b/core/modules/navigation/navigation.services.yml
@@ -45,3 +45,6 @@ services:
class: Drupal\navigation\TopBarItemManager
parent: default_plugin_manager
Drupal\navigation\TopBarItemManagerInterface: '@plugin.manager.top_bar_item'
+
+ Drupal\navigation\Menu\NavigationMenuLinkTreeManipulators:
+ autowire: true
diff --git a/core/modules/navigation/src/Menu/NavigationMenuLinkTreeManipulators.php b/core/modules/navigation/src/Menu/NavigationMenuLinkTreeManipulators.php
new file mode 100644
index 000000000000..75fefdf15417
--- /dev/null
+++ b/core/modules/navigation/src/Menu/NavigationMenuLinkTreeManipulators.php
@@ -0,0 +1,159 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\navigation\Menu;
+
+use Drupal\Core\Menu\MenuLinkDefault;
+use Drupal\Core\Menu\MenuLinkTreeElement;
+use Drupal\Core\Menu\StaticMenuLinkOverridesInterface;
+use Drupal\Core\Routing\RouteProviderInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\Core\StringTranslation\TranslationInterface;
+use Drupal\system\Controller\SystemController;
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
+
+/**
+ * Provides a menu link tree manipulator for the navigation menu block.
+ */
+class NavigationMenuLinkTreeManipulators {
+
+ use StringTranslationTrait;
+
+ public function __construct(
+ protected readonly RouteProviderInterface $routeProvider,
+ protected readonly StaticMenuLinkOverridesInterface $overrides,
+ TranslationInterface $translation,
+ ) {
+ $this->setStringTranslation($translation);
+ }
+
+ /**
+ * Adds an "overview" child link to second level menu links with children.
+ *
+ * In the navigation menu, a second-level menu item is a link if it does not
+ * have children, but if it does, it instead becomes a button that opens
+ * its child menu. To provide a way to access the page a second-level menu
+ * item links to, add an "overview" link that links to the page as a child
+ * (third-level) menu item.
+ *
+ * @param \Drupal\Core\Menu\MenuLinkTreeElement[] $tree
+ * The menu link tree to manipulate.
+ *
+ * @return \Drupal\Core\Menu\MenuLinkTreeElement[]
+ * The manipulated menu link tree.
+ */
+ public function addSecondLevelOverviewLinks(array $tree): array {
+ if (!$tree) {
+ return [];
+ }
+
+ foreach ($tree as $item) {
+ if (!$this->isEnabledAndAccessible($item)) {
+ continue;
+ }
+ foreach ($item->subtree as $sub_item) {
+ if ($this->shouldAddOverviewLink($sub_item)) {
+ $this->addOverviewLink($sub_item);
+ }
+ }
+ }
+
+ return $tree;
+ }
+
+ /**
+ * Whether a menu tree element should have an overview link added to it.
+ *
+ * @param \Drupal\Core\Menu\MenuLinkTreeElement $element
+ * The menu link tree element to check.
+ *
+ * @return bool
+ * TRUE if menu tree element should have a child overview link added.
+ */
+ protected function shouldAddOverviewLink(MenuLinkTreeElement $element): bool {
+ if (empty($element->subtree) || !$this->isEnabledAndAccessible($element)) {
+ return FALSE;
+ }
+
+ $route_name = $element->link->getRouteName();
+ if (in_array($route_name, ['<nolink>', '<button>'])) {
+ return FALSE;
+ }
+
+ $has_visible_children = FALSE;
+ foreach ($element->subtree as $sub_element) {
+ // Do not add overview link if there are no accessible or enabled
+ // children.
+ if ($this->isEnabledAndAccessible($sub_element)) {
+ $has_visible_children = TRUE;
+ }
+
+ // Do not add overview link if there is already a child linking to the
+ // same URL.
+ if ($sub_element->link->getRouteName() === $route_name) {
+ return FALSE;
+ }
+ }
+
+ if (!$has_visible_children) {
+ return FALSE;
+ }
+
+ // The systemAdminMenuBlockPage() method in SystemController returns a list
+ // of child menu links for the page. If the second-level menu item link's
+ // route uses that controller, do not add the overview link, because that
+ // duplicates what is already in the navigation menu.
+ try {
+ $controller = ltrim($this->routeProvider->getRouteByName($route_name)->getDefault('_controller') ?? '', "\\");
+ return $controller !== SystemController::class . '::systemAdminMenuBlockPage';
+ }
+ catch (RouteNotFoundException) {
+ return TRUE;
+ }
+ }
+
+ /**
+ * Checks whether the menu link tree element is accessible and enabled.
+ *
+ * Generally, the 'checkAccess' manipulator should run before this manipulator
+ * does, so the access objects should be set on all the links, but if it is
+ * not, treat the link as accessible for the purpose of adding the overview
+ * child link.
+ *
+ * @param \Drupal\Core\Menu\MenuLinkTreeElement $element
+ * The menu link tree element to be checked.
+ *
+ * @return bool
+ * TRUE if the menu link tree element is enabled and has access allowed.
+ */
+ protected function isEnabledAndAccessible(MenuLinkTreeElement $element): bool {
+ return $element->link->isEnabled() && (!isset($element->access) || $element->access->isAllowed());
+ }
+
+ /**
+ * Adds "overview" menu tree element as child of a menu tree element.
+ *
+ * @param \Drupal\Core\Menu\MenuLinkTreeElement $element
+ * The menu link tree element to add the overview child element to.
+ */
+ protected function addOverviewLink(MenuLinkTreeElement $element): void {
+ // Copy the menu link for the menu link element to a new menu link
+ // definition, except with overrides to make 'Overview' the title, set the
+ // parent to the original menu link, and set weight to a low number so that
+ // it likely goes to the top.
+ $definition = [
+ 'title' => $this->t('Overview', [
+ '@title' => $element->link->getTitle(),
+ ]),
+ 'parent' => $element->link->getPluginId(),
+ 'provider' => 'navigation',
+ 'weight' => -1000,
+ ] + $element->link->getPluginDefinition();
+ $link = new MenuLinkDefault([], $element->link->getPluginId() . '.navigation_overview', $definition, $this->overrides);
+ $overview_element = new MenuLinkTreeElement($link, FALSE, $element->depth + 1, $element->inActiveTrail, []);
+ $overview_element->access = $element->access ? clone $element->access : NULL;
+ $element->subtree[$element->link->getPluginId() . '.navigation_overview'] = $overview_element;
+ }
+
+}
diff --git a/core/modules/navigation/src/Plugin/Block/NavigationMenuBlock.php b/core/modules/navigation/src/Plugin/Block/NavigationMenuBlock.php
index 380cc8540aa3..8b75563b92f1 100644
--- a/core/modules/navigation/src/Plugin/Block/NavigationMenuBlock.php
+++ b/core/modules/navigation/src/Plugin/Block/NavigationMenuBlock.php
@@ -9,6 +9,7 @@ use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Menu\MenuTreeParameters;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\navigation\Menu\NavigationMenuLinkTreeManipulators;
use Drupal\navigation\Plugin\Derivative\SystemMenuNavigationBlock as SystemMenuNavigationBlockDeriver;
use Drupal\system\Plugin\Block\SystemMenuBlock;
use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -85,6 +86,7 @@ final class NavigationMenuBlock extends SystemMenuBlock implements ContainerFact
$tree = $this->menuTree->load($menu_name, $parameters);
$manipulators = [
['callable' => 'menu.default_tree_manipulators:checkAccess'],
+ ['callable' => NavigationMenuLinkTreeManipulators::class . ':addSecondLevelOverviewLinks'],
['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
];
$tree = $this->menuTree->transform($tree, $manipulators);
diff --git a/core/modules/navigation/tests/src/Kernel/NavigationMenuBlockTest.php b/core/modules/navigation/tests/src/Kernel/NavigationMenuBlockTest.php
index 496b7d1f7af5..d9cf1f70a090 100644
--- a/core/modules/navigation/tests/src/Kernel/NavigationMenuBlockTest.php
+++ b/core/modules/navigation/tests/src/Kernel/NavigationMenuBlockTest.php
@@ -11,6 +11,7 @@ use Drupal\Core\Routing\RouteObjectInterface;
use Drupal\Core\Routing\UrlGenerator;
use Drupal\KernelTests\KernelTestBase;
use Drupal\navigation\Plugin\Block\NavigationMenuBlock;
+use Drupal\system\Controller\SystemController;
use Drupal\system\Entity\Menu;
use Drupal\system\Tests\Routing\MockRouteProvider;
use Drupal\Tests\Core\Menu\MenuLinkMock;
@@ -106,9 +107,16 @@ class NavigationMenuBlockTest extends KernelTestBase {
$options = ['_access_checks' => ['access_check.default']];
$special_options = $options + ['_no_path' => TRUE];
$routes->add('example2', new Route('/example2', [], $requirements, $options));
- $routes->add('example4', new Route('/example4', [], $requirements, $options));
+ $routes->add('example4', new Route('/example4', ['_controller' => SystemController::class . '::systemAdminMenuBlockPage'], $requirements, $options));
$routes->add('example9', new Route('/example9', [], $requirements, $options));
- $routes->add('example11', new Route('/example11', [], $requirements, $options));
+ $routes->add('example11', new Route('/example11', ['_controller' => SystemController::class . '::systemAdminMenuBlockPage'], $requirements, $options));
+ $routes->add('example13', new Route('/example13', [], $requirements, $options));
+ $routes->add('example14', new Route('/example14', [], $requirements, $options));
+ $routes->add('example15', new Route('/example15', [], $requirements, $options));
+ $routes->add('example16', new Route('/example16', [], $requirements, $options));
+ $routes->add('example17', new Route('/example17', [], $requirements, $options));
+ $routes->add('example18', new Route('/example18', [], $requirements, $options));
+ $routes->add('example19', new Route('/example19', [], ['_access' => 'FALSE'], $options));
// Mock special routes defined in system.routing.yml.
$routes->add('<nolink>', new Route('', [], $requirements, $special_options));
@@ -144,15 +152,23 @@ class NavigationMenuBlockTest extends KernelTestBase {
// - 1 (nolink)
// - 2
// - 3 (nolink)
- // - 4
+ // - 4 (list of child links)
// - 9
// - 5 (button)
// - 7 (button)
// - 10 (nolink)
// - 6
// - 8 (nolink)
- // - 11
+ // - 11 (list of child links)
// - 12 (button)
+ // - 13
+ // - 14 (not a list of child links)
+ // - 15
+ // - 16
+ // - 17
+ // - 18 (disabled)
+ // - 19 (access denied)
+ // - 20 (links to same routed URL as 17)
// With link 6 being the only external link.
// phpcs:disable
$links = [
@@ -168,6 +184,14 @@ class NavigationMenuBlockTest extends KernelTestBase {
10 => MenuLinkMock::create(['id' => 'test.example10', 'route_name' => '<nolink>', 'title' => 'title 10', 'parent' => 'test.example7', 'weight' => 7]),
11 => MenuLinkMock::create(['id' => 'test.example11', 'route_name' => 'example11', 'title' => 'title 11', 'parent' => 'test.example8', 'weight' => 7]),
12 => MenuLinkMock::create(['id' => 'test.example12', 'route_name' => '<button>', 'title' => 'title 12', 'parent' => 'test.example11', 'weight' => 7]),
+ 13 => MenuLinkMock::create(['id' => 'test.example13', 'route_name' => 'example13', 'title' => 'title 13', 'parent' => '', 'weight' => 8]),
+ 14 => MenuLinkMock::create(['id' => 'test.example14', 'route_name' => 'example14', 'title' => 'title 14', 'parent' => 'test.example13', 'weight' => 8]),
+ 15 => MenuLinkMock::create(['id' => 'test.example15', 'route_name' => 'example15', 'title' => 'title 15', 'parent' => 'test.example14', 'weight' => 8]),
+ 16 => MenuLinkMock::create(['id' => 'test.example16', 'route_name' => 'example16', 'title' => 'title 16', 'parent' => '', 'weight' => 9]),
+ 17 => MenuLinkMock::create(['id' => 'test.example17', 'route_name' => 'example17', 'title' => 'title 17', 'parent' => 'test.example16', 'weight' => 9]),
+ 18 => MenuLinkMock::create(['id' => 'test.example18', 'route_name' => 'example18', 'title' => 'title 18', 'parent' => 'test.example17', 'weight' => 9, 'enabled' => FALSE]),
+ 19 => MenuLinkMock::create(['id' => 'test.example19', 'route_name' => 'example19', 'title' => 'title 19', 'parent' => 'test.example17', 'weight' => 9]),
+ 20 => MenuLinkMock::create(['id' => 'test.example20', 'route_name' => 'example17', 'title' => 'title 20', 'parent' => 'test.example17', 'weight' => 9]),
];
// phpcs:enable
foreach ($links as $instance) {
@@ -234,16 +258,22 @@ class NavigationMenuBlockTest extends KernelTestBase {
'test.example5' => [],
'test.example6' => [],
'test.example8' => [],
+ 'test.example13' => [],
+ 'test.example16' => [],
];
$expectations['level_2_only'] = [
'test.example3' => [],
'test.example7' => [],
'test.example11' => [],
+ 'test.example14' => [],
+ 'test.example17' => [],
];
$expectations['level_3_only'] = [
'test.example4' => [],
'test.example10' => [],
'test.example12' => [],
+ 'test.example15' => [],
+ 'test.example20' => [],
];
$expectations['level_1_and_beyond'] = [
'test.example1' => [],
@@ -263,6 +293,20 @@ class NavigationMenuBlockTest extends KernelTestBase {
'test.example12' => [],
],
],
+ 'test.example13' => [
+ 'test.example14' => [
+ 'test.example14.navigation_overview' => [],
+ 'test.example15' => [],
+ ],
+ ],
+ 'test.example16' => [
+ // 17 only has inaccessible and disabled child links, and a child item
+ // that links to the same url as 17, so there should be no overview link
+ // child added.
+ 'test.example17' => [
+ 'test.example20' => [],
+ ],
+ ],
];
$expectations['level_2_and_beyond'] = [
'test.example3' => [
@@ -276,6 +320,12 @@ class NavigationMenuBlockTest extends KernelTestBase {
'test.example11' => [
'test.example12' => [],
],
+ 'test.example14' => [
+ 'test.example15' => [],
+ ],
+ 'test.example17' => [
+ 'test.example20' => [],
+ ],
];
$expectations['level_3_and_beyond'] = [
'test.example4' => [
@@ -283,6 +333,8 @@ class NavigationMenuBlockTest extends KernelTestBase {
],
'test.example10' => [],
'test.example12' => [],
+ 'test.example15' => [],
+ 'test.example20' => [],
];
// Scenario 1: test all navigation block instances when there's no active
// trail.
@@ -346,6 +398,10 @@ class NavigationMenuBlockTest extends KernelTestBase {
"//li[contains(@class,'toolbar-menu__item--level-2')]/span[text()='title 10']",
"//li[contains(@class,'toolbar-menu__item--level-1')]/button/span[text()='title 11']",
"//li[contains(@class,'toolbar-menu__item--level-2')]/button[text()='title 12']",
+ "//li[contains(@class,'toolbar-block__list-item')]/button/span[text()='title 13']",
+ "//li[contains(@class,'toolbar-menu__item--level-1')]/button/span[text()='title 14']",
+ "//li[contains(@class,'toolbar-menu__item--level-2')]/a[text()='Overview']",
+ "//li[contains(@class,'toolbar-menu__item--level-1')]/button/span[text()='title 17']",
];
foreach ($items_query as $query) {
$span = $xpath->query($query);
diff --git a/core/modules/navigation/tests/src/Unit/NavigationMenuLinkTreeManipulatorsTest.php b/core/modules/navigation/tests/src/Unit/NavigationMenuLinkTreeManipulatorsTest.php
new file mode 100644
index 000000000000..257033b5feac
--- /dev/null
+++ b/core/modules/navigation/tests/src/Unit/NavigationMenuLinkTreeManipulatorsTest.php
@@ -0,0 +1,308 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\navigation\Unit;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Menu\MenuLinkTreeElement;
+use Drupal\Core\Menu\StaticMenuLinkOverridesInterface;
+use Drupal\Core\Routing\RouteProviderInterface;
+use Drupal\Core\StringTranslation\TranslationInterface;
+use Drupal\navigation\Menu\NavigationMenuLinkTreeManipulators;
+use Drupal\system\Controller\SystemController;
+use Drupal\Tests\Core\Menu\MenuLinkMock;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Tests the navigation menu link tree manipulator.
+ *
+ * @group navigation
+ *
+ * @coversDefaultClass \Drupal\navigation\Menu\NavigationMenuLinkTreeManipulators
+ */
+class NavigationMenuLinkTreeManipulatorsTest extends UnitTestCase {
+
+ /**
+ * Tests the addSecondLevelOverviewLinks() tree manipulator.
+ *
+ * @covers ::addSecondLevelOverviewLinks
+ */
+ public function testAddSecondLevelOverviewLinks(): void {
+ $routeProvider = $this->createMock(RouteProviderInterface::class);
+ // For only the route named 'child_list', return a route object with the
+ // SystemController::systemAdminMenuBlockPage as the controller.
+ $childListRoute = new Route('/test-child-list', ['_controller' => SystemController::class . '::systemAdminMenuBlockPage']);
+ $routeProvider->expects($this->any())
+ ->method('getRouteByName')
+ ->willReturnCallback(static fn ($name) => $name === 'child_list' ? $childListRoute : new Route("/$name"));
+ $overrides = $this->createMock(StaticMenuLinkOverridesInterface::class);
+ $translation = $this->createMock(TranslationInterface::class);
+ $translation
+ ->method('translateString')
+ ->willReturnCallback(static fn ($string) => $string);
+ $manipulator = new NavigationMenuLinkTreeManipulators($routeProvider, $overrides, $translation);
+
+ $originalTree = $this->mockTree();
+ // Make sure overview links do not already exist.
+ $this->assertArrayNotHasKey('test.example3.navigation_overview', $originalTree[2]->subtree[3]->subtree);
+ $this->assertArrayNotHasKey('test.example6.navigation_overview', $originalTree[5]->subtree[6]->subtree);
+ $tree = $manipulator->addSecondLevelOverviewLinks($originalTree);
+
+ // First level menu items should not have any children added.
+ $this->assertEmpty($tree[1]->subtree);
+ $this->assertEquals($originalTree[2]->subtree, $tree[2]->subtree);
+ $this->assertEquals($originalTree[5]->subtree, $tree[5]->subtree);
+ $this->assertEquals($originalTree[8]->subtree, $tree[8]->subtree);
+ $this->assertEquals($originalTree[11]->subtree, $tree[11]->subtree);
+ $this->assertEquals($originalTree[13]->subtree, $tree[13]->subtree);
+ $this->assertEquals($originalTree[16]->subtree, $tree[16]->subtree);
+ $this->assertEquals($originalTree[19]->subtree, $tree[19]->subtree);
+
+ // Leaves should not have any children added.
+ $this->assertEmpty($tree[2]->subtree[3]->subtree[4]->subtree);
+ $this->assertEmpty($tree[5]->subtree[6]->subtree[7]->subtree);
+ $this->assertEmpty($tree[8]->subtree[9]->subtree[10]->subtree);
+ $this->assertEmpty($tree[11]->subtree[12]->subtree);
+ $this->assertEmpty($tree[13]->subtree[14]->subtree[15]->subtree);
+ $this->assertEmpty($tree[16]->subtree[17]->subtree[18]->subtree);
+ $this->assertEmpty($tree[19]->subtree[20]->subtree[21]->subtree);
+ $this->assertEmpty($tree[19]->subtree[20]->subtree[22]->subtree);
+
+ // Links 3 and 6 should have overview children, even though 6 is unrouted.
+ $this->assertArrayHasKey('test.example3.navigation_overview', $tree[2]->subtree[3]->subtree);
+ $this->assertArrayHasKey('test.example6.navigation_overview', $tree[5]->subtree[6]->subtree);
+
+ // Link 9 is a child list page, so it should not have an overview child.
+ $this->assertArrayNotHasKey('test.example9.navigation_overview', $tree[8]->subtree[9]->subtree);
+
+ // Link 14 and Link 17 are <nolink> and <button> routes, so they should not
+ // have overview children.
+ $this->assertArrayNotHasKey('test.example14.navigation_overview', $tree[13]->subtree[14]->subtree);
+ $this->assertArrayNotHasKey('test.example17.navigation_overview', $tree[16]->subtree[17]->subtree);
+
+ // Link 20's child links are either inaccessible, disabled, or link to the
+ // same route as 20, so it should not have an overview child.
+ $this->assertArrayNotHasKey('test.example20.navigation_overview', $tree[19]->subtree[20]->subtree);
+ }
+
+ /**
+ * Creates a mock tree.
+ *
+ * This mocks a tree with the following structure:
+ * - 1
+ * - 2
+ * - 3
+ * - 4
+ * - 5
+ * - 6 (external)
+ * - 7
+ * - 8
+ * - 9
+ * - 10
+ * - 11
+ * - 12
+ * - 13
+ * - 14 (nolink)
+ * - 15
+ * - 16
+ * - 17 (button)
+ * - 18
+ * - 19
+ * - 20
+ * - 21 (disabled)
+ * - 22 (access denied)
+ * - 23 (links to same routed URL as 20)
+ *
+ * With link 9 linking to a page that contains a list of child menu links.
+ *
+ * @return \Drupal\Core\Menu\MenuLinkTreeElement[]
+ * The mock menu tree.
+ */
+ protected function mockTree(): array {
+ $links = [
+ 1 => MenuLinkMock::create([
+ 'id' => 'test.example1',
+ 'route_name' => 'example1',
+ 'title' => 'foo',
+ 'parent' => '',
+ ]),
+ 2 => MenuLinkMock::create([
+ 'id' => 'test.example2',
+ 'route_name' => 'example2',
+ 'title' => 'foo',
+ 'parent' => '',
+ ]),
+ 3 => MenuLinkMock::create([
+ 'id' => 'test.example3',
+ 'route_name' => 'example3',
+ 'title' => 'baz',
+ 'parent' => 'test.example2',
+ ]),
+ 4 => MenuLinkMock::create([
+ 'id' => 'test.example4',
+ 'route_name' => 'example4',
+ 'title' => 'qux',
+ 'parent' => 'test.example3',
+ ]),
+ 5 => MenuLinkMock::create([
+ 'id' => 'test.example5',
+ 'route_name' => 'example5',
+ 'title' => 'title5',
+ 'parent' => '',
+ ]),
+ 6 => MenuLinkMock::create([
+ 'id' => 'test.example6',
+ 'route_name' => '',
+ 'url' => 'https://www.drupal.org/',
+ 'title' => 'bar_bar',
+ 'parent' => 'test.example5',
+ ]),
+ 7 => MenuLinkMock::create([
+ 'id' => 'test.example7',
+ 'route_name' => 'example7',
+ 'title' => 'title7',
+ 'parent' => 'test.example6',
+ ]),
+ 8 => MenuLinkMock::create([
+ 'id' => 'test.example8',
+ 'route_name' => 'example8',
+ 'title' => 'title8',
+ 'parent' => '',
+ ]),
+ 9 => MenuLinkMock::create([
+ 'id' => 'test.example9',
+ 'route_name' => 'child_list',
+ 'title' => 'title9',
+ 'parent' => 'test.example8',
+ ]),
+ 10 => MenuLinkMock::create([
+ 'id' => 'test.example10',
+ 'route_name' => 'example9',
+ 'title' => 'title10',
+ 'parent' => 'test.example9',
+ ]),
+ 11 => MenuLinkMock::create([
+ 'id' => 'test.example11',
+ 'route_name' => 'example11',
+ 'title' => 'title11',
+ 'parent' => '',
+ ]),
+ 12 => MenuLinkMock::create([
+ 'id' => 'test.example12',
+ 'route_name' => 'example12',
+ 'title' => 'title12',
+ 'parent' => 'text.example11',
+ ]),
+ 13 => MenuLinkMock::create([
+ 'id' => 'test.example13',
+ 'route_name' => 'example13',
+ 'title' => 'title13',
+ 'parent' => '',
+ ]),
+ 14 => MenuLinkMock::create([
+ 'id' => 'test.example14',
+ 'route_name' => '<nolink>',
+ 'title' => 'title14',
+ 'parent' => 'text.example13',
+ ]),
+ 15 => MenuLinkMock::create([
+ 'id' => 'test.example15',
+ 'route_name' => 'example15',
+ 'title' => 'title15',
+ 'parent' => 'text.example14',
+ ]),
+ 16 => MenuLinkMock::create([
+ 'id' => 'test.example16',
+ 'route_name' => 'example16',
+ 'title' => 'title16',
+ 'parent' => '',
+ ]),
+ 17 => MenuLinkMock::create([
+ 'id' => 'test.example17',
+ 'route_name' => '<button>',
+ 'title' => 'title17',
+ 'parent' => 'text.example16',
+ ]),
+ 18 => MenuLinkMock::create([
+ 'id' => 'test.example18',
+ 'route_name' => 'example18',
+ 'title' => 'title18',
+ 'parent' => 'text.example17',
+ ]),
+ 19 => MenuLinkMock::create([
+ 'id' => 'test.example19',
+ 'route_name' => 'example19',
+ 'title' => 'title19',
+ 'parent' => '',
+ ]),
+ 20 => MenuLinkMock::create([
+ 'id' => 'test.example20',
+ 'route_name' => 'example20',
+ 'title' => 'title20',
+ 'parent' => 'test.example19',
+ ]),
+ 21 => MenuLinkMock::create([
+ 'id' => 'test.example21',
+ 'route_name' => 'example21',
+ 'title' => 'title21',
+ 'parent' => 'test.example20',
+ 'enabled' => FALSE,
+ ]),
+ 22 => MenuLinkMock::create([
+ 'id' => 'test.example22',
+ 'route_name' => 'no_access',
+ 'title' => 'title22',
+ 'parent' => 'test.example20',
+ ]),
+ 23 => MenuLinkMock::create([
+ 'id' => 'test.example23',
+ 'route_name' => 'example20',
+ 'title' => 'title23',
+ 'parent' => 'test.example20',
+ ]),
+ ];
+ $tree = [];
+ $tree[1] = new MenuLinkTreeElement($links[1], FALSE, 1, FALSE, []);
+ $tree[2] = new MenuLinkTreeElement($links[2], TRUE, 1, FALSE, [
+ 3 => new MenuLinkTreeElement($links[3], TRUE, 2, FALSE, [
+ 4 => new MenuLinkTreeElement($links[4], FALSE, 3, FALSE, []),
+ ]),
+ ]);
+ $tree[5] = new MenuLinkTreeElement($links[5], TRUE, 1, FALSE, [
+ 6 => new MenuLinkTreeElement($links[6], TRUE, 2, FALSE, [
+ 7 => new MenuLinkTreeElement($links[7], FALSE, 3, FALSE, []),
+ ]),
+ ]);
+ $tree[8] = new MenuLinkTreeElement($links[8], TRUE, 1, FALSE, [
+ 9 => new MenuLinkTreeElement($links[9], TRUE, 2, FALSE, [
+ 10 => new MenuLinkTreeElement($links[10], FALSE, 3, FALSE, []),
+ ]),
+ ]);
+ $tree[11] = new MenuLinkTreeElement($links[11], TRUE, 1, FALSE, [
+ 12 => new MenuLinkTreeElement($links[12], FALSE, 2, FALSE, []),
+ ]);
+ $tree[13] = new MenuLinkTreeElement($links[13], TRUE, 1, FALSE, [
+ 14 => new MenuLinkTreeElement($links[14], TRUE, 2, FALSE, [
+ 15 => new MenuLinkTreeElement($links[15], FALSE, 3, FALSE, []),
+ ]),
+ ]);
+ $tree[16] = new MenuLinkTreeElement($links[16], TRUE, 1, FALSE, [
+ 17 => new MenuLinkTreeElement($links[17], TRUE, 2, FALSE, [
+ 18 => new MenuLinkTreeElement($links[18], FALSE, 3, FALSE, []),
+ ]),
+ ]);
+ $tree[19] = new MenuLinkTreeElement($links[19], TRUE, 1, FALSE, [
+ 20 => new MenuLinkTreeElement($links[20], TRUE, 2, FALSE, [
+ 21 => new MenuLinkTreeElement($links[21], FALSE, 3, FALSE, []),
+ 22 => new MenuLinkTreeElement($links[22], FALSE, 3, FALSE, []),
+ 23 => new MenuLinkTreeElement($links[23], FALSE, 3, FALSE, []),
+ ]),
+ ]);
+ $tree[19]->subtree[20]->subtree[22]->access = AccessResult::forbidden();
+
+ return $tree;
+ }
+
+}
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 4ee3c48a00b2..f14d843faa10 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -387,6 +387,11 @@ function node_form_system_themes_admin_form_submit($form, FormStateInterface $fo
}
/**
+ * @addtogroup node_access
+ * @{
+ */
+
+/**
* Fetches an array of permission IDs granted to the given user ID.
*
* The implementation here provides only the universal "all" grant. A node
@@ -658,6 +663,10 @@ function _node_access_rebuild_batch_finished($success, $results, $operations): v
}
/**
+ * @} End of "addtogroup node_access".
+ */
+
+/**
* Marks a node to be re-indexed by the node_search plugin.
*
* @param int $nid
diff --git a/core/modules/node/src/NodeAccessControlHandlerInterface.php b/core/modules/node/src/NodeAccessControlHandlerInterface.php
index 588391394eec..0d67cfb7bd69 100644
--- a/core/modules/node/src/NodeAccessControlHandlerInterface.php
+++ b/core/modules/node/src/NodeAccessControlHandlerInterface.php
@@ -30,6 +30,8 @@ interface NodeAccessControlHandlerInterface {
/**
* Creates the default node access grant entry on the grant storage.
+ *
+ * @see \Drupal\node\NodeGrantDatabaseStorageInterface::writeDefault()
*/
public function writeDefaultGrant();
diff --git a/core/modules/node/src/NodeGrantDatabaseStorageInterface.php b/core/modules/node/src/NodeGrantDatabaseStorageInterface.php
index cce744765630..5e81e1d04d0b 100644
--- a/core/modules/node/src/NodeGrantDatabaseStorageInterface.php
+++ b/core/modules/node/src/NodeGrantDatabaseStorageInterface.php
@@ -83,6 +83,12 @@ interface NodeGrantDatabaseStorageInterface {
/**
* Creates the default node access grant entry.
+ *
+ * The default node access grant is a special grant added to the node_access
+ * table when no modules implement hook_node_grants. It grants view access
+ * to any published node.
+ *
+ * @see self::access()
*/
public function writeDefault();
diff --git a/core/modules/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php b/core/modules/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php
index 90348cdfdd3c..2e9a0977fa36 100644
--- a/core/modules/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php
+++ b/core/modules/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php
@@ -13,7 +13,6 @@ use Drupal\Tests\package_manager\Traits\FixtureUtilityTrait;
* @coversDefaultClass \Drupal\package_manager\Validator\SupportedReleaseValidator
* @group #slow
* @group package_manager
- * @group #slow
* @internal
*/
class SupportedReleaseValidatorTest extends PackageManagerKernelTestBase {
diff --git a/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php b/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php
index d5cc9759ab18..be5d811fe543 100644
--- a/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php
+++ b/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php
@@ -13,6 +13,7 @@ use Drupal\Tests\Traits\Core\PathAliasTestTrait;
/**
* URL alias migration.
*
+ * @group #slow
* @group migrate_drupal_6
*/
class MigrateUrlAliasTest extends MigrateDrupal6TestBase {
diff --git a/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php b/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php
index 7ad95f16823b..acc2e49a5cb6 100644
--- a/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php
+++ b/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php
@@ -2,14 +2,16 @@
namespace Drupal\search\Plugin;
-use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\ConfigurableTrait;
/**
* Provides a base implementation for a configurable Search plugin.
*/
abstract class ConfigurableSearchPluginBase extends SearchPluginBase implements ConfigurableSearchPluginInterface {
+ use ConfigurableTrait;
+
/**
* The unique ID for the search page using this plugin.
*
@@ -29,27 +31,6 @@ abstract class ConfigurableSearchPluginBase extends SearchPluginBase implements
/**
* {@inheritdoc}
*/
- public function defaultConfiguration() {
- return [];
- }
-
- /**
- * {@inheritdoc}
- */
- public function getConfiguration() {
- return $this->configuration;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setConfiguration(array $configuration) {
- $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration);
- }
-
- /**
- * {@inheritdoc}
- */
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
}
diff --git a/core/modules/sqlite/src/Driver/Database/sqlite/Schema.php b/core/modules/sqlite/src/Driver/Database/sqlite/Schema.php
index cbcdffcd2f95..fa526a9f5d03 100644
--- a/core/modules/sqlite/src/Driver/Database/sqlite/Schema.php
+++ b/core/modules/sqlite/src/Driver/Database/sqlite/Schema.php
@@ -249,6 +249,11 @@ class Schema extends DatabaseSchema {
'blob:big' => 'BLOB',
'blob:normal' => 'BLOB',
+
+ // Only the SQLite driver has this field map to due to a fatal error
+ // error caused by this driver's schema on table introspection.
+ // @todo Add support to all drivers in https://drupal.org/i/3343634
+ 'json:normal' => 'JSON',
];
return $map;
}
diff --git a/core/modules/system/src/Hook/SystemHooks.php b/core/modules/system/src/Hook/SystemHooks.php
index 86d181646239..800a1d718f37 100644
--- a/core/modules/system/src/Hook/SystemHooks.php
+++ b/core/modules/system/src/Hook/SystemHooks.php
@@ -159,10 +159,6 @@ class SystemHooks {
}
/**
- * @} End of "defgroup authorize".
- */
-
- /**
* Implements hook_updater_info().
*/
#[Hook('updater_info')]
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index dbda1e1b6b4b..0fbcf9b6c1fd 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -307,6 +307,10 @@ function system_authorized_batch_process() {
}
/**
+ * @} End of "defgroup authorize".
+ */
+
+/**
* Implements hook_preprocess_HOOK() for block templates.
*/
function system_preprocess_block(&$variables): void {
diff --git a/core/modules/system/tests/src/Functional/Entity/Traits/EntityDefinitionTestTrait.php b/core/modules/system/tests/src/Functional/Entity/Traits/EntityDefinitionTestTrait.php
index e130b89bf327..94221d8165fe 100644
--- a/core/modules/system/tests/src/Functional/Entity/Traits/EntityDefinitionTestTrait.php
+++ b/core/modules/system/tests/src/Functional/Entity/Traits/EntityDefinitionTestTrait.php
@@ -24,7 +24,7 @@ trait EntityDefinitionTestTrait {
* (optional) Applies changes only for the specified entity type ID.
* Defaults to NULL.
*/
- protected function applyEntityUpdates($entity_type_id = NULL) {
+ protected function applyEntityUpdates($entity_type_id = NULL): void {
$complete_change_list = \Drupal::entityDefinitionUpdateManager()->getChangeList();
if ($complete_change_list) {
// In case there are changes, explicitly invalidate caches.
@@ -68,7 +68,7 @@ trait EntityDefinitionTestTrait {
* @param string $entity_type_id
* The entity type ID.
*/
- protected function doEntityUpdate($op, $entity_type_id) {
+ protected function doEntityUpdate($op, $entity_type_id): void {
$entity_type = \Drupal::entityTypeManager()->getDefinition($entity_type_id);
$field_storage_definitions = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions($entity_type_id);
switch ($op) {
@@ -96,7 +96,7 @@ trait EntityDefinitionTestTrait {
* @param array|null $original_storage_definition
* The original field storage definition.
*/
- protected function doFieldUpdate($op, $storage_definition = NULL, $original_storage_definition = NULL) {
+ protected function doFieldUpdate($op, $storage_definition = NULL, $original_storage_definition = NULL): void {
switch ($op) {
case EntityDefinitionUpdateManagerInterface::DEFINITION_CREATED:
\Drupal::service('field_storage_definition.listener')->onFieldStorageDefinitionCreate($storage_definition);
@@ -115,7 +115,7 @@ trait EntityDefinitionTestTrait {
/**
* Enables a new entity type definition.
*/
- protected function enableNewEntityType() {
+ protected function enableNewEntityType(): void {
$this->state->set('entity_test_new', TRUE);
$this->applyEntityUpdates('entity_test_new');
}
@@ -123,7 +123,7 @@ trait EntityDefinitionTestTrait {
/**
* Resets the entity type definition.
*/
- protected function resetEntityType() {
+ protected function resetEntityType(): void {
$updated_entity_type = $this->getUpdatedEntityTypeDefinition(FALSE, FALSE);
$updated_field_storage_definitions = $this->getUpdatedFieldStorageDefinitions(FALSE, FALSE);
$this->entityDefinitionUpdateManager->updateFieldableEntityType($updated_entity_type, $updated_field_storage_definitions);
@@ -136,7 +136,7 @@ trait EntityDefinitionTestTrait {
* (optional) Whether the change should be performed by the entity
* definition update manager.
*/
- protected function updateEntityTypeToRevisionable($perform_update = FALSE) {
+ protected function updateEntityTypeToRevisionable($perform_update = FALSE): void {
$translatable = $this->entityDefinitionUpdateManager->getEntityType('entity_test_update')->isTranslatable();
$updated_entity_type = $this->getUpdatedEntityTypeDefinition(TRUE, $translatable);
@@ -154,7 +154,7 @@ trait EntityDefinitionTestTrait {
* (optional) Whether the change should be performed by the entity
* definition update manager.
*/
- protected function updateEntityTypeToNotRevisionable($perform_update = FALSE) {
+ protected function updateEntityTypeToNotRevisionable($perform_update = FALSE): void {
$translatable = $this->entityDefinitionUpdateManager->getEntityType('entity_test_update')->isTranslatable();
$updated_entity_type = $this->getUpdatedEntityTypeDefinition(FALSE, $translatable);
@@ -172,7 +172,7 @@ trait EntityDefinitionTestTrait {
* (optional) Whether the change should be performed by the entity
* definition update manager.
*/
- protected function updateEntityTypeToTranslatable($perform_update = FALSE) {
+ protected function updateEntityTypeToTranslatable($perform_update = FALSE): void {
$revisionable = $this->entityDefinitionUpdateManager->getEntityType('entity_test_update')->isRevisionable();
$updated_entity_type = $this->getUpdatedEntityTypeDefinition($revisionable, TRUE);
@@ -190,7 +190,7 @@ trait EntityDefinitionTestTrait {
* (optional) Whether the change should be performed by the entity
* definition update manager.
*/
- protected function updateEntityTypeToNotTranslatable($perform_update = FALSE) {
+ protected function updateEntityTypeToNotTranslatable($perform_update = FALSE): void {
$revisionable = $this->entityDefinitionUpdateManager->getEntityType('entity_test_update')->isRevisionable();
$updated_entity_type = $this->getUpdatedEntityTypeDefinition($revisionable, FALSE);
@@ -208,7 +208,7 @@ trait EntityDefinitionTestTrait {
* (optional) Whether the change should be performed by the entity
* definition update manager.
*/
- protected function updateEntityTypeToRevisionableAndTranslatable($perform_update = FALSE) {
+ protected function updateEntityTypeToRevisionableAndTranslatable($perform_update = FALSE): void {
$updated_entity_type = $this->getUpdatedEntityTypeDefinition(TRUE, TRUE);
$updated_field_storage_definitions = $this->getUpdatedFieldStorageDefinitions(TRUE, TRUE);
@@ -235,7 +235,7 @@ trait EntityDefinitionTestTrait {
* (optional) If the base field should be translatable or not. Defaults to
* FALSE.
*/
- protected function addBaseField($type = 'string', $entity_type_id = 'entity_test_update', $is_revisionable = FALSE, $set_label = TRUE, $is_translatable = FALSE) {
+ protected function addBaseField($type = 'string', $entity_type_id = 'entity_test_update', $is_revisionable = FALSE, $set_label = TRUE, $is_translatable = FALSE): void {
$definitions['new_base_field'] = BaseFieldDefinition::create($type)
->setName('new_base_field')
->setRevisionable($is_revisionable)
@@ -251,7 +251,7 @@ trait EntityDefinitionTestTrait {
/**
* Adds a long-named base field to the 'entity_test_update' entity type.
*/
- protected function addLongNameBaseField() {
+ protected function addLongNameBaseField(): void {
$key = 'entity_test_update.additional_base_field_definitions';
$definitions = $this->state->get($key, []);
$definitions['new_long_named_entity_reference_base_field'] = BaseFieldDefinition::create('entity_reference')
@@ -268,7 +268,7 @@ trait EntityDefinitionTestTrait {
* @param string $type
* (optional) The field type for the new field. Defaults to 'string'.
*/
- protected function addRevisionableBaseField($type = 'string') {
+ protected function addRevisionableBaseField($type = 'string'): void {
$definitions['new_base_field'] = BaseFieldDefinition::create($type)
->setName('new_base_field')
->setLabel(t('A new revisionable base field'))
@@ -279,14 +279,14 @@ trait EntityDefinitionTestTrait {
/**
* Modifies the new base field from 'string' to 'text'.
*/
- protected function modifyBaseField() {
+ protected function modifyBaseField(): void {
$this->addBaseField('text');
}
/**
* Promotes a field to an entity key.
*/
- protected function makeBaseFieldEntityKey() {
+ protected function makeBaseFieldEntityKey(): void {
$entity_type = clone \Drupal::entityTypeManager()->getDefinition('entity_test_update');
$entity_keys = $entity_type->getKeys();
$entity_keys['new_base_field'] = 'new_base_field';
@@ -300,21 +300,21 @@ trait EntityDefinitionTestTrait {
* @param string $entity_type_id
* (optional) The entity type ID the base field should be attached to.
*/
- protected function removeBaseField($entity_type_id = 'entity_test_update') {
+ protected function removeBaseField($entity_type_id = 'entity_test_update'): void {
$this->state->delete($entity_type_id . '.additional_base_field_definitions');
}
/**
* Adds a single-field index to the base field.
*/
- protected function addBaseFieldIndex() {
+ protected function addBaseFieldIndex(): void {
$this->state->set('entity_test_update.additional_field_index.entity_test_update.new_base_field', TRUE);
}
/**
* Removes the index added in addBaseFieldIndex().
*/
- protected function removeBaseFieldIndex() {
+ protected function removeBaseFieldIndex(): void {
$this->state->delete('entity_test_update.additional_field_index.entity_test_update.new_base_field');
}
@@ -328,7 +328,7 @@ trait EntityDefinitionTestTrait {
* @param bool $translatable
* (optional) Whether the field should be translatable. Defaults to FALSE.
*/
- protected function addBundleField($type = 'string', $revisionable = FALSE, $translatable = FALSE) {
+ protected function addBundleField($type = 'string', $revisionable = FALSE, $translatable = FALSE): void {
$definitions['new_bundle_field'] = FieldStorageDefinition::create($type)
->setName('new_bundle_field')
->setLabel(t('A new bundle field'))
@@ -342,14 +342,14 @@ trait EntityDefinitionTestTrait {
/**
* Modifies the new bundle field from 'string' to 'text'.
*/
- protected function modifyBundleField() {
+ protected function modifyBundleField(): void {
$this->addBundleField('text');
}
/**
* Removes the new bundle field from the 'entity_test_update' entity type.
*/
- protected function removeBundleField() {
+ protected function removeBundleField(): void {
$this->state->delete('entity_test_update.additional_field_storage_definitions');
$this->state->delete('entity_test_update.additional_bundle_field_definitions.test_bundle');
}
@@ -359,7 +359,7 @@ trait EntityDefinitionTestTrait {
*
* @see \Drupal\entity_test\EntityTestStorageSchema::getEntitySchema()
*/
- protected function addEntityIndex() {
+ protected function addEntityIndex(): void {
$indexes = [
'entity_test_update__new_index' => ['name', 'test_single_property'],
];
@@ -369,14 +369,14 @@ trait EntityDefinitionTestTrait {
/**
* Removes the index added in addEntityIndex().
*/
- protected function removeEntityIndex() {
+ protected function removeEntityIndex(): void {
$this->state->delete('entity_test_update.additional_entity_indexes');
}
/**
* Renames the base table to 'entity_test_update_new'.
*/
- protected function renameBaseTable() {
+ protected function renameBaseTable(): void {
$entity_type = clone \Drupal::entityTypeManager()->getDefinition('entity_test_update');
$entity_type->set('base_table', 'entity_test_update_new');
@@ -387,7 +387,7 @@ trait EntityDefinitionTestTrait {
/**
* Renames the data table to 'entity_test_update_data_new'.
*/
- protected function renameDataTable() {
+ protected function renameDataTable(): void {
$entity_type = clone \Drupal::entityTypeManager()->getDefinition('entity_test_update');
$entity_type->set('data_table', 'entity_test_update_data_new');
@@ -398,7 +398,7 @@ trait EntityDefinitionTestTrait {
/**
* Renames the revision table to 'entity_test_update_revision_new'.
*/
- protected function renameRevisionBaseTable() {
+ protected function renameRevisionBaseTable(): void {
$entity_type = clone \Drupal::entityTypeManager()->getDefinition('entity_test_update');
$entity_type->set('revision_table', 'entity_test_update_revision_new');
@@ -409,7 +409,7 @@ trait EntityDefinitionTestTrait {
/**
* Renames the revision data table to 'entity_test_update_revision_data_new'.
*/
- protected function renameRevisionDataTable() {
+ protected function renameRevisionDataTable(): void {
$entity_type = clone \Drupal::entityTypeManager()->getDefinition('entity_test_update');
$entity_type->set('revision_data_table', 'entity_test_update_revision_data_new');
@@ -420,7 +420,7 @@ trait EntityDefinitionTestTrait {
/**
* Removes the entity type.
*/
- protected function deleteEntityType() {
+ protected function deleteEntityType(): void {
$this->state->set('entity_test_update.entity_type', 'null');
}
diff --git a/core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php b/core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php
index 6c8c42da59e8..82d866e985e4 100644
--- a/core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php
+++ b/core/modules/system/tests/src/Kernel/DateFormatAccessControlHandlerTest.php
@@ -77,6 +77,8 @@ class DateFormatAccessControlHandlerTest extends KernelTestBase {
* An array of test cases.
*/
public static function providerTestAccess(): array {
+ $originalContainer = \Drupal::hasContainer() ? \Drupal::getContainer() : NULL;
+
$c = new ContainerBuilder();
$cache_contexts_manager = (new Prophet())->prophesize(CacheContextsManager::class);
$cache_contexts_manager->assertValidTokens()->willReturn(TRUE);
@@ -84,7 +86,7 @@ class DateFormatAccessControlHandlerTest extends KernelTestBase {
$c->set('cache_contexts_manager', $cache_contexts_manager);
\Drupal::setContainer($c);
- return [
+ $data = [
'No permission + unlocked' => [
[],
'unlocked',
@@ -122,6 +124,13 @@ class DateFormatAccessControlHandlerTest extends KernelTestBase {
AccessResult::allowed()->addCacheContexts(['user.permissions']),
],
];
+
+ // Restore the original container if needed.
+ if ($originalContainer) {
+ \Drupal::setContainer($originalContainer);
+ }
+
+ return $data;
}
}
diff --git a/core/modules/taxonomy/src/Hook/TaxonomyHooks.php b/core/modules/taxonomy/src/Hook/TaxonomyHooks.php
index 4cc0a6f6eb61..82a88ce8a198 100644
--- a/core/modules/taxonomy/src/Hook/TaxonomyHooks.php
+++ b/core/modules/taxonomy/src/Hook/TaxonomyHooks.php
@@ -180,4 +180,9 @@ class TaxonomyHooks {
}
}
+ // phpcs:ignore Drupal.Commenting.InlineComment.DocBlock
+ /**
+ * @} End of "defgroup taxonomy_index".
+ */
+
}
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index 04c00e36b6c2..28e54b11f71b 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -90,6 +90,11 @@ function taxonomy_term_is_page(Term $term) {
}
/**
+ * @addtogroup taxonomy_index
+ * @{
+ */
+
+/**
* Builds and inserts taxonomy index entries for a given node.
*
* The index lists all terms that are related to a given node entity, and is
@@ -152,5 +157,5 @@ function taxonomy_delete_node_index(EntityInterface $node): void {
}
/**
- * @} End of "defgroup taxonomy_index".
+ * @} End of "addtogroup taxonomy_index".
*/
diff --git a/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeTest.php b/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeTest.php
index 1d9654dd5050..511778daf200 100644
--- a/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeTest.php
+++ b/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeTest.php
@@ -10,6 +10,7 @@ use Drupal\node\Entity\Node;
/**
* Upgrade taxonomy term node associations.
*
+ * @group #slow
* @group migrate_drupal_6
*/
class MigrateTermNodeTest extends MigrateDrupal6TestBase {
diff --git a/core/modules/workflows/src/Plugin/WorkflowTypeBase.php b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
index 47488b38801b..e86b77a22857 100644
--- a/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
+++ b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
@@ -2,7 +2,7 @@
namespace Drupal\workflows\Plugin;
-use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
use Drupal\Core\Plugin\PluginWithFormsTrait;
use Drupal\workflows\State;
use Drupal\workflows\StateInterface;
@@ -16,7 +16,7 @@ use Drupal\workflows\WorkflowTypeInterface;
*
* @see \Drupal\workflows\Annotation\WorkflowType
*/
-abstract class WorkflowTypeBase extends PluginBase implements WorkflowTypeInterface {
+abstract class WorkflowTypeBase extends ConfigurablePluginBase implements WorkflowTypeInterface {
use PluginWithFormsTrait;
@@ -28,14 +28,6 @@ abstract class WorkflowTypeBase extends PluginBase implements WorkflowTypeInterf
/**
* {@inheritdoc}
*/
- public function __construct(array $configuration, $plugin_id, $plugin_definition) {
- parent::__construct($configuration, $plugin_id, $plugin_definition);
- $this->setConfiguration($configuration);
- }
-
- /**
- * {@inheritdoc}
- */
public function label() {
$definition = $this->getPluginDefinition();
// The label can be an object.
@@ -60,15 +52,9 @@ abstract class WorkflowTypeBase extends PluginBase implements WorkflowTypeInterf
/**
* {@inheritdoc}
*/
- public function getConfiguration() {
- return $this->configuration;
- }
-
- /**
- * {@inheritdoc}
- */
public function setConfiguration(array $configuration) {
$this->configuration = $configuration + $this->defaultConfiguration();
+ return $this;
}
/**
diff --git a/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php b/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php
index e46fbcf417bf..180edc868f60 100644
--- a/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php
+++ b/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php
@@ -124,6 +124,8 @@ class WorkflowAccessControlHandlerTest extends KernelTestBase {
* An array of test data.
*/
public static function checkAccessProvider() {
+ $originalContainer = \Drupal::hasContainer() ? \Drupal::getContainer() : NULL;
+
$container = new ContainerBuilder();
$cache_contexts_manager = (new Prophet())->prophesize(CacheContextsManager::class);
$cache_contexts_manager->assertValidTokens()->willReturn(TRUE);
@@ -131,7 +133,7 @@ class WorkflowAccessControlHandlerTest extends KernelTestBase {
$container->set('cache_contexts_manager', $cache_contexts_manager);
\Drupal::setContainer($container);
- return [
+ $data = [
'Admin view' => [
'adminUser',
'view',
@@ -275,6 +277,13 @@ class WorkflowAccessControlHandlerTest extends KernelTestBase {
AccessResult::allowed()->addCacheContexts(['user.permissions']),
],
];
+
+ // Restore the original container if needed.
+ if ($originalContainer) {
+ \Drupal::setContainer($originalContainer);
+ }
+
+ return $data;
}
}
diff --git a/core/phpunit.xml.dist b/core/phpunit.xml.dist
index c858081cad26..7d2c8c163cf2 100644
--- a/core/phpunit.xml.dist
+++ b/core/phpunit.xml.dist
@@ -91,9 +91,9 @@
<directory>modules/**/tests/src/Unit</directory>
<directory>profiles/**/tests/src/Unit</directory>
<directory>themes/**/tests/src/Unit</directory>
- <directory>../modules/**/tests/src/Unit</directory>
- <directory>../profiles/**/tests/src/Unit</directory>
- <directory>../themes/**/tests/src/Unit</directory>
+ <directory>../modules/*/**/tests/src/Unit</directory>
+ <directory>../profiles/*/**/tests/src/Unit</directory>
+ <directory>../themes/*/**/tests/src/Unit</directory>
</testsuite>
<testsuite name="kernel">
<directory>tests/Drupal/KernelTests</directory>
@@ -101,9 +101,9 @@
<directory>recipes/*/tests/src/Kernel</directory>
<directory>profiles/**/tests/src/Kernel</directory>
<directory>themes/**/tests/src/Kernel</directory>
- <directory>../modules/**/tests/src/Kernel</directory>
- <directory>../profiles/**/tests/src/Kernel</directory>
- <directory>../themes/**/tests/src/Kernel</directory>
+ <directory>../modules/*/**/tests/src/Kernel</directory>
+ <directory>../profiles/*/**/tests/src/Kernel</directory>
+ <directory>../themes/*/**/tests/src/Kernel</directory>
<!-- @todo remove line(s) below once PHPUnit 10 is no longer used; they
are redundant in PHPUnit 11+ that fully implements globstar (**)
pattern.
@@ -117,9 +117,9 @@
<directory>profiles/**/tests/src/Functional</directory>
<directory>recipes/*/tests/src/Functional</directory>
<directory>themes/**/tests/src/Functional</directory>
- <directory>../modules/**/tests/src/Functional</directory>
- <directory>../profiles/**/tests/src/Functional</directory>
- <directory>../themes/**/tests/src/Functional</directory>
+ <directory>../modules/*/**/tests/src/Functional</directory>
+ <directory>../profiles/*/**/tests/src/Functional</directory>
+ <directory>../themes/*/**/tests/src/Functional</directory>
<!-- @todo remove line(s) below once PHPUnit 10 is no longer used; they
are redundant in PHPUnit 11+ that fully implements globstar (**)
pattern.
@@ -136,13 +136,14 @@
<directory>recipes/*/tests/src/FunctionalJavascript</directory>
<directory>profiles/**/tests/src/FunctionalJavascript</directory>
<directory>themes/**/tests/src/FunctionalJavascript</directory>
- <directory>../modules/**/tests/src/FunctionalJavascript</directory>
- <directory>../profiles/**/tests/src/FunctionalJavascript</directory>
- <directory>../themes/**/tests/src/FunctionalJavascript</directory>
+ <directory>../modules/*/**/tests/src/FunctionalJavascript</directory>
+ <directory>../profiles/*/**/tests/src/FunctionalJavascript</directory>
+ <directory>../themes/*/**/tests/src/FunctionalJavascript</directory>
</testsuite>
<testsuite name="build">
<directory>tests/Drupal/BuildTests</directory>
<directory>modules/**/tests/src/Build</directory>
+ <directory>../modules/*/**/tests/src/Build</directory>
</testsuite>
</testsuites>
<!-- Settings for coverage reports. -->
diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh
index 4545a00cc3ac..96f16eed9c71 100755
--- a/core/scripts/run-tests.sh
+++ b/core/scripts/run-tests.sh
@@ -17,14 +17,13 @@ use Drupal\Component\Utility\Timer;
use Drupal\Core\Composer\Composer;
use Drupal\Core\Database\Database;
use Drupal\Core\Test\EnvironmentCleaner;
+use Drupal\Core\Test\PhpUnitTestDiscovery;
use Drupal\Core\Test\PhpUnitTestRunner;
use Drupal\Core\Test\SimpletestTestRunResultsStorage;
-use Drupal\Core\Test\RunTests\TestFileParser;
use Drupal\Core\Test\TestDatabase;
use Drupal\Core\Test\TestRun;
use Drupal\Core\Test\TestRunnerKernel;
use Drupal\Core\Test\TestRunResultsStorageInterface;
-use Drupal\Core\Test\TestDiscovery;
use Drupal\BuildTests\Framework\BuildTestBase;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\KernelTests\KernelTestBase;
@@ -49,6 +48,10 @@ const SIMPLETEST_SCRIPT_COLOR_EXCEPTION = 33;
const SIMPLETEST_SCRIPT_COLOR_YELLOW = 33;
// A refreshing cyan.
const SIMPLETEST_SCRIPT_COLOR_CYAN = 36;
+// A fainting gray.
+const SIMPLETEST_SCRIPT_COLOR_GRAY = 90;
+// A notable white.
+const SIMPLETEST_SCRIPT_COLOR_BRIGHT_WHITE = "1;97";
// Restricting the chunk of queries prevents memory exhaustion.
const SIMPLETEST_SCRIPT_SQLITE_VARIABLE_LIMIT = 350;
@@ -86,12 +89,12 @@ if ($args['list']) {
// Display all available tests organized by one @group annotation.
echo "\nAvailable test groups & classes\n";
echo "-------------------------------\n\n";
- $test_discovery = new TestDiscovery(
- \Drupal::root(),
- \Drupal::service('class_loader')
- );
+ $test_discovery = new PhpUnitTestDiscovery(\Drupal::root() . \DIRECTORY_SEPARATOR . 'core');
try {
$groups = $test_discovery->getTestClasses($args['module']);
+ foreach ($test_discovery->getWarnings() as $warning) {
+ simpletest_script_print($warning . "\n", SIMPLETEST_SCRIPT_COLOR_EXCEPTION);
+ }
}
catch (Exception $e) {
error_log((string) $e);
@@ -119,11 +122,8 @@ if ($args['list']) {
// @see https://www.drupal.org/node/2569585
if ($args['list-files'] || $args['list-files-json']) {
// List all files which could be run as tests.
- $test_discovery = new TestDiscovery(
- \Drupal::root(),
- \Drupal::service('class_loader')
- );
- // TestDiscovery::findAllClassFiles() gives us a classmap similar to a
+ $test_discovery = new PhpUnitTestDiscovery(\Drupal::root() . \DIRECTORY_SEPARATOR . 'core');
+ // PhpUnitTestDiscovery::findAllClassFiles() gives us a classmap similar to a
// Composer 'classmap' array.
$test_classes = $test_discovery->findAllClassFiles();
// JSON output is the easiest.
@@ -177,6 +177,15 @@ if (!Composer::upgradePHPUnitCheck(Version::id())) {
exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
}
+echo "\n";
+echo "Drupal test run\n\n";
+echo sprintf("Drupal Version: %s\n", \Drupal::VERSION);
+echo sprintf("PHP Version: %s\n", \PHP_VERSION);
+echo sprintf("PHP Binary: %s\n", $php ?? getenv('_'));
+echo sprintf("PHPUnit Version: %s\n", Version::id());
+echo "-------------------------------\n";
+echo "\n";
+
$test_list = simpletest_script_get_test_list();
// Try to allocate unlimited time to run the tests.
@@ -355,6 +364,11 @@ All arguments are long options.
The index of the job in the job set.
+ --debug-discovery
+
+ If provided, dumps detailed information on the tests selected
+ for execution, before the execution starts.
+
<test1>[,<test2>[,<test3> ...]]
One or more tests to be run. By default, these are interpreted
@@ -427,6 +441,7 @@ function simpletest_script_parse_args() {
'non-html' => FALSE,
'ci-parallel-node-index' => 1,
'ci-parallel-node-total' => 1,
+ 'debug-discovery' => FALSE,
];
// Override with set values.
@@ -919,17 +934,15 @@ function simpletest_script_command(TestRun $test_run, string $test_class): array
function simpletest_script_get_test_list() {
global $args;
- $test_discovery = new TestDiscovery(
- \Drupal::root(),
- \Drupal::service('class_loader')
- );
- $types_processed = empty($args['types']);
+ $test_discovery = new PhpUnitTestDiscovery(\Drupal::root() . \DIRECTORY_SEPARATOR . 'core');
$test_list = [];
$slow_tests = [];
if ($args['all'] || $args['module'] || $args['directory']) {
try {
$groups = $test_discovery->getTestClasses($args['module'], $args['types'], $args['directory']);
- $types_processed = TRUE;
+ foreach ($test_discovery->getWarnings() as $warning) {
+ simpletest_script_print($warning . "\n", SIMPLETEST_SCRIPT_COLOR_EXCEPTION);
+ }
}
catch (Exception $e) {
echo (string) $e;
@@ -938,30 +951,34 @@ function simpletest_script_get_test_list() {
// Ensure that tests marked explicitly as @group #slow are run at the
// beginning of each job.
if (key($groups) === '#slow') {
- $slow_tests = array_keys(array_shift($groups));
+ $slow_tests = array_shift($groups);
}
$not_slow_tests = [];
foreach ($groups as $group => $tests) {
- $not_slow_tests = array_merge($not_slow_tests, array_keys($tests));
+ $not_slow_tests = array_merge($not_slow_tests, $tests);
}
// Filter slow tests out of the not slow tests and ensure a unique list
// since tests may appear in more than one group.
- $not_slow_tests = array_unique(array_diff($not_slow_tests, $slow_tests));
+ $not_slow_tests = array_diff_key($not_slow_tests, $slow_tests);
// If the tests are not being run in parallel, then ensure slow tests run
// all together first.
if ((int) $args['ci-parallel-node-total'] <= 1 ) {
sort_tests_by_type_and_methods($slow_tests);
sort_tests_by_type_and_methods($not_slow_tests);
- $test_list = array_merge($slow_tests, $not_slow_tests);
+ $all_tests_list = array_merge($slow_tests, $not_slow_tests);
+ assign_tests_sequence($all_tests_list);
+ dump_tests_sequence($all_tests_list, $args);
+ $test_list = array_keys($all_tests_list);
}
else {
- // Sort all tests by the number of public methods on the test class.
- // This is a proxy for the approximate time taken to run the test,
- // which is used in combination with @group #slow to start the slowest tests
- // first and distribute tests between test runners.
+ // Sort all tests by the number of test cases on the test class.
+ // This is used in combination with @group #slow to start the slowest
+ // tests first and distribute tests between test runners.
sort_tests_by_public_method_count($slow_tests);
sort_tests_by_public_method_count($not_slow_tests);
+ $all_tests_list = array_merge($slow_tests, $not_slow_tests);
+ assign_tests_sequence($all_tests_list);
// Now set up a bin per test runner.
$bin_count = (int) $args['ci-parallel-node-total'];
@@ -975,6 +992,8 @@ function simpletest_script_get_test_list() {
$binned_other_tests = place_tests_into_bins($not_slow_tests, $bin_count);
$other_tests_for_job = $binned_other_tests[$args['ci-parallel-node-index'] - 1];
$test_list = array_merge($slow_tests_for_job, $other_tests_for_job);
+ dump_bin_tests_sequence($args['ci-parallel-node-index'], $all_tests_list, $test_list, $args);
+ $test_list = array_keys($test_list);
}
}
else {
@@ -988,6 +1007,9 @@ function simpletest_script_get_test_list() {
else {
try {
$groups = $test_discovery->getTestClasses(NULL, $args['types']);
+ foreach ($test_discovery->getWarnings() as $warning) {
+ simpletest_script_print($warning . "\n", SIMPLETEST_SCRIPT_COLOR_EXCEPTION);
+ }
}
catch (Exception $e) {
echo (string) $e;
@@ -1005,19 +1027,24 @@ function simpletest_script_get_test_list() {
}
elseif ($args['file']) {
// Extract test case class names from specified files.
- $parser = new TestFileParser();
foreach ($args['test_names'] as $file) {
- if (!file_exists($file)) {
+ if (!file_exists($file) || is_dir($file)) {
simpletest_script_print_error('File not found: ' . $file);
exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
}
- $test_list = array_merge($test_list, $parser->getTestListFromFile($file));
+ $fileTests = current($test_discovery->getTestClasses(NULL, [], $file));
+ $test_list = array_merge($test_list, $fileTests);
}
+ assign_tests_sequence($test_list);
+ dump_tests_sequence($test_list, $args);
+ $test_list = array_keys($test_list);
}
else {
try {
$groups = $test_discovery->getTestClasses(NULL, $args['types']);
- $types_processed = TRUE;
+ foreach ($test_discovery->getWarnings() as $warning) {
+ simpletest_script_print($warning . "\n", SIMPLETEST_SCRIPT_COLOR_EXCEPTION);
+ }
}
catch (Exception $e) {
echo (string) $e;
@@ -1034,22 +1061,15 @@ function simpletest_script_get_test_list() {
}
// Merge the tests from the groups together.
foreach ($args['test_names'] as $group_name) {
- $test_list = array_merge($test_list, array_keys($groups[$group_name]));
+ $test_list = array_merge($test_list, $groups[$group_name]);
}
+ assign_tests_sequence($test_list);
+ dump_tests_sequence($test_list, $args);
// Ensure our list of tests contains only one entry for each test.
- $test_list = array_unique($test_list);
+ $test_list = array_keys($test_list);
}
}
- // If the test list creation does not automatically limit by test type then
- // we need to do so here.
- if (!$types_processed) {
- $test_list = array_filter($test_list, function ($test_class) use ($args) {
- $test_info = TestDiscovery::getTestInfo($test_class);
- return in_array($test_info['type'], $args['types'], TRUE);
- });
- }
-
if (empty($test_list)) {
simpletest_script_print_error('No valid tests were specified.');
exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
@@ -1062,11 +1082,11 @@ function simpletest_script_get_test_list() {
* Sort tests by test type and number of public methods.
*/
function sort_tests_by_type_and_methods(array &$tests): void {
- usort($tests, function ($a, $b) {
- if (get_test_type_weight($a) === get_test_type_weight($b)) {
- return get_test_class_method_count($b) <=> get_test_class_method_count($a);
+ uasort($tests, function ($a, $b) {
+ if (get_test_type_weight($a['name']) === get_test_type_weight($b['name'])) {
+ return $b['tests_count'] <=> $a['tests_count'];
}
- return get_test_type_weight($b) <=> get_test_type_weight($a);
+ return get_test_type_weight($b['name']) <=> get_test_type_weight($a['name']);
});
}
@@ -1083,8 +1103,8 @@ function sort_tests_by_type_and_methods(array &$tests): void {
* An array of test class names.
*/
function sort_tests_by_public_method_count(array &$tests): void {
- usort($tests, function ($a, $b) {
- return get_test_class_method_count($b) <=> get_test_class_method_count($a);
+ uasort($tests, function ($a, $b) {
+ return $b['tests_count'] <=> $a['tests_count'];
});
}
@@ -1105,28 +1125,46 @@ function get_test_type_weight(string $class): int {
}
/**
- * Get an approximate test method count for a test class.
+ * Assigns the test sequence.
*
- * @param string $class
- * The test class name.
+ * @param array $tests
+ * The array of test class info.
*/
-function get_test_class_method_count(string $class): int {
- $reflection = new \ReflectionClass($class);
- $count = 0;
- foreach ($reflection->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
- // If a method uses a dataProvider, increase the count by 20 since data
- // providers result in a single method running multiple times.
- $comments = $method->getDocComment();
- preg_match_all('#@(.*?)\n#s', $comments, $annotations);
- foreach ($annotations[1] as $annotation) {
- if (str_starts_with($annotation, 'dataProvider')) {
- $count = $count + 20;
- continue;
- }
- }
- $count++;
+function assign_tests_sequence(array &$tests): void {
+ $i = 0;
+ foreach ($tests as &$testInfo) {
+ $testInfo['sequence'] = ++$i;
}
- return $count;
+}
+
+/**
+ * Dumps the list of tests in order of execution after sorting.
+ *
+ * @param array $tests
+ * The array of test class info.
+ * @param array $args
+ * The command line arguments.
+ */
+function dump_tests_sequence(array $tests, array $args): void {
+ if ($args['debug-discovery'] === FALSE) {
+ return;
+ }
+ echo "Test execution sequence\n";
+ echo "-----------------------\n\n";
+ echo " Seq Slow? Group Cnt Class\n";
+ echo "-----------------------------------------\n";
+ $i = 0;
+ foreach ($tests as $testInfo) {
+ echo sprintf(
+ "%4d %5s %15s %4d %s\n",
+ $testInfo['sequence'],
+ in_array('#slow', $testInfo['groups']) ? '#slow' : '',
+ trim_with_ellipsis($testInfo['group'], 15, \STR_PAD_RIGHT),
+ $testInfo['tests_count'],
+ trim_with_ellipsis($testInfo['name'], 60, \STR_PAD_LEFT),
+ );
+ }
+ echo "-----------------------------------------\n\n";
}
/**
@@ -1149,13 +1187,51 @@ function place_tests_into_bins(array $tests, int $bin_count) {
// Create a bin corresponding to each parallel test job.
$bins = array_fill(0, $bin_count, []);
// Go through each test and add them to one bin at a time.
+ $i = 0;
foreach ($tests as $key => $test) {
- $bins[($key % $bin_count)][] = $test;
+ $bins[($i++ % $bin_count)][$key] = $test;
}
return $bins;
}
/**
+ * Dumps the list of tests in order of execution for a bin.
+ *
+ * @param int $bin
+ * The bin.
+ * @param array $allTests
+ * The list of all test classes discovered.
+ * @param array $tests
+ * The list of test class to run for this bin.
+ * @param array $args
+ * The command line arguments.
+ */
+function dump_bin_tests_sequence(int $bin, array $allTests, array $tests, array $args): void {
+ if ($args['debug-discovery'] === FALSE) {
+ return;
+ }
+ echo "Test execution sequence. ";
+ echo "Tests marked *** will be executed in this PARALLEL BIN #{$bin}.\n";
+ echo "-------------------------------------------------------------------------------------\n\n";
+ echo "Bin Seq Slow? Group Cnt Class\n";
+ echo "--------------------------------------------\n";
+ foreach ($allTests as $testInfo) {
+ $inBin = isset($tests[$testInfo['name']]);
+ $message = sprintf(
+ "%s %4d %5s %15s %4d %s\n",
+ $inBin ? "***" : " ",
+ $testInfo['sequence'],
+ in_array('#slow', $testInfo['groups']) ? '#slow' : '',
+ trim_with_ellipsis($testInfo['group'], 15, \STR_PAD_RIGHT),
+ $testInfo['tests_count'],
+ trim_with_ellipsis($testInfo['name'], 60, \STR_PAD_LEFT),
+ );
+ simpletest_script_print($message, $inBin ? SIMPLETEST_SCRIPT_COLOR_BRIGHT_WHITE : SIMPLETEST_SCRIPT_COLOR_GRAY);
+ }
+ echo "-------------------------------------------------\n\n";
+}
+
+/**
* Initialize the reporter.
*/
function simpletest_script_reporter_init(): void {
@@ -1170,12 +1246,6 @@ function simpletest_script_reporter_init(): void {
'debug' => 'Log',
];
- echo "\n";
- echo "Drupal test run\n";
- echo "Using PHP Binary: $php\n";
- echo "---------------\n";
- echo "\n";
-
// Tell the user about what tests are to be run.
if ($args['all']) {
echo "All tests will run.\n\n";
@@ -1378,7 +1448,7 @@ function simpletest_script_reporter_display_results(TestRunResultsStorageInterfa
function simpletest_script_format_result($result): void {
global $args, $results_map, $color;
- $summary = sprintf("%-9.9s %9.3fs %-80.80s\n", $results_map[$result->status], $result->time, trim_with_ellipsis($result->function, 80, STR_PAD_LEFT));
+ $summary = sprintf("%-9.9s %9.3fs %s\n", $results_map[$result->status], $result->time, trim_with_ellipsis($result->function, 80, STR_PAD_LEFT));
simpletest_script_print($summary, simpletest_script_color_code($result->status));
@@ -1540,12 +1610,12 @@ function simpletest_script_load_messages_by_test_id(TestRunResultsStorageInterfa
*/
function trim_with_ellipsis(string $input, int $length, int $side): string {
if (strlen($input) < $length) {
- return str_pad($input, $length, ' ', STR_PAD_RIGHT);
+ return str_pad($input, $length, ' ', \STR_PAD_RIGHT);
}
elseif (strlen($input) > $length) {
return match($side) {
- STR_PAD_RIGHT => substr($input, 0, $length - 3) . '...',
- default => '...' . substr($input, -$length + 3),
+ \STR_PAD_RIGHT => substr($input, 0, $length - 1) . '…',
+ default => '…' . substr($input, -$length + 1),
};
}
return $input;
diff --git a/core/tests/Drupal/KernelTests/Core/Database/DriverSpecificSchemaTestBase.php b/core/tests/Drupal/KernelTests/Core/Database/DriverSpecificSchemaTestBase.php
index ca5fb32936b5..a3b46ab67e12 100644
--- a/core/tests/Drupal/KernelTests/Core/Database/DriverSpecificSchemaTestBase.php
+++ b/core/tests/Drupal/KernelTests/Core/Database/DriverSpecificSchemaTestBase.php
@@ -272,6 +272,16 @@ abstract class DriverSpecificSchemaTestBase extends DriverSpecificKernelTestBase
// Test the primary key columns.
$this->assertSame(['test_serial', 'test_composite_primary_key'], $method->invoke($this->schema, 'test_table'));
+ // Test adding and removing JSON column.
+ $this->schema->addField('test_table', 'test_json', [
+ 'description' => 'I heard you liked JSON.',
+ 'type' => 'json',
+ 'pgsql_type' => 'jsonb',
+ 'mysql_type' => 'json',
+ 'sqlite_type' => 'json',
+ ]);
+ $this->schema->dropField('test_table', 'test_json');
+
// Test renaming of keys and constraints.
$this->schema->dropTable('test_table');
$table_specification = [
diff --git a/core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiFindAllClassFilesTest.php b/core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiFindAllClassFilesTest.php
new file mode 100644
index 000000000000..2afb26f1b9e0
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiFindAllClassFilesTest.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\KernelTests\Core\Test;
+
+use Drupal\Core\Test\PhpUnitTestDiscovery;
+use Drupal\Core\Test\TestDiscovery;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\IgnoreDeprecations;
+
+/**
+ * Tests ::findAllClassFiles() between TestDiscovery and PhpUnitTestDiscovery.
+ *
+ * PhpUnitTestDiscovery uses PHPUnit API to build the list of test classes,
+ * while TestDiscovery uses Drupal legacy code.
+ */
+#[CoversClass(PhpUnitTestDiscovery::class)]
+#[Group('TestSuites')]
+#[Group('Test')]
+#[Group('#slow')]
+class PhpUnitApiFindAllClassFilesTest extends KernelTestBase {
+
+ /**
+ * Checks that Drupal legacy and PHPUnit API based discoveries are equal.
+ */
+ #[DataProvider('argumentsProvider')]
+ #[IgnoreDeprecations]
+ public function testEquality(?string $extension = NULL, ?string $directory = NULL): void {
+ // PHPUnit discovery.
+ $configurationFilePath = $this->container->getParameter('app.root') . \DIRECTORY_SEPARATOR . 'core';
+ // @todo once PHPUnit 10 is no longer used, remove the condition.
+ // @see https://www.drupal.org/project/drupal/issues/3497116
+ if (RunnerVersion::getMajor() >= 11) {
+ $configurationFilePath .= \DIRECTORY_SEPARATOR . '.phpunit-next.xml';
+ }
+ $phpUnitTestDiscovery = new PhpUnitTestDiscovery($configurationFilePath);
+ $phpUnitList = $phpUnitTestDiscovery->findAllClassFiles($extension, $directory);
+
+ // Legacy TestDiscovery.
+ $testDiscovery = new TestDiscovery(
+ $this->container->getParameter('app.root'),
+ $this->container->get('class_loader')
+ );
+ $internalList = $testDiscovery->findAllClassFiles($extension, $directory);
+
+ // Downgrade results to make them comparable, working around bugs and
+ // additions.
+ // 1. TestDiscovery discovers non-test classes that PHPUnit does not.
+ $internalList = array_intersect_key($internalList, $phpUnitList);
+
+ $this->assertEquals($internalList, $phpUnitList);
+ }
+
+ /**
+ * Provides test data to ::testEquality.
+ */
+ public static function argumentsProvider(): \Generator {
+ yield 'All tests' => [];
+ yield 'Extension: system' => ['extension' => 'system'];
+ yield 'Extension: system, directory' => [
+ 'extension' => 'system',
+ 'directory' => 'core/modules/system/tests/src',
+ ];
+ }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiGetTestClassesTest.php b/core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiGetTestClassesTest.php
new file mode 100644
index 000000000000..81cdfc9c6c5f
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Test/PhpUnitApiGetTestClassesTest.php
@@ -0,0 +1,108 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\KernelTests\Core\Test;
+
+use Drupal\Core\Test\PhpUnitTestDiscovery;
+use Drupal\Core\Test\TestDiscovery;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\IgnoreDeprecations;
+
+/**
+ * Tests ::getTestClasses() between TestDiscovery and PhpPUnitTestDiscovery.
+ *
+ * PhpPUnitTestDiscovery uses PHPUnit API to build the list of test classes,
+ * while TestDiscovery uses Drupal legacy code.
+ */
+#[CoversClass(PhpUnitTestDiscovery::class)]
+#[Group('TestSuites')]
+#[Group('Test')]
+#[Group('#slow')]
+class PhpUnitApiGetTestClassesTest extends KernelTestBase {
+
+ /**
+ * Checks that Drupal legacy and PHPUnit API based discoveries are equal.
+ */
+ #[DataProvider('argumentsProvider')]
+ #[IgnoreDeprecations]
+ public function testEquality(array $suites, ?string $extension = NULL, ?string $directory = NULL): void {
+ // PHPUnit discovery.
+ $configurationFilePath = $this->container->getParameter('app.root') . \DIRECTORY_SEPARATOR . 'core';
+ // @todo once PHPUnit 10 is no longer used, remove the condition.
+ // @see https://www.drupal.org/project/drupal/issues/3497116
+ if (RunnerVersion::getMajor() >= 11) {
+ $configurationFilePath .= \DIRECTORY_SEPARATOR . '.phpunit-next.xml';
+ }
+ $phpUnitTestDiscovery = new PhpUnitTestDiscovery($configurationFilePath);
+ $phpUnitList = $phpUnitTestDiscovery->getTestClasses($extension, $suites, $directory);
+
+ // Legacy TestDiscovery.
+ $testDiscovery = new TestDiscovery(
+ $this->container->getParameter('app.root'),
+ $this->container->get('class_loader')
+ );
+ $internalList = $testDiscovery->getTestClasses($extension, $suites, $directory);
+
+ // Downgrade results to make them comparable, working around bugs and
+ // additions.
+ // 1. Remove TestDiscovery empty groups.
+ $internalList = array_filter($internalList);
+ // 2. Remove TestDiscovery '##no-group-annotations' group.
+ unset($internalList['##no-group-annotations']);
+ // 3. Remove 'file' and 'tests_count' keys from PHPUnit results.
+ foreach ($phpUnitList as &$group) {
+ foreach ($group as &$testClass) {
+ unset($testClass['file']);
+ unset($testClass['tests_count']);
+ }
+ }
+ // 4. Remove from PHPUnit results groups not found by TestDiscovery.
+ $phpUnitList = array_intersect_key($phpUnitList, $internalList);
+ // 5. Remove from PHPUnit groups classes not found by TestDiscovery.
+ foreach ($phpUnitList as $groupName => &$group) {
+ $group = array_intersect_key($group, $internalList[$groupName]);
+ }
+ // 6. Remove from PHPUnit test classes groups not found by TestDiscovery.
+ foreach ($phpUnitList as $groupName => &$group) {
+ foreach ($group as $testClassName => &$testClass) {
+ $testClass['groups'] = array_intersect_key($testClass['groups'], $internalList[$groupName][$testClassName]['groups']);
+ }
+ }
+
+ $this->assertEquals($internalList, $phpUnitList);
+ }
+
+ /**
+ * Provides test data to ::testEquality.
+ */
+ public static function argumentsProvider(): \Generator {
+ yield 'All tests' => ['suites' => []];
+ yield 'Testsuite: functional-javascript' => ['suites' => ['PHPUnit-FunctionalJavascript']];
+ yield 'Testsuite: functional' => ['suites' => ['PHPUnit-Functional']];
+ yield 'Testsuite: kernel' => ['suites' => ['PHPUnit-Kernel']];
+ yield 'Testsuite: unit' => ['suites' => ['PHPUnit-Unit']];
+ yield 'Testsuite: unit-component' => ['suites' => ['PHPUnit-Unit-Component']];
+ yield 'Testsuite: build' => ['suites' => ['PHPUnit-Build']];
+ yield 'Extension: system' => ['suites' => [], 'extension' => 'system'];
+ yield 'Extension: system, testsuite: unit' => [
+ 'suites' => ['PHPUnit-Unit'],
+ 'extension' => 'system',
+ ];
+ yield 'Extension: system, directory' => [
+ 'suites' => [],
+ 'extension' => 'system',
+ 'directory' => 'core/modules/system/tests/src',
+ ];
+ yield 'Extension: system, testsuite: unit, directory' => [
+ 'suites' => ['PHPUnit-Unit'],
+ 'extension' => 'system',
+ 'directory' => 'core/modules/system/tests/src',
+ ];
+ }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Test/PhpUnitTestDiscoveryTest.php b/core/tests/Drupal/KernelTests/Core/Test/PhpUnitTestDiscoveryTest.php
index 705981f75079..345cc9282d2e 100644
--- a/core/tests/Drupal/KernelTests/Core/Test/PhpUnitTestDiscoveryTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Test/PhpUnitTestDiscoveryTest.php
@@ -7,8 +7,8 @@ namespace Drupal\KernelTests\Core\Test;
use Drupal\Core\Test\TestDiscovery;
use Drupal\KernelTests\KernelTestBase;
use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion;
-use PHPUnit\TextUI\Configuration\Builder;
-use PHPUnit\TextUI\Configuration\TestSuiteBuilder;
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\IgnoreDeprecations;
use Symfony\Component\Process\Process;
/**
@@ -22,11 +22,11 @@ use Symfony\Component\Process\Process;
* list thus generated, with the list generated by
* \Drupal\Core\Test\TestDiscovery, which is used by run-tests.sh, to ensure
* both methods will run the same tests,
- *
- * @group TestSuites
- * @group Test
- * @group #slow
*/
+#[Group('TestSuites')]
+#[Group('Test')]
+#[Group('#slow')]
+#[IgnoreDeprecations]
class PhpUnitTestDiscoveryTest extends KernelTestBase {
private const TEST_LIST_MISMATCH_MESSAGE =
@@ -76,11 +76,19 @@ class PhpUnitTestDiscoveryTest extends KernelTestBase {
$internalList = array_unique($internalList);
asort($internalList);
+ // Location of PHPUnit configuration file.
+ $configurationFilePath = $this->root . \DIRECTORY_SEPARATOR . 'core';
+ // @todo once PHPUnit 10 is no longer used, remove the condition.
+ // @see https://www.drupal.org/project/drupal/issues/3497116
+ if (RunnerVersion::getMajor() >= 11) {
+ $configurationFilePath .= \DIRECTORY_SEPARATOR . '.phpunit-next.xml';
+ }
+
// PHPUnit's test discovery - via CLI execution.
$process = new Process([
'vendor/bin/phpunit',
'--configuration',
- 'core',
+ $configurationFilePath,
'--list-tests-xml',
$this->xmlOutputFile,
], $this->root);
@@ -112,27 +120,6 @@ class PhpUnitTestDiscoveryTest extends KernelTestBase {
// Check against Drupal's discovery.
$this->assertEquals(implode("\n", $phpUnitClientList), implode("\n", $internalList), self::TEST_LIST_MISMATCH_MESSAGE);
-
- // @todo once PHPUnit 10 is no longer used re-enable the rest of the test.
- // @see https://www.drupal.org/project/drupal/issues/3497116
- if (RunnerVersion::getMajor() >= 11) {
- $this->markTestIncomplete('On PHPUnit 11+ the test triggers warnings due to phpunit.xml setup. Re-enable in https://www.drupal.org/project/drupal/issues/3497116.');
- }
-
- // PHPUnit's test discovery - via API.
- $phpUnitConfiguration = (new Builder())->build(['--configuration', 'core']);
- $phpUnitTestSuite = (new TestSuiteBuilder())->build($phpUnitConfiguration);
- $phpUnitApiList = [];
- foreach ($phpUnitTestSuite->tests() as $testSuite) {
- foreach ($testSuite->tests() as $test) {
- $phpUnitApiList[] = $test->name();
- }
- }
- asort($phpUnitApiList);
-
- // Check against Drupal's discovery.
- $this->assertEquals(implode("\n", $phpUnitApiList), implode("\n", $internalList), self::TEST_LIST_MISMATCH_MESSAGE);
-
}
}
diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
index 08fa2eceaf54..d0759a4bf082 100644
--- a/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
@@ -203,6 +203,8 @@ class LocalActionManagerTest extends UnitTestCase {
}
public static function getActionsForRouteProvider() {
+ $originalContainer = \Drupal::hasContainer() ? \Drupal::getContainer() : NULL;
+
$cache_contexts_manager = (new Prophet())->prophesize(CacheContextsManager::class);
$cache_contexts_manager->assertValidTokens(Argument::any())
->willReturn(TRUE);
@@ -384,6 +386,11 @@ class LocalActionManagerTest extends UnitTestCase {
],
];
+ // Restore the original container if needed.
+ if ($originalContainer) {
+ \Drupal::setContainer($originalContainer);
+ }
+
return $data;
}
diff --git a/core/tests/Drupal/Tests/Core/Plugin/ConfigurablePluginBaseTest.php b/core/tests/Drupal/Tests/Core/Plugin/ConfigurablePluginBaseTest.php
new file mode 100644
index 000000000000..d05413eb444e
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Plugin/ConfigurablePluginBaseTest.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\Core\Plugin;
+
+use Drupal\Core\Plugin\ConfigurablePluginBase;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Tests ConfigurablePluginBase.
+ *
+ * @group Plugin
+ *
+ * @coversDefaultClass \Drupal\Core\Plugin\ConfigurablePluginBase
+ */
+class ConfigurablePluginBaseTest extends TestCase {
+
+ /**
+ * Tests the Constructor.
+ */
+ public function testConstructor(): void {
+ $provided_configuration = [
+ 'foo' => 'bar',
+ ];
+ $merged_configuration = ['default' => 'default'] + $provided_configuration;
+ $plugin = new ConfigurablePluginBaseTestClass($provided_configuration, '', []);
+ $this->assertSame($merged_configuration, $plugin->getConfiguration());
+ }
+
+}
+
+/**
+ * Test class for ConfigurablePluginBase.
+ */
+class ConfigurablePluginBaseTestClass extends ConfigurablePluginBase {
+
+ /**
+ * {@inheritdoc}
+ */
+ public function defaultConfiguration(): array {
+ return [
+ 'default' => 'default',
+ ];
+ }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Plugin/ConfigurableTraitTest.php b/core/tests/Drupal/Tests/Core/Plugin/ConfigurableTraitTest.php
new file mode 100644
index 000000000000..21543658769c
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Plugin/ConfigurableTraitTest.php
@@ -0,0 +1,205 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\Core\Plugin;
+
+use Drupal\Component\Plugin\ConfigurableInterface;
+use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurableTrait;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Tests for ConfigurableTrait.
+ *
+ * @group Plugin
+ *
+ * @coversDefaultClass \Drupal\Core\Plugin\ConfigurableTrait
+ */
+class ConfigurableTraitTest extends TestCase {
+
+ /**
+ * Tests ConfigurableTrait::defaultConfiguration.
+ *
+ * @covers ::defaultConfiguration
+ */
+ public function testDefaultConfiguration(): void {
+ /** @var \Drupal\Component\Plugin\ConfigurableInterface $configurable_plugin */
+ $configurable_plugin = new ConfigurableTestClass();
+ $this->assertSame([], $configurable_plugin->defaultConfiguration());
+ }
+
+ /**
+ * Tests ConfigurableTrait::getConfiguration.
+ *
+ * @covers ::getConfiguration
+ */
+ public function testGetConfiguration(): void {
+ $test_configuration = [
+ 'config_key_1' => 'config_value_1',
+ 'config_key_2' => [
+ 'nested_key_1' => 'nested_value_1',
+ 'nested_key_2' => 'nested_value_2',
+ ],
+ ];
+ $configurable_plugin = new ConfigurableTestClass($test_configuration);
+ $this->assertSame($test_configuration, $configurable_plugin->getConfiguration());
+ }
+
+ /**
+ * Tests configurableTrait::setConfiguration.
+ *
+ * Specifically test the way default and provided configurations are merged.
+ *
+ * @param array $default_configuration
+ * The default configuration to use for the trait.
+ * @param array $test_configuration
+ * The configuration to test.
+ * @param array $final_configuration
+ * The expected final plugin configuration.
+ *
+ * @covers ::setConfiguration
+ *
+ * @dataProvider setConfigurationDataProvider
+ */
+ public function testSetConfiguration(array $default_configuration, array $test_configuration, array $final_configuration): void {
+ $test_object = new ConfigurableTestClass();
+ $test_object->setDefaultConfiguration($default_configuration);
+ $test_object->setConfiguration($test_configuration);
+ $this->assertSame($final_configuration, $test_object->getConfiguration());
+ }
+
+ /**
+ * Provides data for testSetConfiguration.
+ *
+ * @return array
+ * The data.
+ */
+ public static function setConfigurationDataProvider(): array {
+ return [
+ 'Direct Override' => [
+ 'default_configuration' => [
+ 'default_key_1' => 'default_value_1',
+ 'default_key_2' => [
+ 'default_nested_key_1' => 'default_nested_value_1',
+ 'default_nested_key_2' => 'default_nested_value_2',
+ ],
+ ],
+ 'test_configuration' => [
+ 'default_key_1' => 'override_value_1',
+ 'default_key_2' => [
+ 'default_nested_key_1' => 'override_nested_value_1',
+ 'default_nested_key_2' => 'override_nested_value_2',
+ ],
+ ],
+ 'final_configuration' => [
+ 'default_key_1' => 'override_value_1',
+ 'default_key_2' => [
+ 'default_nested_key_1' => 'override_nested_value_1',
+ 'default_nested_key_2' => 'override_nested_value_2',
+ ],
+ ],
+ ],
+ 'Mixed Override' => [
+ 'default_configuration' => [
+ 'default_key_1' => 'default_value_1',
+ 'default_key_2' => [
+ 'default_nested_key_1' => 'default_nested_value_1',
+ 'default_nested_key_2' => 'default_nested_value_2',
+ ],
+ ],
+ 'test_configuration' => [
+ 'override_key_1' => 'config_value_1',
+ 'default_key_2' => [
+ 'default_nested_key_1' => 'override_value_1',
+ 'override_nested_key' => 'override_value',
+ ],
+ ],
+ 'final_configuration' => [
+ 'default_key_1' => 'default_value_1',
+ 'default_key_2' => [
+ 'default_nested_key_1' => 'override_value_1',
+ 'default_nested_key_2' => 'default_nested_value_2',
+ 'override_nested_key' => 'override_value',
+ ],
+ 'override_key_1' => 'config_value_1',
+ ],
+ ],
+ 'indexed_override' => [
+ 'default_configuration' => [
+ 'config_value_1',
+ 'config_value_2',
+ 'config_value_3',
+ ],
+ 'test_configuration' => [
+ 'override_value_1',
+ 'override_value_2',
+ ],
+ 'final_configuration' => [
+ 'override_value_1',
+ 'override_value_2',
+ 'config_value_3',
+ ],
+ ],
+ 'indexed_override_complex' => [
+ 'default_configuration' => [
+ 'config_value_1',
+ 'config_value_2',
+ 'config_value_3',
+ ],
+ 'test_configuration' => [
+ 0 => 'override_value_1',
+ 2 => 'override_value_3',
+ ],
+ 'final_configuration' => [
+ 'override_value_1',
+ 'config_value_2',
+ 'override_value_3',
+ ],
+ ],
+ ];
+ }
+
+}
+
+/**
+ * A test class using ConfigurablePluginTrait that can modify the de.
+ */
+class ConfigurableTestClass extends PluginBase implements ConfigurableInterface {
+ use ConfigurableTrait {
+ defaultConfiguration as traitDefaultConfiguration;
+ }
+
+ /**
+ * A default configuration for the test class to return.
+ *
+ * @var array|null
+ */
+ protected ?array $defaultConfiguration = NULL;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(array $configuration = [], string $plugin_id = '', array $plugin_definition = []) {
+ parent::__construct($configuration, $plugin_id, $plugin_definition);
+ $this->setConfiguration($configuration);
+ }
+
+ /**
+ * Sets the default configuration this test will return.
+ *
+ * @param array $default_configuration
+ * The default configuration to use.
+ */
+ public function setDefaultConfiguration(array $default_configuration): void {
+ $this->defaultConfiguration = $default_configuration;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function defaultConfiguration(): array {
+ return $this->defaultConfiguration ?? $this->traitDefaultConfiguration();
+ }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php b/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php
index 99da7a2f9741..60e147f434a5 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php
@@ -4,8 +4,7 @@ declare(strict_types=1);
namespace Drupal\Tests\Core\Plugin;
-use Drupal\Component\Plugin\ConfigurableInterface;
-use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
use Drupal\Core\Plugin\DefaultSingleLazyPluginCollection;
use PHPUnit\Framework\MockObject\Rule\InvocationOrder;
@@ -98,24 +97,5 @@ class DefaultSingleLazyPluginCollectionTest extends LazyPluginCollectionTestBase
/**
* Stub configurable plugin class for testing.
*/
-class ConfigurablePlugin extends PluginBase implements ConfigurableInterface {
-
- public function __construct(array $configuration, $plugin_id, $plugin_definition) {
- parent::__construct($configuration, $plugin_id, $plugin_definition);
-
- $this->configuration = $configuration + $this->defaultConfiguration();
- }
-
- public function defaultConfiguration() {
- return [];
- }
-
- public function getConfiguration() {
- return $this->configuration;
- }
-
- public function setConfiguration(array $configuration): void {
- $this->configuration = $configuration;
- }
-
+class ConfigurablePlugin extends ConfigurablePluginBase {
}
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php b/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
index 55695ace6de7..7b72a3df4530 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
@@ -4,35 +4,13 @@ declare(strict_types=1);
namespace Drupal\Tests\Core\Plugin\Fixtures;
-use Drupal\Component\Plugin\ConfigurableInterface;
use Drupal\Component\Plugin\DependentPluginInterface;
-use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
/**
* A configurable plugin implementation used for testing.
*/
-class TestConfigurablePlugin extends PluginBase implements ConfigurableInterface, DependentPluginInterface {
-
- /**
- * {@inheritdoc}
- */
- public function getConfiguration() {
- return $this->configuration;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setConfiguration(array $configuration) {
- $this->configuration = $configuration;
- }
-
- /**
- * {@inheritdoc}
- */
- public function defaultConfiguration() {
- return [];
- }
+class TestConfigurablePlugin extends ConfigurablePluginBase implements DependentPluginInterface {
/**
* {@inheritdoc}
diff --git a/core/tests/Drupal/Tests/Core/Test/RunTests/TestFileParserTest.php b/core/tests/Drupal/Tests/Core/Test/RunTests/TestFileParserTest.php
index 957b2f61f97b..9138d54523d6 100644
--- a/core/tests/Drupal/Tests/Core/Test/RunTests/TestFileParserTest.php
+++ b/core/tests/Drupal/Tests/Core/Test/RunTests/TestFileParserTest.php
@@ -6,12 +6,18 @@ namespace Drupal\Tests\Core\Test\RunTests;
use Drupal\Core\Test\RunTests\TestFileParser;
use Drupal\Tests\UnitTestCase;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\IgnoreDeprecations;
/**
- * @coversDefaultClass \Drupal\Core\Test\RunTests\TestFileParser
- * @group Test
- * @group RunTests
+ * Tests for the deprecated TestFileParser class.
*/
+#[CoversClass(TestFileParser::class)]
+#[Group('Test')]
+#[Group('RunTest')]
+#[IgnoreDeprecations]
class TestFileParserTest extends UnitTestCase {
public static function provideTestFileContents() {
@@ -66,9 +72,9 @@ COMPOUND
}
/**
- * @covers ::parseContents
- * @dataProvider provideTestFileContents
+ * @legacy-covers ::parseContents
*/
+ #[DataProvider('provideTestFileContents')]
public function testParseContents($expected, $contents): void {
$parser = new TestFileParser();
@@ -78,7 +84,7 @@ COMPOUND
}
/**
- * @covers ::getTestListFromFile
+ * @legacy-covers ::getTestListFromFile
*/
public function testGetTestListFromFile(): void {
$parser = new TestFileParser();
diff --git a/core/tests/Drupal/Tests/Core/Test/TestDiscoveryTest.php b/core/tests/Drupal/Tests/Core/Test/TestDiscoveryTest.php
index bfbb4ca2e40d..0fb55e6c7f8a 100644
--- a/core/tests/Drupal/Tests/Core/Test/TestDiscoveryTest.php
+++ b/core/tests/Drupal/Tests/Core/Test/TestDiscoveryTest.php
@@ -13,17 +13,23 @@ use Drupal\Core\Test\Exception\MissingGroupException;
use Drupal\Core\Test\TestDiscovery;
use Drupal\Tests\UnitTestCase;
use org\bovigo\vfs\vfsStream;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\IgnoreDeprecations;
/**
- * @coversDefaultClass \Drupal\Core\Test\TestDiscovery
- * @group Test
+ * Unit tests for TestDiscovery.
*/
+#[CoversClass(TestDiscovery::class)]
+#[Group('Test')]
+#[IgnoreDeprecations]
class TestDiscoveryTest extends UnitTestCase {
/**
- * @covers ::getTestInfo
- * @dataProvider infoParserProvider
+ * @legacy-covers ::getTestInfo
*/
+ #[DataProvider('infoParserProvider')]
public function testTestInfoParser($expected, $classname, $doc_comment = NULL): void {
$info = TestDiscovery::getTestInfo($classname, $doc_comment);
$this->assertEquals($expected, $info);
@@ -34,14 +40,14 @@ class TestDiscoveryTest extends UnitTestCase {
$tests[] = [
// Expected result.
[
- 'name' => static::class,
+ 'name' => TestDatabaseTest::class,
'group' => 'Test',
- 'groups' => ['Test'],
- 'description' => 'Tests \Drupal\Core\Test\TestDiscovery.',
+ 'groups' => ['Test', 'simpletest', 'Template'],
+ 'description' => 'Tests \Drupal\Core\Test\TestDatabase.',
'type' => 'PHPUnit-Unit',
],
// Classname.
- static::class,
+ TestDatabaseTest::class,
];
// A core unit test.
@@ -217,7 +223,7 @@ class TestDiscoveryTest extends UnitTestCase {
}
/**
- * @covers ::getTestInfo
+ * @legacy-covers ::getTestInfo
*/
public function testTestInfoParserMissingGroup(): void {
$classname = 'Drupal\KernelTests\field\BulkDeleteTest';
@@ -232,7 +238,7 @@ EOT;
}
/**
- * @covers ::getTestInfo
+ * @legacy-covers ::getTestInfo
*/
public function testTestInfoParserMissingSummary(): void {
$classname = 'Drupal\KernelTests\field\BulkDeleteTest';
@@ -311,7 +317,7 @@ EOF;
}
/**
- * @covers ::getTestClasses
+ * @legacy-covers ::getTestClasses
*/
public function testGetTestClasses(): void {
$this->setupVfsWithTestClasses();
@@ -380,7 +386,7 @@ EOF;
}
/**
- * @covers ::getTestClasses
+ * @legacy-covers ::getTestClasses
*/
public function testGetTestClassesWithSelectedTypes(): void {
$this->setupVfsWithTestClasses();
@@ -425,7 +431,7 @@ EOF;
}
/**
- * @covers ::getTestClasses
+ * @legacy-covers ::getTestClasses
*/
public function testGetTestsInProfiles(): void {
$this->setupVfsWithTestClasses();
@@ -454,9 +460,9 @@ EOF;
}
/**
- * @covers ::getPhpunitTestSuite
- * @dataProvider providerTestGetPhpunitTestSuite
+ * @legacy-covers ::getPhpunitTestSuite
*/
+ #[DataProvider('providerTestGetPhpunitTestSuite')]
public function testGetPhpunitTestSuite($classname, $expected): void {
$this->assertEquals($expected, TestDiscovery::getPhpunitTestSuite($classname));
}
@@ -482,7 +488,7 @@ EOF;
/**
* Ensure that classes are not reflected when the docblock is empty.
*
- * @covers ::getTestInfo
+ * @legacy-covers ::getTestInfo
*/
public function testGetTestInfoEmptyDocblock(): void {
// If getTestInfo() performed reflection, it won't be able to find the
@@ -497,7 +503,7 @@ EOF;
/**
* Ensure TestDiscovery::scanDirectory() ignores certain abstract file types.
*
- * @covers ::scanDirectory
+ * @legacy-covers ::scanDirectory
*/
public function testScanDirectoryNoAbstract(): void {
$this->setupVfsWithTestClasses();
diff --git a/core/tests/PHPStan/composer.json b/core/tests/PHPStan/composer.json
index 62e1876dea7a..5d5e51651688 100644
--- a/core/tests/PHPStan/composer.json
+++ b/core/tests/PHPStan/composer.json
@@ -3,7 +3,7 @@
"description": "Tests Drupal core's PHPStan rules",
"require-dev": {
"phpunit/phpunit": "^11",
- "phpstan/phpstan": "2.1.14"
+ "phpstan/phpstan": "2.1.17"
},
"license": "GPL-2.0-or-later",
"autoload": {