Skip to content
Snippets Groups Projects
Verified Commit 0356ea59 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3427388 by godotislate, Berdir: Update...

Issue #3427388 by godotislate, Berdir: Update Drupal\Component\Annotation\Doctrine\StaticReflectionParser::hasClassAttribute() to allow attribute subclasses
parent 7e81b860
No related branches found
No related tags found
27 merge requests!11131[10.4.x-only-DO-NOT-MERGE]: Issue ##2842525 Ajax attached to Views exposed filter form does not trigger callbacks,!9470[10.3.x-only-DO-NOT-MERGE]: #3331771 Fix file_get_contents(): Passing null to parameter,!8540Issue #3457061: Bootstrap Modal dialog Not closing after 10.3.0 Update,!8528Issue #3456871 by Tim Bozeman: Support NULL services,!8373Issue #3427374 by danflanagan8, Vighneshh: taxonomy_tid ViewsArgumentDefault...,!7526Expose roles in response,!7352Draft: Resolve #3203489 "Set filename as",!3878Removed unused condition head title for views,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3133core/modules/system/css/components/hidden.module.css,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2794Issue #3100732: Allow specifying `meta` data on JSON:API objects,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2062Issue #3246454: Add weekly granularity to views date sort,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!877Issue #2708101: Default value for link text is not saved,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493
Pipeline #118140 canceled
......@@ -205,7 +205,7 @@ protected function parse()
break;
case T_CLASS:
// Convert the attributes to fully qualified names.
$this->classAttributes = array_map(fn($name) => strtolower($this->fullySpecifyName($name)), $attributeNames);
$this->classAttributes = array_map(fn($name) => $this->fullySpecifyName($name), $attributeNames);
if ($last_token !== T_PAAMAYIM_NEKUDOTAYIM && $last_token !== T_NEW) {
$this->docComment['class'] = $docComment;
$docComment = '';
......@@ -346,7 +346,13 @@ public function getStaticReflectionParserForDeclaringClass($type, $name)
public function hasClassAttribute(string $attribute): bool
{
$this->parse();
return in_array('\\' . ltrim(strtolower($attribute), '\\'), $this->classAttributes, TRUE);
foreach ($this->classAttributes as $classAttribute) {
if (is_a($classAttribute, $attribute, TRUE)) {
return TRUE;
}
}
return FALSE;
}
/**
......
<?php
namespace Drupal\Tests\Component\Annotation\Doctrine\Fixtures\Attribute;
// @phpstan-ignore-next-line
#[NonexistentAttribute]
final class Nonexistent
{
}
......@@ -3,6 +3,6 @@
namespace Drupal\Tests\Component\Annotation\Doctrine\Fixtures\ExtraAttributes;
#[\Attribute]
final class ExampleAttribute
final class ExampleAttribute extends ExampleParentAttribute
{
}
<?php
namespace Drupal\Tests\Component\Annotation\Doctrine\Fixtures\ExtraAttributes;
#[\Attribute]
class ExampleParentAttribute {
}
......@@ -15,8 +15,10 @@ class StaticReflectionParserTest extends TestCase {
/**
* @testWith ["AttributeClass", "\\Attribute", true]
* ["AttributeClass", "attribute", true]
* ["AttributeClass", "Attribute", true]
* ["AttributeClass", "\\DoesNotExist", false]
* ["Nonexistent", "NonexistentAttribute", false]
* ["MultipleAttributes", "Attribute", true]
* ["MultipleAttributes", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\Attribute\\AttributeClass", true]
* ["MultipleAttributes", "DoesNotExist", false]
......@@ -26,15 +28,16 @@ class StaticReflectionParserTest extends TestCase {
* ["UsedAsQualified", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\ExtraAttributes\\ExampleAttribute", true]
* ["Qualified", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\ExtraAttributes\\ExampleAttribute", true]
* ["Relative", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\Attribute\\SubDir\\SubDirAttribute", true]
* ["FullyQualified", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\ExtraAttributes\\ExampleParentAttribute", true]
* ["Used", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\ExtraAttributes\\ExampleParentAttribute", true]
* ["UsedAs", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\ExtraAttributes\\ExampleParentAttribute", true]
* ["UsedAsQualified", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\ExtraAttributes\\ExampleParentAttribute", true]
* ["Qualified", "Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\ExtraAttributes\\ExampleParentAttribute", true]
*/
public function testAttribute(string $class, string $attribute_class, bool $expected) {
$finder = MockFileFinder::create(__DIR__ . '/Fixtures/Attribute/' . $class . '.php');
$parser = new StaticReflectionParser('\\Drupal\\Tests\\Component\\Annotation\\Doctrine\\Fixtures\\Attribute\\' . $class, $finder);
$this->assertSame($expected, $parser->hasClassAttribute($attribute_class), "'$class' has '$attribute_class'");
// Attribute names and namespaces are case-insensitive in PHP. Practically
// Composer autoloading makes this untrue but builtins like \Attribute are
// case-insensitive so we should support that.
$this->assertSame($expected, $parser->hasClassAttribute(strtoupper($attribute_class)), "'$class' has '$attribute_class'");
$this->assertSame($expected, $parser->hasClassAttribute($attribute_class), "'$class' has attribute that is a '$attribute_class'");
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment