Skip to content

Commit

Permalink
A new identifier matching service
Browse files Browse the repository at this point in the history
  • Loading branch information
spaze committed May 26, 2023
1 parent ed205b4 commit 245c927
Show file tree
Hide file tree
Showing 32 changed files with 160 additions and 60 deletions.
1 change: 1 addition & 0 deletions extension.neon
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ services:
- Spaze\PHPStan\Rules\Disallowed\DisallowedNamespaceFactory
- Spaze\PHPStan\Rules\Disallowed\DisallowedSuperglobalFactory
- Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter
- Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier
- Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer
- Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedAttributeRuleErrors
- Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedConstantRuleErrors
Expand Down
25 changes: 25 additions & 0 deletions src/Identifier/Identifier.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php
declare(strict_types = 1);

namespace Spaze\PHPStan\Rules\Disallowed\Identifier;

class Identifier
{

/**
* @param string $pattern
* @param string $value
* @return bool
*/
public function matches(string $pattern, string $value): bool
{
$matches = false;
if ($pattern === $value) {
$matches = true;
} elseif (fnmatch($pattern, $value, FNM_NOESCAPE | FNM_CASEFOLD)) {
$matches = true;
}
return $matches;
}

}
23 changes: 7 additions & 16 deletions src/RuleErrors/DisallowedAttributeRuleErrors.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,22 @@
use PHPStan\Rules\RuleErrorBuilder;
use Spaze\PHPStan\Rules\Disallowed\Allowed\Allowed;
use Spaze\PHPStan\Rules\Disallowed\DisallowedAttribute;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;

class DisallowedAttributeRuleErrors
{

/** @var Allowed */
private $allowed;

/** @var Identifier */
private $identifier;

public function __construct(Allowed $allowed)

public function __construct(Allowed $allowed, Identifier $identifier)
{
$this->allowed = $allowed;
$this->identifier = $identifier;
}


Expand All @@ -33,7 +38,7 @@ public function get(Attribute $attribute, Scope $scope, array $disallowedAttribu
{
foreach ($disallowedAttributes as $disallowedAttribute) {
$attributeName = $attribute->name->toString();
if (!$this->matchesAttribute($disallowedAttribute->getAttribute(), $attributeName)) {
if (!$this->identifier->matches($disallowedAttribute->getAttribute(), $attributeName)) {
continue;
}
if ($this->allowed->isAllowed($scope, $attribute->args, $disallowedAttribute)) {
Expand All @@ -60,18 +65,4 @@ public function get(Attribute $attribute, Scope $scope, array $disallowedAttribu
return [];
}


private function matchesAttribute(string $pattern, string $value): bool
{
if ($pattern === $value) {
return true;
}

if (fnmatch($pattern, $value, FNM_NOESCAPE | FNM_CASEFOLD)) {
return true;
}

return false;
}

}
9 changes: 7 additions & 2 deletions src/RuleErrors/DisallowedCallsRuleErrors.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,22 @@
use PHPStan\ShouldNotHappenException;
use Spaze\PHPStan\Rules\Disallowed\Allowed\Allowed;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCall;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;

class DisallowedCallsRuleErrors
{

/** @var Allowed */
private $allowed;

/** @var Identifier */
private $identifier;

public function __construct(Allowed $allowed)

public function __construct(Allowed $allowed, Identifier $identifier)
{
$this->allowed = $allowed;
$this->identifier = $identifier;
}


Expand All @@ -37,7 +42,7 @@ public function __construct(Allowed $allowed)
public function get(?CallLike $node, Scope $scope, string $name, ?string $displayName, array $disallowedCalls, ?string $message = null): array
{
foreach ($disallowedCalls as $disallowedCall) {
$callMatches = $name === $disallowedCall->getCall() || fnmatch($disallowedCall->getCall(), $name, FNM_NOESCAPE | FNM_CASEFOLD);
$callMatches = $this->identifier->matches($disallowedCall->getCall(), $name);
if ($callMatches && !$this->allowed->isAllowed($scope, isset($node) ? $node->getArgs() : null, $disallowedCall)) {
$errorBuilder = RuleErrorBuilder::message(sprintf(
$message ?? 'Calling %s is forbidden, %s%s',
Expand Down
23 changes: 7 additions & 16 deletions src/RuleErrors/DisallowedNamespaceRuleErrors.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,22 @@
use PHPStan\Rules\RuleErrorBuilder;
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedNamespace;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;

class DisallowedNamespaceRuleErrors
{

/** @var AllowedPath */
private $allowedPath;

/** @var Identifier */
private $identifier;

public function __construct(AllowedPath $allowedPath)

public function __construct(AllowedPath $allowedPath, Identifier $identifier)
{
$this->allowedPath = $allowedPath;
$this->identifier = $identifier;
}


Expand All @@ -36,7 +41,7 @@ public function getDisallowedMessage(string $namespace, string $description, Sco
continue;
}

if (!$this->matchesNamespace($disallowedNamespace->getNamespace(), $namespace)) {
if (!$this->identifier->matches($disallowedNamespace->getNamespace(), $namespace)) {
continue;
}

Expand All @@ -61,18 +66,4 @@ public function getDisallowedMessage(string $namespace, string $description, Sco
return [];
}


private function matchesNamespace(string $pattern, string $value): bool
{
if ($pattern === $value) {
return true;
}

if (fnmatch($pattern, $value, FNM_NOESCAPE | FNM_CASEFOLD)) {
return true;
}

return false;
}

}
3 changes: 2 additions & 1 deletion tests/Calls/EchoCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new EchoCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/EmptyCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new EmptyCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/EvalCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new EvalCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/ExitDieCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new ExitDieCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/FunctionCallsAllowInFunctionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new FunctionCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/FunctionCallsAllowInMethodsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new FunctionCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/FunctionCallsInMultipleNamespacesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new FunctionCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/FunctionCallsNamedParamsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -29,7 +30,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new FunctionCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/FunctionCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;
use Waldo\Quux\Blade;
Expand All @@ -27,7 +28,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new FunctionCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/FunctionCallsUnsupportedParamConfigTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -27,7 +28,7 @@ public function testUnsupportedArrayInParamConfig(): void
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
new FunctionCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/MethodCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedMethodRuleErrors;
Expand All @@ -29,7 +30,7 @@ protected function getRule(): Rule
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new MethodCalls(
new DisallowedMethodRuleErrors(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new TypeResolver(),
$formatter
),
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/NewCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new NewCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
3 changes: 2 additions & 1 deletion tests/Calls/PrintCallsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Spaze\PHPStan\Rules\Disallowed\Allowed\AllowedPath;
use Spaze\PHPStan\Rules\Disallowed\DisallowedCallFactory;
use Spaze\PHPStan\Rules\Disallowed\Formatter\Formatter;
use Spaze\PHPStan\Rules\Disallowed\Identifier\Identifier;
use Spaze\PHPStan\Rules\Disallowed\Normalizer\Normalizer;
use Spaze\PHPStan\Rules\Disallowed\RuleErrors\DisallowedCallsRuleErrors;

Expand All @@ -26,7 +27,7 @@ protected function getRule(): Rule
$formatter = new Formatter($normalizer);
$allowed = new Allowed($formatter, $normalizer, new AllowedPath(new FileHelper(__DIR__)));
return new PrintCalls(
new DisallowedCallsRuleErrors($allowed),
new DisallowedCallsRuleErrors($allowed, new Identifier()),
new DisallowedCallFactory($formatter, $normalizer, $allowed),
[
[
Expand Down
Loading

0 comments on commit 245c927

Please sign in to comment.