Completed
Branch master (06cb84)
by Tomáš
06:00
created

Php7CodeSniffer::runForSource()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 3
Bugs 0 Features 0
Metric Value
dl 0
loc 16
ccs 0
cts 13
cp 0
rs 9.4285
c 3
b 0
f 0
cc 3
eloc 9
nc 3
nop 2
crap 12
1
<?php
2
3
/*
4
 * This file is part of Symplify
5
 * Copyright (c) 2016 Tomas Votruba (http://tomasvotruba.cz).
6
 */
7
8
namespace Symplify\PHP7_CodeSniffer;
9
10
use Symplify\PHP7_CodeSniffer\Event\CheckFileTokenEvent;
11
use Symplify\PHP7_CodeSniffer\EventDispatcher\SniffDispatcher;
12
use Symplify\PHP7_CodeSniffer\Exception\RuntimeException;
13
use Symplify\PHP7_CodeSniffer\File\File;
14
use Symplify\PHP7_CodeSniffer\File\Provider\FilesProvider;
15
use Symplify\PHP7_CodeSniffer\Sniff\SniffFactory;
16
use Symplify\PHP7_CodeSniffer\Sniff\SniffClassesResolver;
17
18
final class Php7CodeSniffer
19
{
20
    /**
21
     * @var SniffDispatcher
22
     */
23
    private $sniffDispatcher;
24
25
    /**
26
     * @var FilesProvider
27
     */
28
    private $filesProvider;
29
30
    /**
31
     * @var SniffClassesResolver
32
     */
33
    private $sniffClassesResolver;
34
35
    /**
36
     * @var SniffFactory
37
     */
38
    private $sniffFactory;
39
40
    public function __construct(
41
        SniffDispatcher $sniffDispatcher,
42
        FilesProvider $sourceFilesProvider,
43
        SniffClassesResolver $sniffProvider,
44
        SniffFactory $sniffFactory
45
    ) {
46
        $this->sniffDispatcher = $sniffDispatcher;
47
        $this->filesProvider = $sourceFilesProvider;
48
        $this->sniffClassesResolver = $sniffProvider;
49
        $this->sniffFactory = $sniffFactory;
50
51
        $this->setupRequirements();
52
    }
53
54
    public function registerSniffs(array $standards, array $sniffs)
55
    {
56
        $sniffClasses = $this->sniffClassesResolver->resolveFromStandardsAndSniffs(
57
            $standards,
58
            $sniffs
59
        );
60
        $sniffs = $this->sniffFactory->createFromSniffClassNames($sniffClasses);
61
        $this->sniffDispatcher->addSniffListeners($sniffs);
62
    }
63
64
    public function runForSource(array $source, bool $isFixer)
65
    {
66
        $this->ensureSniffsAreRegistered();
67
68
        $files = $this->filesProvider->getFilesForSource($source, $isFixer);
69
70
        foreach ($files as $file) {
71
            if ($isFixer) {
72
                $this->processFileWithFixer($file);
73
            } else {
74
                $this->processFile($file);
75
            }
76
77
            $file->cleanUp(); // todo: check performance influence
78
        }
79
    }
80
81
    private function processFile(File $file)
82
    {
83
        foreach ($file->getTokens() as $stackPointer => $token) {
84
            $this->sniffDispatcher->dispatch(
85
                $token['code'],
86
                new CheckFileTokenEvent($file, $stackPointer)
87
            );
88
        }
89
    }
90
91
    private function processFileWithFixer(File $file)
92
    {
93
        // 1. puts tokens into fixer
94
        $file->fixer->startFile($file);
95
96
        // 2. run all Sniff fixers
97
        $this->processFile($file);
98
99
        // 3. load changes to tokens
100
        $file->fixer->endChangeset();
101
102
        // 4. content has changed, save it!
103
        $newContent = $file->fixer->getContents();
104
105
        file_put_contents($file->getFilename(), $newContent);
106
    }
107
108
    private function setupRequirements()
109
    {
110
        $this->ensureLineEndingsAreDetected();
111
        $this->setupVerbosityToMakeLegacyCodeRun();
112
    }
113
114
    /**
115
     * Ensure this option is enabled or else line endings will not always
116
     * be detected properly for files created on a Mac with the /r line ending.
117
     */
118
    private function ensureLineEndingsAreDetected()
119
    {
120
        ini_set('auto_detect_line_endings', true);
121
    }
122
123
    private function setupVerbosityToMakeLegacyCodeRun()
124
    {
125
        define('PHP_CODESNIFFER_VERBOSITY', 0);
126
    }
127
128
    private function ensureSniffsAreRegistered()
129
    {
130
        $listeners = $this->sniffDispatcher->getListeners();
131
        if ($listeners === []) {
132
            throw new RuntimeException(
133
                'You need to specify some sniffs with "--standards=..." or "--sniffs=...".'
134
            );
135
        }
136
    }
137
}
138