Skip to content

Commit e1e3ea2

Browse files
committedFeb 22, 2024
Add Mixin attribute
1 parent 493630e commit e1e3ea2

7 files changed

+121
-2
lines changed
 

Diff for: ‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ These are the available attributes and their corresponding PHPDoc annotations:
100100
| [Internal](https://github.com/php-static-analysis/attributes/blob/main/doc/Internal.md) | `@internal` |
101101
| [IsReadOnly](https://github.com/php-static-analysis/attributes/blob/main/doc/IsReadOnly.md) | `@readonly` |
102102
| [Method](https://github.com/php-static-analysis/attributes/blob/main/doc/Method.md) | `@method` |
103+
| [Mixin](https://github.com/php-static-analysis/attributes/blob/main/doc/Mixin.md) | `@mixin` |
103104
| [Param](https://github.com/php-static-analysis/attributes/blob/main/doc/Param.md) | `@param` |
104105
| [Property](https://github.com/php-static-analysis/attributes/blob/main/doc/Property.md) | `@property` `@var` |
105106
| [PropertyRead](https://github.com/php-static-analysis/attributes/blob/main/doc/PropertyRead.md) | `@property-read` |

Diff for: ‎composer.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
"prefer-stable": true,
2525
"require": {
2626
"php": ">=8.0",
27-
"php-static-analysis/attributes": "^0.1.9 || dev-main",
28-
"php-static-analysis/node-visitor": "^0.1.9 || dev-main",
27+
"php-static-analysis/attributes": "^0.1.10 || dev-main",
28+
"php-static-analysis/node-visitor": "^0.1.10 || dev-main",
2929
"phpstan/phpstan": "^1.8"
3030
},
3131
"require-dev": {

Diff for: ‎tests/MixinAttributeTest.php

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace test\PhpStaticAnalysis\PHPStanExtension;
4+
5+
class MixinAttributeTest extends BaseAttributeTestCase
6+
{
7+
public function testClassMixinAttribute(): void
8+
{
9+
$errors = $this->analyse(__DIR__ . '/data/Mixin/ClassMixinAttribute.php');
10+
$this->assertCount(0, $errors);
11+
}
12+
13+
public function testInterfaceMixinAttribute(): void
14+
{
15+
$errors = $this->analyse(__DIR__ . '/data/Mixin/InterfaceMixinAttribute.php');
16+
$this->assertCount(0, $errors);
17+
}
18+
19+
public function testTraitMixinAttribute(): void
20+
{
21+
$errors = $this->analyse(__DIR__ . '/data/Mixin/TraitMixinAttribute.php');
22+
$this->assertCount(0, $errors);
23+
}
24+
25+
public function testInvalidClassMixinAttribute(): void
26+
{
27+
$errors = $this->analyse(__DIR__ . '/data/Mixin/InvalidClassMixinAttribute.php');
28+
29+
$expectedErrors = [
30+
'PHPDoc tag @mixin contains unknown class test\PhpStaticAnalysis\PHPStanExtension\data\Mixin\count.' => 7,
31+
'PHPDoc tag @mixin has invalid value (): Unexpected token "\n * ", expected type at offset 13' => 7,
32+
'Parameter #1 ...$params of attribute class PhpStaticAnalysis\Attributes\Mixin constructor expects string, int given.' => 7,
33+
'Attribute class PhpStaticAnalysis\Attributes\Mixin does not have the method target.' => 11,
34+
];
35+
36+
$this->checkExpectedErrors($errors, $expectedErrors);
37+
}
38+
}

Diff for: ‎tests/data/Mixin/ClassMixinAttribute.php

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace test\PhpStaticAnalysis\PHPStanExtension\data\Mixin;
4+
5+
use PhpStaticAnalysis\Attributes\Mixin;
6+
7+
class ClassMixinAttribute
8+
{
9+
public function proxied(): void
10+
{
11+
}
12+
}
13+
14+
class MyClass
15+
{
16+
}
17+
18+
class Another
19+
{
20+
}
21+
22+
#[Mixin('ClassMixinAttribute')] // this is the proxied class
23+
#[Mixin(
24+
'MyClass',
25+
'Another',
26+
)]
27+
class ClassMixinAttributeProxy
28+
{
29+
public function __call(string $name, mixed ...$arguments): void
30+
{
31+
(new ClassMixinAttribute())->$name(...$arguments);
32+
}
33+
}
34+
35+
$proxy = new ClassMixinAttributeProxy();
36+
$proxy->proxied();

Diff for: ‎tests/data/Mixin/InterfaceMixinAttribute.php

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace test\PhpStaticAnalysis\PHPStanExtension\data\Mixin;
4+
5+
use PhpStaticAnalysis\Attributes\Mixin;
6+
7+
#[Mixin('AClass')]
8+
interface InterfaceMixinAttribute
9+
{
10+
}
11+
12+
class AClass
13+
{
14+
}

Diff for: ‎tests/data/Mixin/InvalidClassMixinAttribute.php

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace test\PhpStaticAnalysis\PHPStanExtension\data\Mixin;
4+
5+
use PhpStaticAnalysis\Attributes\Mixin;
6+
7+
#[Mixin(0)]
8+
#[Mixin('count($a)')]
9+
class InvalidClassMixinAttribute
10+
{
11+
#[Mixin('A')]
12+
public function getName(): string
13+
{
14+
return "John";
15+
}
16+
}

Diff for: ‎tests/data/Mixin/TraitMixinAttribute.php

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace test\PhpStaticAnalysis\PHPStanExtension\data\Mixin;
4+
5+
use PhpStaticAnalysis\Attributes\Mixin;
6+
7+
class Other
8+
{
9+
}
10+
11+
#[Mixin('Other')]
12+
trait TraitMixinAttribute
13+
{
14+
}

0 commit comments

Comments
 (0)
Please sign in to comment.