-
Notifications
You must be signed in to change notification settings - Fork 41
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of https://github.com/carlosas/phpat
- Loading branch information
Showing
10 changed files
with
205 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
src/Rule/Assertion/Declaration/ShouldBeReadonly/IsReadonlyRule.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace PHPat\Rule\Assertion\Declaration\ShouldBeReadonly; | ||
|
||
use PHPat\Rule\Extractor\Declaration\ReadonlyExtractor; | ||
use PHPStan\Node\InClassNode; | ||
use PHPStan\Rules\Rule; | ||
|
||
/** | ||
* @implements Rule<InClassNode> | ||
*/ | ||
class IsReadonlyRule extends ShouldBeReadonly implements Rule | ||
{ | ||
use ReadonlyExtractor; | ||
} |
54 changes: 54 additions & 0 deletions
54
src/Rule/Assertion/Declaration/ShouldBeReadonly/ShouldBeReadonly.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace PHPat\Rule\Assertion\Declaration\ShouldBeReadonly; | ||
|
||
use PHPat\Configuration; | ||
use PHPat\Rule\Assertion\Declaration\DeclarationAssertion; | ||
use PHPat\Rule\Assertion\Declaration\ValidationTrait; | ||
use PHPat\Statement\Builder\StatementBuilderFactory; | ||
use PHPStan\Reflection\ClassReflection; | ||
use PHPStan\Reflection\ReflectionProvider; | ||
use PHPStan\Rules\RuleError; | ||
use PHPStan\Type\FileTypeMapper; | ||
|
||
abstract class ShouldBeReadonly extends DeclarationAssertion | ||
{ | ||
use ValidationTrait; | ||
|
||
public function __construct( | ||
StatementBuilderFactory $statementBuilderFactory, | ||
Configuration $configuration, | ||
ReflectionProvider $reflectionProvider, | ||
FileTypeMapper $fileTypeMapper | ||
) { | ||
parent::__construct( | ||
__CLASS__, | ||
$statementBuilderFactory, | ||
$configuration, | ||
$reflectionProvider, | ||
$fileTypeMapper | ||
); | ||
} | ||
|
||
/** | ||
* @param string $ruleName | ||
* @param ClassReflection $subject | ||
* @param bool $meetsDeclaration | ||
* @param string[] $tips | ||
* @return array<RuleError> | ||
*/ | ||
protected function applyValidation(string $ruleName, ClassReflection $subject, bool $meetsDeclaration, array $tips): array | ||
{ | ||
return $this->applyShould($ruleName, $subject, $meetsDeclaration, $tips); | ||
} | ||
|
||
protected function getMessage(string $ruleName, string $subject): string | ||
{ | ||
return $this->prepareMessage( | ||
$ruleName, | ||
sprintf('%s should be readonly', $subject) | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace PHPat\Rule\Extractor\Declaration; | ||
|
||
use PhpParser\Node; | ||
use PHPStan\Analyser\Scope; | ||
use PHPStan\Node\InClassNode; | ||
|
||
trait ReadonlyExtractor | ||
{ | ||
public function getNodeType(): string | ||
{ | ||
return InClassNode::class; | ||
} | ||
|
||
/** | ||
* @param InClassNode $node | ||
*/ | ||
protected function meetsDeclaration(Node $node, Scope $scope): bool | ||
{ | ||
return $node->getClassReflection()->isReadOnly(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace PHPat\Selector; | ||
|
||
use PHPStan\Reflection\ClassReflection; | ||
|
||
class IsReadonly implements SelectorInterface | ||
{ | ||
public function getName(): string | ||
{ | ||
return '-all readonly classes-'; | ||
} | ||
|
||
public function matches(ClassReflection $classReflection): bool | ||
{ | ||
return $classReflection->isReadOnly(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Tests\PHPat\unit\rules\ShouldBeReadonly; | ||
|
||
use PHPat\Configuration; | ||
use PHPat\Rule\Assertion\Declaration\ShouldBeReadonly\IsReadonlyRule; | ||
use PHPat\Rule\Assertion\Declaration\ShouldBeReadonly\ShouldBeReadonly; | ||
use PHPat\Selector\Classname; | ||
use PHPat\Statement\Builder\StatementBuilderFactory; | ||
use PHPStan\Rules\Rule; | ||
use PHPStan\Testing\RuleTestCase; | ||
use PHPStan\Type\FileTypeMapper; | ||
use Tests\PHPat\fixtures\FixtureClass; | ||
use Tests\PHPat\unit\FakeTestParser; | ||
|
||
/** | ||
* @extends RuleTestCase<IsReadonlyRule> | ||
*/ | ||
class ReadonlyClassTest extends RuleTestCase | ||
{ | ||
public const RULE_NAME = 'test_FixtureClassShouldBeReadonly'; | ||
public function testRule(): void | ||
{ | ||
$this->analyse(['tests/fixtures/FixtureClass.php'], [ | ||
[sprintf('%s should be readonly', FixtureClass::class), 31], | ||
]); | ||
} | ||
|
||
protected function getRule(): Rule | ||
{ | ||
$testParser = FakeTestParser::create( | ||
self::RULE_NAME, | ||
ShouldBeReadonly::class, | ||
[new Classname(FixtureClass::class, false)], | ||
[] | ||
); | ||
|
||
return new IsReadonlyRule( | ||
new StatementBuilderFactory($testParser), | ||
new Configuration(false, true, false), | ||
$this->createReflectionProvider(), | ||
self::getContainer()->getByType(FileTypeMapper::class) | ||
); | ||
} | ||
} |