Skip to content
This repository has been archived by the owner on Dec 3, 2023. It is now read-only.

Commit

Permalink
Merge pull request #443 from Symplify/ecs-clean-sets
Browse files Browse the repository at this point in the history
[EasyCodingStandard] smaller sets over random imports + add BlankLineAfterStrictTypesFixer
  • Loading branch information
Tomáš Votruba committed Nov 16, 2017
2 parents cfd5487 + 936b3fc commit 7a4c8b7
Show file tree
Hide file tree
Showing 30 changed files with 463 additions and 321 deletions.
61 changes: 19 additions & 42 deletions easy-coding-standard.neon
@@ -1,81 +1,58 @@
includes:
- packages/EasyCodingStandard/config/symfony.neon
- packages/EasyCodingStandard/config/php54.neon
- packages/EasyCodingStandard/config/php70.neon
- packages/EasyCodingStandard/config/psr2.neon
- packages/EasyCodingStandard/config/php71.neon
# custom

- packages/EasyCodingStandard/config/clean-code.neon
- packages/EasyCodingStandard/config/symplify.neon
- packages/EasyCodingStandard/config/common.neon
- packages/EasyCodingStandard/config/spaces.neon

checkers:
Symplify\CodingStandard\Sniffs\DependencyInjection\NoClassInstantiationSniff:
extraAllowedClasses:
- Symplify\EasyCodingStandard\Error\Error
- Symplify\CodingStandard\FixerTokenWrapper\Naming\Name
- Symplify\CodingStandard\SniffTokenWrapper\CommentCleaner

# Slevomat
SlevomatCodingStandard\Sniffs\Namespaces\ReferenceUsedNamesOnlySniff:
allowPartialUses: false
- SlevomatCodingStandard\Sniffs\ControlStructures\AssignmentInConditionSniff
SlevomatCodingStandard\Sniffs\TypeHints\TypeHintDeclarationSniff:
enableEachParameterAndReturnInspection: true
- SlevomatCodingStandard\Sniffs\Exceptions\ReferenceThrowableOnlySniff
# class should be Abstact or Final
- SlamCsFixer\FinalInternalClassFixer

# Complexity limits
# code complexity
PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineLengthSniff:
absoluteLineLimit: 120
PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\CyclomaticComplexitySniff:
absoluteComplexity: 10
PHP_CodeSniffer\Standards\Generic\Sniffs\Metrics\NestingLevelSniff:
absoluteNestingLevel: 4

# class should be Abstact or Final
- SlamCsFixer\FinalInternalClassFixer
Symplify\CodingStandard\Sniffs\DependencyInjection\NoClassInstantiationSniff:
extraAllowedClasses:
- Symplify\EasyCodingStandard\Error\Error
- Symplify\CodingStandard\FixerTokenWrapper\Naming\Name
- Symplify\CodingStandard\SniffTokenWrapper\CommentCleaner

parameters:
exclude_checkers:
# from PHP-CS-Fixer Symfony set
- PhpCsFixer\Fixer\PhpTag\BlankLineAfterOpeningTagFixer
- PhpCsFixer\Fixer\Phpdoc\PhpdocAlignFixer
- PhpCsFixer\Fixer\Operator\UnaryOperatorSpacesFixer
- PhpCsFixer\Fixer\ControlStructure\YodaStyleFixer

skip_codes:
- SlevomatCodingStandard\Sniffs\TypeHints\TypeHintDeclarationSniff.UselessDocComment

skip:
PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineLengthSniff:
# many implemented interfaces
- packages/CodingStandard/src/Fixer/ClassNotation/PropertyAndConstantSeparationFixer.php
- packages/CodingStandard/src/Fixer/ClassNotation/LastPropertyAndFirstMethodSeparationFixer.php
- packages/CodingStandard/src/Fixer/Import/ImportNamespacedNameFixer.php
- packages/CodingStandard/src/Fixer/Strict/BlankLineAfterStrictTypesFixer.php

SlevomatCodingStandard\Sniffs\TypeHints\TypeHintDeclarationSniff:
- *packages/CodingStandard/src/Sniffs/*/*Sniff.php
- packages/EasyCodingStandard/packages/SniffRunner/src/File/File.php
- packages/Statie/packages/FlatWhite/src/Latte/DynamicStringLoader.php
- packages/Statie/src/Configuration/Configuration.php

Symplify\CodingStandard\Sniffs\Classes\EqualInterfaceImplementationSniff:
- packages/EasyCodingStandard/packages/SniffRunner/src/Application/SniffFileProcessor.php
- packages/EasyCodingStandard/packages/FixerRunner/src/Application/FixerFileProcessor.php

PhpCsFixer\Fixer\PhpUnit\PhpUnitStrictFixer:
- packages/EasyCodingStandard/tests/Indentation/IndentationTest.php

Symplify\CodingStandard\Fixer\Php\ClassStringToClassConstantFixer:
# name parts, not classes
- packages/CodingStandard/src/Sniffs/DependencyInjection/NoClassInstantiationSniff.php

# optional package, interface might not exist
- packages/CodingStandard/src/Sniffs/Classes/EqualInterfaceImplementationSniff.php
# "Exception" is string part of the name
- packages/CodingStandard/src/Sniffs/Naming/ExceptionNameSniff.php
- packages/CodingStandard/src/Fixer/Naming/ExceptionNameFixer.php
# class might not exist
- packages/EasyCodingStandard/packages/Configuration/src/MutualCheckerExcluder.php
- packages/EasyCodingStandard/packages/Configuration/tests/MutualCheckerExcluderTest.php
- packages/EasyCodingStandard/packages/Configuration/src/ConflictingCheckerGuard.php
- packages/EasyCodingStandard/packages/Configuration/tests/ConflictingCheckerGuardTest.php
- *packages/EasyCodingStandard/packages/Configuration/**/MutualCheckerExcluder**.php
- *packages/EasyCodingStandard/packages/Configuration/**/ConflictingCheckerGuard**.php
- packages/CodingStandard/src/Sniffs/Classes/EqualInterfaceImplementationSniff.php

Symplify\CodingStandard\Sniffs\Classes\EqualInterfaceImplementationSniff:
- packages/EasyCodingStandard/packages/SniffRunner/src/Application/SniffFileProcessor.php
- packages/EasyCodingStandard/packages/FixerRunner/src/Application/FixerFileProcessor.php
48 changes: 22 additions & 26 deletions packages/CodingStandard/README.md
Expand Up @@ -378,7 +378,7 @@ checkers:

### Array property should have default value, to prevent undefined array issues

- class: [`Symplify\CodingStandard\Fixer\Property/ArrayPropertyDefaultValueFixer`](/src/Fixer/Property/ArrayPropertyDefaultValueFixer.php)
- class: [`Symplify\CodingStandard\Fixer\Property\ArrayPropertyDefaultValueFixer`](/src/Fixer/Property/ArrayPropertyDefaultValueFixer.php)


:x:
Expand Down Expand Up @@ -415,6 +415,27 @@ class SomeClass
```


### Strict type declaration has to be followed by empty line

- class: [`Symplify\CodingStandard\Fixer\Strict\BlankLineAfterStrictTypesFixer`](/src/Fixer/Strict/BlankLineAfterStrictTypesFixer.php)


:x:

``` php
<?php declare(strict_types=1);
namespace SomeNamespace;
```

:+1:

``` php
<?php declare(strict_types=1);

namespace SomeNamespace;
```


### Implementation of interface should only contain its methods

- class: [`Symplify\CodingStandard\Sniffs\Classes\EqualInterfaceImplementationSniff`](/src/Sniffs/Classes/EqualInterfaceImplementationSniff.php)
Expand Down Expand Up @@ -695,31 +716,6 @@ trait SomeTrait
```


### Non-abstract class that extends TestCase should be final

- class: [`Symplify\CodingStandard\Sniffs\PHPUnit\FinalTestCaseSniff`](/src/Sniffs/PHPUnit/FinalTestCaseSniff.php)

:x:

```php
use PHPUnit\Framework\TestCase;

class SomeTest extends TestCase
{
}
```

:+1:

```php
use PHPUnit\Framework\TestCase;

final class SomeTest extends TestCase
{
}
```


### Properties should be used instead of dynamically defined properties

- class: [`Symplify\CodingStandard\Sniffs\Property\DynamicPropertySniff`](/src/Sniffs/Property/DynamicPropertySniff.php)
Expand Down
Expand Up @@ -37,7 +37,7 @@ public function isCandidate(Tokens $tokens): bool

public function fix(SplFileInfo $file, Tokens $tokens): void
{
for ($index = $tokens->count() - 1; 0 <= $index; --$index) {
for ($index = $tokens->count() - 1; $index > 0; --$index) {
$token = $tokens[$index];

if (! $token->isGivenKind(self::INCLUDY_TOKEN_KINDS)) {
Expand Down
@@ -0,0 +1,92 @@
<?php declare(strict_types=1);

namespace Symplify\CodingStandard\Fixer\Strict;

use PhpCsFixer\Fixer\DefinedFixerInterface;
use PhpCsFixer\Fixer\FixerInterface;
use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface;
use PhpCsFixer\FixerDefinition\CodeSample;
use PhpCsFixer\FixerDefinition\FixerDefinition;
use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
use PhpCsFixer\Tokenizer\Tokens;
use PhpCsFixer\WhitespacesFixerConfig;
use SplFileInfo;
use Symplify\CodingStandard\Fixer\TokenBuilder;

/**
* Inspired at https://github.com/aidantwoods/PHP-CS-Fixer/tree/feature/DeclareStrictTypesFixer-split
*
* @thanks Aidan Woods
*/
final class BlankLineAfterStrictTypesFixer implements FixerInterface, DefinedFixerInterface, WhitespacesAwareFixerInterface
{
/**
* @var WhitespacesFixerConfig
*/
private $whitespacesFixerConfig;

public function getDefinition(): FixerDefinitionInterface
{
return new FixerDefinition(
'Strict type declaration has to be followed by empty line',
[
new CodeSample('
<?php declare(strict_types=1);
namespace SomeNamespace;'),
]
);
}

public function isCandidate(Tokens $tokens): bool
{
return $tokens->isAllTokenKindsFound([T_OPEN_TAG, T_WHITESPACE, T_DECLARE, T_STRING, '=', T_LNUMBER, ';']);
}

public function fix(SplFileInfo $file, Tokens $tokens): void
{
$sequenceLocation = $tokens->findSequence(TokenBuilder::getDeclareStrictTypeSequence(), 1, 15);
if ($sequenceLocation === null) {
return;
}

end($sequenceLocation);
$semicolonPosition = key($sequenceLocation);

// empty file
if (! isset($tokens[$semicolonPosition + 2])) {
return;
}

$lineEnding = $this->whitespacesFixerConfig->getLineEnding();

$tokens->ensureWhitespaceAtIndex($semicolonPosition + 1, 0, $lineEnding . $lineEnding);
}

/**
* Must run after @see \PhpCsFixer\Fixer\Strict\DeclareStrictTypesFixer
*/
public function getPriority(): int
{
return 0;
}

public function getName(): string
{
return self::class;
}

public function supports(SplFileInfo $file): bool
{
return true;
}

public function isRisky(): bool
{
return false;
}

public function setWhitespacesConfig(WhitespacesFixerConfig $whitespacesFixerConfig): void
{
$this->whitespacesFixerConfig = $whitespacesFixerConfig;
}
}
26 changes: 25 additions & 1 deletion packages/CodingStandard/src/Fixer/TokenBuilder.php
Expand Up @@ -8,7 +8,7 @@
final class TokenBuilder
{
/**
* Generates token for code like: " = []".
* Generates: " = []".
*
* @return Token[]
*/
Expand All @@ -22,4 +22,28 @@ public static function createDefaultArrayTokens(): array
new Token([CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']']),
];
}

/**
* Generates: "declare(strict_types=1);"
*
* @return Token[]
*/
public static function getDeclareStrictTypeSequence(): array
{
static $tokens = null;

if ($tokens === null) {
$tokens = [
new Token([T_DECLARE, 'declare']),
new Token('('),
new Token([T_STRING, 'strict_types']),
new Token('='),
new Token([T_LNUMBER, '1']),
new Token(')'),
new Token(';'),
];
}

return $tokens;
}
}

0 comments on commit 7a4c8b7

Please sign in to comment.