Skip to content
Snippets Groups Projects
Verified Commit cbbdff70 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

(cherry picked from commit 0356ea59)
parent 278ef3a6
No related branches found
No related tags found
6 merge requests!8376Drupal views: adding more granularity to the ‘use ajax’ functionality,!8300Issue #3443586 View area displays even when parent view has no results.,!7567Issue #3153723 by quietone, Hardik_Patel_12: Change the scaffolding...,!7565Issue #3153723 by quietone, Hardik_Patel_12: Change the scaffolding...,!7509Change label "Block description" to "Block type",!7344Issue #3292350 by O'Briat, KlemenDEV, hswong3i, smustgrave, quietone: Update...
Pipeline #118126 passed
+1
......@@ -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