Code Duplication    Length = 107-108 lines in 2 locations

php/Whitespace/BlankLineBeforeCatchBlockFixer.php 1 location

@@ 23-129 (lines=107) @@
20
use PhpCsFixer\Tokenizer\Tokens;
21
use PhpCsFixer\WhitespacesFixerConfig;
22
23
final class BlankLineBeforeCatchBlockFixer extends AbstractFixer implements WhitespacesAwareFixerInterface
24
{
25
    public function __construct()
26
    {
27
        parent::__construct();
28
29
        # Fixes psalm: PropertyNotSetInConstructor
30
        $this->whitespacesConfig = new WhitespacesFixerConfig();
31
    }
32
33
    public function getName()
34
    {
35
        return 'Addiks/blank_line_before_catch_block';
36
    }
37
38
    /**
39
     * {@inheritdoc}
40
     */
41
    public function getDefinition()
42
    {
43
        return new FixerDefinition(
44
            'An empty line feed must precede any catch or finally codeblock.',
45
            [
46
                new CodeSample(
47
                    '<?php
48
try {
49
    foo();
50
51
} catch (\Exception $b) {
52
    bar();
53
54
} finally {
55
    baz();
56
}
57
'
58
                ),
59
            ]
60
        );
61
    }
62
63
    /**
64
     * {@inheritdoc}
65
     */
66
    public function getPriority()
67
    {
68
        // should run after no_blank_lines_after_phpdoc
69
        return -26;
70
    }
71
72
    /**
73
     * {@inheritdoc}
74
     */
75
    public function isCandidate(Tokens $tokens)
76
    {
77
        return $tokens->isTokenKindFound(T_CATCH) || $tokens->isTokenKindFound(T_FINALLY);
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    protected function applyFix(\SplFileInfo $file, Tokens $tokens): void
84
    {
85
        /** @var string $lineEnding */
86
        $lineEnding = $this->whitespacesConfig->getLineEnding();
87
88
        foreach ($tokens as $index => $token) {
89
            /** @var Token $token */
90
            if ($token->isGivenKind([T_CATCH, T_FINALLY])) {
91
                $index = (int)$tokens->getPrevMeaningfulToken($index);
92
93
                if ($tokens[$index]->equals('}')) {
94
                    --$index;
95
96
                    while ($tokens[$index]->isGivenKind([T_COMMENT, T_DOC_COMMENT])) {
97
                        --$index;
98
                    }
99
100
                    /** @var Token $whitespace */
101
                    $whitespace = $tokens[$index];
102
103
                    /** @var int $presentNewlines */
104
                    $presentNewlines = substr_count($whitespace->getContent(), $lineEnding);
105
106
                    if ($whitespace->isWhitespace() && $presentNewlines < 2) {
107
                        $tokens[$index] = $this->convertWhitespaceToken($whitespace);
108
                    }
109
                }
110
            }
111
        }
112
    }
113
114
    private function convertWhitespaceToken(Token $whitespace): Token
115
    {
116
        /** @var string $lineEnding */
117
        $lineEnding = $this->whitespacesConfig->getLineEnding();
118
119
        return new Token([
120
            T_WHITESPACE,
121
            substr_replace(
122
                $whitespace->getContent(),
123
                $lineEnding.$lineEnding,
124
                strpos($whitespace->getContent(), $lineEnding),
125
                1
126
            ),
127
        ]);
128
    }
129
}
130

php/Whitespace/BlankLineBeforeElseBlockFixer.php 1 location

@@ 23-130 (lines=108) @@
20
use PhpCsFixer\Tokenizer\Tokens;
21
use PhpCsFixer\WhitespacesFixerConfig;
22
23
final class BlankLineBeforeElseBlockFixer extends AbstractFixer implements WhitespacesAwareFixerInterface
24
{
25
    public function __construct()
26
    {
27
        parent::__construct();
28
29
        # Fixes psalm: PropertyNotSetInConstructor
30
        $this->whitespacesConfig = new WhitespacesFixerConfig();
31
    }
32
33
    public function getName()
34
    {
35
        return 'Addiks/blank_line_before_else_block';
36
    }
37
38
    /**
39
     * {@inheritdoc}
40
     */
41
    public function getDefinition()
42
    {
43
        return new FixerDefinition(
44
            'An empty line feed must precede any else or elseif codeblock.',
45
            [
46
                new CodeSample(
47
                    '<?php
48
if ($a) {
49
    foo();
50
51
} elseif ($b) {
52
    bar();
53
54
} else {
55
    baz();
56
}
57
'
58
                ),
59
            ]
60
        );
61
    }
62
63
    /**
64
     * {@inheritdoc}
65
     */
66
    public function getPriority()
67
    {
68
        // should run after no_blank_lines_after_phpdoc
69
        return -26;
70
    }
71
72
    /**
73
     * {@inheritdoc}
74
     */
75
    public function isCandidate(Tokens $tokens)
76
    {
77
        return $tokens->isTokenKindFound(T_ELSEIF) || $tokens->isTokenKindFound(T_ELSE);
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    protected function applyFix(\SplFileInfo $file, Tokens $tokens): void
84
    {
85
        /** @var string $lineEnding */
86
        $lineEnding = $this->whitespacesConfig->getLineEnding();
87
88
        foreach ($tokens as $index => $token) {
89
            /** @var Token $token */
90
91
            if ($token->isGivenKind([T_ELSE, T_ELSEIF])) {
92
                $index = (int)$tokens->getPrevMeaningfulToken($index);
93
94
                if ($tokens[$index]->equals('}')) {
95
                    --$index;
96
97
                    while ($tokens[$index]->isGivenKind([T_COMMENT, T_DOC_COMMENT])) {
98
                        --$index;
99
                    }
100
101
                    /** @var Token $whitespace */
102
                    $whitespace = $tokens[$index];
103
104
                    /** @var int $presentNewlines */
105
                    $presentNewlines = substr_count($whitespace->getContent(), $lineEnding);
106
107
                    if ($whitespace->isWhitespace() && $presentNewlines < 2) {
108
                        $tokens[$index] = $this->convertWhitespaceToken($whitespace);
109
                    }
110
                }
111
            }
112
        }
113
    }
114
115
    private function convertWhitespaceToken(Token $whitespace): Token
116
    {
117
        /** @var string $lineEnding */
118
        $lineEnding = $this->whitespacesConfig->getLineEnding();
119
120
        return new Token([
121
            T_WHITESPACE,
122
            substr_replace(
123
                $whitespace->getContent(),
124
                $lineEnding.$lineEnding,
125
                strpos($whitespace->getContent(), $lineEnding),
126
                1
127
            ),
128
        ]);
129
    }
130
}
131