Skip to content

Commit

Permalink
Add support for target class attributes (#1210)
Browse files Browse the repository at this point in the history
Signed-off-by: Nathanael Esayeas <nathanael.esayeas@protonmail.com>
Co-authored-by: Ryan Neudorf <ryan.neudorf@gmail.com>
  • Loading branch information
ghostwriter and ohryan committed Apr 21, 2023
2 parents 9ff2fef + d9ad5a1 commit 9eb7fad
Show file tree
Hide file tree
Showing 12 changed files with 322 additions and 30 deletions.
31 changes: 31 additions & 0 deletions .php-cs-fixer.dist.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

use Symfony\CS\Config\Config;
use Symfony\CS\Finder\DefaultFinder;

if (class_exists('PhpCsFixer\Finder')) { // PHP-CS-Fixer 2.x
$finder = PhpCsFixer\Finder::create()->in([
'library',
'tests',
]);


return (new PhpCsFixer\Config())
->setRules(array(
'@PSR2' => true,
))
->setUsingCache(true)
->setFinder($finder)
;
}

$finder = DefaultFinder::create()->in(
[
'library',
'tests',
]);

return Config::create()
->level('psr2')
->setUsingCache(true)
->finder($finder);
14 changes: 14 additions & 0 deletions library/Mockery/Generator/DefinedTargetClass.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

namespace Mockery\Generator;

use ReflectionAttribute;

class DefinedTargetClass implements TargetClassInterface
{
private $rfc;
Expand All @@ -36,6 +38,18 @@ public static function factory($name, $alias = null)
return new self(new \ReflectionClass($name), $alias);
}

public function getAttributes()
{
if (\PHP_VERSION_ID < 80000) {
return [];
}

return array_map(
static fn (ReflectionAttribute $attribute): string => $attribute->getName(),
$this->rfc->getAttributes()
);
}

public function getName()
{
return $this->name;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace Mockery\Generator\StringManipulation\Pass;

use Mockery\Generator\MockConfiguration;

class ClassAttributesPass implements Pass
{
public function apply($code, MockConfiguration $config)
{
$class = $config->getTargetClass();

if (!$class) {
return $code;
}

$attributes = $class->getAttributes();

if (!empty($attributes)) {
$attributes = '#[' . implode(',', $attributes) . ']' . PHP_EOL;

return str_replace(
'class Mock',
$attributes . ' class Mock',
$code
);
}

return $code;
}
}
2 changes: 2 additions & 0 deletions library/Mockery/Generator/StringManipulationGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
use Mockery\Generator\StringManipulation\Pass\RemoveUnserializeForInternalSerializableClassesPass;
use Mockery\Generator\StringManipulation\Pass\TraitPass;
use Mockery\Generator\StringManipulation\Pass\AvoidMethodClashPass;
use Mockery\Generator\StringManipulation\Pass\ClassAttributesPass;

class StringManipulationGenerator implements Generator
{
Expand All @@ -60,6 +61,7 @@ public static function withDefaultPasses()
new RemoveBuiltinMethodsThatAreFinalPass(),
new RemoveDestructorPass(),
new ConstantsPass(),
new ClassAttributesPass(),
]);
}

Expand Down
8 changes: 8 additions & 0 deletions library/Mockery/Generator/TargetClassInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ interface TargetClassInterface
*/
public static function factory($name);


/**
* Returns the targetClass's attributes.
*
* @return array
*/
public function getAttributes();

/**
* Returns the targetClass's name.
*
Expand Down
9 changes: 9 additions & 0 deletions library/Mockery/Generator/UndefinedTargetClass.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ public static function factory($name)
return new self($name);
}

public function getAttributes()
{
if (\PHP_VERSION_ID < 80000) {
return [];
}

return ['\AllowDynamicProperties'];
}

public function getName()
{
return $this->name;
Expand Down

0 comments on commit 9eb7fad

Please sign in to comment.