Skip to content

Commit

Permalink
restructure
Browse files Browse the repository at this point in the history
  • Loading branch information
Simon Bigelmayr committed Dec 9, 2024
1 parent 02f521b commit 123d8b6
Show file tree
Hide file tree
Showing 10 changed files with 145 additions and 67 deletions.
18 changes: 18 additions & 0 deletions src/PHPStan/NodeNameExtractor/ClassMethodNameExtractor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php declare(strict_types=1);

namespace MLL\Utils\PHPStan\NodeNameExtractor;

use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;

class ClassMethodNameExtractor implements NodeNameExtractor
{
public function extract(Node $node): ?string
{
if ($node instanceof ClassMethod) {
return $node->name->toString();
}

return null;
}
}
19 changes: 19 additions & 0 deletions src/PHPStan/NodeNameExtractor/ClassNameExtractor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php declare(strict_types=1);

namespace MLL\Utils\PHPStan\NodeNameExtractor;

use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt\Class_;

class ClassNameExtractor implements NodeNameExtractor
{
public function extract(Node $node): ?string
{
if ($node instanceof Class_ && $node->name instanceof Identifier) {
return $node->name->toString();
}

return null;
}
}
10 changes: 10 additions & 0 deletions src/PHPStan/NodeNameExtractor/NodeNameExtractor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php declare(strict_types=1);

namespace MLL\Utils\PHPStan\NodeNameExtractor;

use PhpParser\Node;

interface NodeNameExtractor
{
public function extract(Node $node): ?string;
}
22 changes: 22 additions & 0 deletions src/PHPStan/NodeNameExtractor/StringNameExtractor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php declare(strict_types=1);

namespace MLL\Utils\PHPStan\NodeNameExtractor;

use PhpParser\Node;
use PhpParser\Node\Scalar\EncapsedStringPart;
use PhpParser\Node\Scalar\String_;

class StringNameExtractor implements NodeNameExtractor
{
public function extract(Node $node): ?string
{
if ($node instanceof String_) {
return $node->value;
}
if ($node instanceof EncapsedStringPart) {
return $node->value;
}

return null;
}
}
25 changes: 25 additions & 0 deletions src/PHPStan/NodeNameExtractor/VariableNameExtractor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php declare(strict_types=1);

namespace MLL\Utils\PHPStan\NodeNameExtractor;

use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Param;

class VariableNameExtractor implements NodeNameExtractor
{
public function extract(Node $node): ?string
{
if ($node instanceof Variable && is_string($node->name)) {
return $node->name;
}
if ($node instanceof Param
&& $node->var instanceof Variable
&& is_string($node->var->name)
) {
return $node->var->name;
}

return null;
}
}
28 changes: 22 additions & 6 deletions src/PHPStan/Rules/CanonicalCapitalization.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

namespace MLL\Utils\PHPStan\Rules;

use MLL\Utils\PHPStan\NodeNameExtractor\ClassMethodNameExtractor;
use MLL\Utils\PHPStan\NodeNameExtractor\ClassNameExtractor;
use MLL\Utils\PHPStan\NodeNameExtractor\StringNameExtractor;
use MLL\Utils\PHPStan\NodeNameExtractor\VariableNameExtractor;
use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
Expand Down Expand Up @@ -34,13 +38,25 @@ public function getNodeType(): string

public function processNode(Node $node, Scope $scope): array
{
$result = NodeIdentifier::extractNodeNameAndType($node)
?? NodeIdentifier::nodeNameForString($node);
if ($result === null) {
return [];
$extractors = [
new ClassMethodNameExtractor(),
new ClassNameExtractor(),
new VariableNameExtractor(),
new StringNameExtractor(),
];

$nodeName = null;
foreach ($extractors as $extractor) {
$extractedName = $extractor->extract($node);
if ($extractedName !== null) {
$nodeName = $extractedName;
break;
}
}

[$nodeName, $type] = $result;
if ($nodeName === null) {
return [];
}

$wrongCapitalization = CanonicalCapitalization::findWrongCapitalization($nodeName);
if ($wrongCapitalization === null) {
Expand All @@ -53,7 +69,7 @@ public function processNode(Node $node, Scope $scope): array

return [
RuleErrorBuilder::message(<<<TXT
{$type} "{$nodeName}" should use "{$correct}" instead of "{$incorrect}", rename it to "{$expectedName}".
Name of {$node->getType()} "{$nodeName}" should use "{$correct}" instead of "{$incorrect}", rename it to "{$expectedName}".
TXT)
->identifier('mll.canonicalCapitalization')
->build(),
Expand Down
27 changes: 21 additions & 6 deletions src/PHPStan/Rules/CapitalizationOfIDRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
namespace MLL\Utils\PHPStan\Rules;

use Illuminate\Support\Str;
use MLL\Utils\PHPStan\NodeNameExtractor\ClassMethodNameExtractor;
use MLL\Utils\PHPStan\NodeNameExtractor\ClassNameExtractor;
use MLL\Utils\PHPStan\NodeNameExtractor\VariableNameExtractor;
use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
Expand All @@ -25,21 +28,33 @@ public function getNodeType(): string

public function processNode(Node $node, Scope $scope): array
{
$result = NodeIdentifier::extractNodeNameAndType($node);
if ($result === null) {
$extractors = [
new ClassMethodNameExtractor(),
new ClassNameExtractor(),
new VariableNameExtractor(),
];
$nodeName = null;
foreach ($extractors as $extractor) {
$extractedName = $extractor->extract($node);
if ($extractedName !== null) {
$nodeName = $extractedName;
break;
}
}

if ($nodeName === null) {
return [];
}

[$nodeName, $type] = $result;
if (! static::containsWrongIDCapitalization($nodeName)) {
if (! self::containsWrongIDCapitalization($nodeName)) {
return [];
}

$expectedName = static::fixIDCapitalization($nodeName);
$expectedName = self::fixIDCapitalization($nodeName);

return [
RuleErrorBuilder::message(<<<TXT
{$type} Name "{$nodeName}" should use "ID" instead of "Id", rename it to "{$expectedName}".
Name of {$node->getType()} "{$nodeName}" should use "ID" instead of "Id", rename it to "{$expectedName}".
TXT)
->identifier('mll.capitalizationOfID')
->build(),
Expand Down
47 changes: 0 additions & 47 deletions src/PHPStan/Rules/NodeIdentifier.php

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php declare(strict_types=1);

namespace MLL\Utils\Tests\PHPStan\Rules;
namespace MLL\Utils\Tests\PHPStan\Rules\CanonicalCapitalization;

use MLL\Utils\PHPStan\Rules\CanonicalCapitalization;
use PHPUnit\Framework\Attributes\DataProvider;
Expand Down Expand Up @@ -31,16 +31,16 @@ public function testFindWrongCapitalization(string $nodeName, array $data): void
/** @return iterable<array{string, array{string, string}}> */
public static function wrongCapitalizationProvider(): iterable
{
yield 'Should correct capitalization for "LabID "' => ['The LabID is incorrect', ['Lab ID', 'LabID ', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "Lab-ID"' => ['The Lab-ID is incorrect', ['Lab ID', 'Lab-ID', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "lab id"' => ['The lab id is incorrect', ['Lab ID', 'lab id', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for " labID"' => ['The labID is incorrect', ['Lab ID', ' labID', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "labID "' => ['labID is incorrect', ['Lab ID', 'labID ', 'Lab ID is incorrect']];
yield 'Should correct capitalization for " LabID"' => ['The LabID', ['Lab ID', ' LabID', 'The Lab ID']];
yield 'Should correct capitalization for " labID"' => ['The labID is incorrect', ['Lab ID', ' labID', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "LABID"' => ['The LABID is incorrect', ['Lab ID', 'LABID', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "Lab Id"' => ['The Lab Id is incorrect', ['Lab ID', 'Lab Id', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "Lab-ID"' => ['The Lab-ID is incorrect', ['Lab ID', 'Lab-ID', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "LabID "' => ['The LabID is incorrect', ['Lab ID', 'LabID ', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "Labid"' => ['The Labid is incorrect', ['Lab ID', 'Labid', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "lab id"' => ['The lab id is incorrect', ['Lab ID', 'lab id', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "lab-Id"' => ['The lab-Id is incorrect', ['Lab ID', 'lab-Id', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "Lab Id"' => ['The Lab Id is incorrect', ['Lab ID', 'Lab Id', self::EXPECTED_LAB_ID_IS_INCORRECT]];
yield 'Should correct capitalization for "labID "' => ['labID is incorrect', ['Lab ID', 'labID ', 'Lab ID is incorrect']];
}

/** @dataProvider rightCapitalizationProvider */
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php declare(strict_types=1);

namespace MLL\Utils\Tests\PHPStan\Rules;
namespace MLL\Utils\Tests\PHPStan\Rules\CapitalizationOfIDRule;

use MLL\Utils\PHPStan\Rules\CapitalizationOfIDRule;
use PHPUnit\Framework\Attributes\DataProvider;
Expand Down

0 comments on commit 123d8b6

Please sign in to comment.