annotate vendor/squizlabs/php_codesniffer/src/Files/FileList.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents a9cd425dd02b
children
rev   line source
Chris@4 1 <?php
Chris@4 2 /**
Chris@4 3 * Represents a list of files on the file system that are to be checked during the run.
Chris@4 4 *
Chris@4 5 * File objects are created as needed rather than all at once.
Chris@4 6 *
Chris@4 7 * @author Greg Sherwood <gsherwood@squiz.net>
Chris@4 8 * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
Chris@4 9 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
Chris@4 10 */
Chris@4 11
Chris@4 12 namespace PHP_CodeSniffer\Files;
Chris@4 13
Chris@5 14 use PHP_CodeSniffer\Autoload;
Chris@4 15 use PHP_CodeSniffer\Util;
Chris@4 16 use PHP_CodeSniffer\Ruleset;
Chris@4 17 use PHP_CodeSniffer\Config;
Chris@4 18 use PHP_CodeSniffer\Exceptions\DeepExitException;
Chris@4 19
Chris@4 20 class FileList implements \Iterator, \Countable
Chris@4 21 {
Chris@4 22
Chris@4 23 /**
Chris@4 24 * A list of file paths that are included in the list.
Chris@4 25 *
Chris@4 26 * @var array
Chris@4 27 */
Chris@4 28 private $files = [];
Chris@4 29
Chris@4 30 /**
Chris@4 31 * The number of files in the list.
Chris@4 32 *
Chris@4 33 * @var integer
Chris@4 34 */
Chris@4 35 private $numFiles = 0;
Chris@4 36
Chris@4 37 /**
Chris@4 38 * The config data for the run.
Chris@4 39 *
Chris@4 40 * @var \PHP_CodeSniffer\Config
Chris@4 41 */
Chris@4 42 public $config = null;
Chris@4 43
Chris@4 44 /**
Chris@4 45 * The ruleset used for the run.
Chris@4 46 *
Chris@4 47 * @var \PHP_CodeSniffer\Ruleset
Chris@4 48 */
Chris@4 49 public $ruleset = null;
Chris@4 50
Chris@4 51 /**
Chris@4 52 * An array of patterns to use for skipping files.
Chris@4 53 *
Chris@4 54 * @var array
Chris@4 55 */
Chris@4 56 protected $ignorePatterns = [];
Chris@4 57
Chris@4 58
Chris@4 59 /**
Chris@4 60 * Constructs a file list and loads in an array of file paths to process.
Chris@4 61 *
Chris@4 62 * @param \PHP_CodeSniffer\Config $config The config data for the run.
Chris@4 63 * @param \PHP_CodeSniffer\Ruleset $ruleset The ruleset used for the run.
Chris@4 64 *
Chris@4 65 * @return void
Chris@4 66 */
Chris@4 67 public function __construct(Config $config, Ruleset $ruleset)
Chris@4 68 {
Chris@4 69 $this->ruleset = $ruleset;
Chris@4 70 $this->config = $config;
Chris@4 71
Chris@4 72 $paths = $config->files;
Chris@4 73 foreach ($paths as $path) {
Chris@4 74 $isPharFile = Util\Common::isPharFile($path);
Chris@4 75 if (is_dir($path) === true || $isPharFile === true) {
Chris@4 76 if ($isPharFile === true) {
Chris@4 77 $path = 'phar://'.$path;
Chris@4 78 }
Chris@4 79
Chris@4 80 $filterClass = $this->getFilterClass();
Chris@4 81
Chris@4 82 $di = new \RecursiveDirectoryIterator($path, (\RecursiveDirectoryIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS));
Chris@4 83 $filter = new $filterClass($di, $path, $config, $ruleset);
Chris@4 84 $iterator = new \RecursiveIteratorIterator($filter);
Chris@4 85
Chris@4 86 foreach ($iterator as $file) {
Chris@4 87 $this->files[$file->getPathname()] = null;
Chris@4 88 $this->numFiles++;
Chris@4 89 }
Chris@4 90 } else {
Chris@4 91 $this->addFile($path);
Chris@4 92 }//end if
Chris@4 93 }//end foreach
Chris@4 94
Chris@4 95 reset($this->files);
Chris@4 96
Chris@4 97 }//end __construct()
Chris@4 98
Chris@4 99
Chris@4 100 /**
Chris@4 101 * Add a file to the list.
Chris@4 102 *
Chris@4 103 * If a file object has already been created, it can be passed here.
Chris@4 104 * If it is left NULL, it will be created when accessed.
Chris@4 105 *
Chris@4 106 * @param string $path The path to the file being added.
Chris@4 107 * @param \PHP_CodeSniffer\Files\File $file The file being added.
Chris@4 108 *
Chris@4 109 * @return void
Chris@4 110 */
Chris@4 111 public function addFile($path, $file=null)
Chris@4 112 {
Chris@4 113 // No filtering is done for STDIN when the filename
Chris@4 114 // has not been specified.
Chris@4 115 if ($path === 'STDIN') {
Chris@4 116 $this->files[$path] = $file;
Chris@4 117 $this->numFiles++;
Chris@4 118 return;
Chris@4 119 }
Chris@4 120
Chris@4 121 $filterClass = $this->getFilterClass();
Chris@4 122
Chris@4 123 $di = new \RecursiveArrayIterator([$path]);
Chris@4 124 $filter = new $filterClass($di, $path, $this->config, $this->ruleset);
Chris@4 125 $iterator = new \RecursiveIteratorIterator($filter);
Chris@4 126
Chris@4 127 foreach ($iterator as $path) {
Chris@4 128 $this->files[$path] = $file;
Chris@4 129 $this->numFiles++;
Chris@4 130 }
Chris@4 131
Chris@4 132 }//end addFile()
Chris@4 133
Chris@4 134
Chris@4 135 /**
Chris@4 136 * Get the class name of the filter being used for the run.
Chris@4 137 *
Chris@4 138 * @return string
Chris@4 139 */
Chris@4 140 private function getFilterClass()
Chris@4 141 {
Chris@4 142 $filterType = $this->config->filter;
Chris@4 143
Chris@4 144 if ($filterType === null) {
Chris@4 145 $filterClass = '\PHP_CodeSniffer\Filters\Filter';
Chris@4 146 } else {
Chris@4 147 if (strpos($filterType, '.') !== false) {
Chris@4 148 // This is a path to a custom filter class.
Chris@4 149 $filename = realpath($filterType);
Chris@4 150 if ($filename === false) {
Chris@4 151 $error = "ERROR: Custom filter \"$filterType\" not found".PHP_EOL;
Chris@4 152 throw new DeepExitException($error, 3);
Chris@4 153 }
Chris@4 154
Chris@5 155 $filterClass = Autoload::loadFile($filename);
Chris@4 156 } else {
Chris@4 157 $filterClass = '\PHP_CodeSniffer\Filters\\'.$filterType;
Chris@4 158 }
Chris@4 159 }
Chris@4 160
Chris@4 161 return $filterClass;
Chris@4 162
Chris@4 163 }//end getFilterClass()
Chris@4 164
Chris@4 165
Chris@4 166 /**
Chris@4 167 * Rewind the iterator to the first file.
Chris@4 168 *
Chris@4 169 * @return void
Chris@4 170 */
Chris@4 171 public function rewind()
Chris@4 172 {
Chris@4 173 reset($this->files);
Chris@4 174
Chris@4 175 }//end rewind()
Chris@4 176
Chris@4 177
Chris@4 178 /**
Chris@4 179 * Get the file that is currently being processed.
Chris@4 180 *
Chris@4 181 * @return \PHP_CodeSniffer\Files\File
Chris@4 182 */
Chris@4 183 public function current()
Chris@4 184 {
Chris@4 185 $path = key($this->files);
Chris@4 186 if ($this->files[$path] === null) {
Chris@4 187 $this->files[$path] = new LocalFile($path, $this->ruleset, $this->config);
Chris@4 188 }
Chris@4 189
Chris@4 190 return $this->files[$path];
Chris@4 191
Chris@4 192 }//end current()
Chris@4 193
Chris@4 194
Chris@4 195 /**
Chris@4 196 * Return the file path of the current file being processed.
Chris@4 197 *
Chris@4 198 * @return void
Chris@4 199 */
Chris@4 200 public function key()
Chris@4 201 {
Chris@4 202 return key($this->files);
Chris@4 203
Chris@4 204 }//end key()
Chris@4 205
Chris@4 206
Chris@4 207 /**
Chris@4 208 * Move forward to the next file.
Chris@4 209 *
Chris@4 210 * @return void
Chris@4 211 */
Chris@4 212 public function next()
Chris@4 213 {
Chris@4 214 next($this->files);
Chris@4 215
Chris@4 216 }//end next()
Chris@4 217
Chris@4 218
Chris@4 219 /**
Chris@4 220 * Checks if current position is valid.
Chris@4 221 *
Chris@4 222 * @return boolean
Chris@4 223 */
Chris@4 224 public function valid()
Chris@4 225 {
Chris@4 226 if (current($this->files) === false) {
Chris@4 227 return false;
Chris@4 228 }
Chris@4 229
Chris@4 230 return true;
Chris@4 231
Chris@4 232 }//end valid()
Chris@4 233
Chris@4 234
Chris@4 235 /**
Chris@4 236 * Return the number of files in the list.
Chris@4 237 *
Chris@4 238 * @return integer
Chris@4 239 */
Chris@4 240 public function count()
Chris@4 241 {
Chris@4 242 return $this->numFiles;
Chris@4 243
Chris@4 244 }//end count()
Chris@4 245
Chris@4 246
Chris@4 247 }//end class