1<?php 2/** 3 * Reports errors if the same class or interface name is used in multiple files. 4 * 5 * PHP version 5 6 * 7 * @category PHP 8 * @package PHP_CodeSniffer 9 * @author Greg Sherwood <gsherwood@squiz.net> 10 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) 11 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence 12 * @link http://pear.php.net/package/PHP_CodeSniffer 13 */ 14 15/** 16 * Reports errors if the same class or interface name is used in multiple files. 17 * 18 * @category PHP 19 * @package PHP_CodeSniffer 20 * @author Greg Sherwood <gsherwood@squiz.net> 21 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) 22 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence 23 * @version Release: @package_version@ 24 * @link http://pear.php.net/package/PHP_CodeSniffer 25 */ 26class Generic_Sniffs_Classes_DuplicateClassNameSniff implements PHP_CodeSniffer_Sniff 27{ 28 29 /** 30 * List of classes that have been found during checking. 31 * 32 * @var array 33 */ 34 protected $foundClasses = array(); 35 36 37 /** 38 * Registers the tokens that this sniff wants to listen for. 39 * 40 * @return int[] 41 */ 42 public function register() 43 { 44 return array(T_OPEN_TAG); 45 46 }//end register() 47 48 49 /** 50 * Processes this test, when one of its tokens is encountered. 51 * 52 * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. 53 * @param int $stackPtr The position of the current token 54 * in the stack passed in $tokens. 55 * 56 * @return void 57 */ 58 public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) 59 { 60 $tokens = $phpcsFile->getTokens(); 61 62 $namespace = ''; 63 $findTokens = array( 64 T_CLASS, 65 T_INTERFACE, 66 T_NAMESPACE, 67 T_CLOSE_TAG, 68 ); 69 70 $stackPtr = $phpcsFile->findNext($findTokens, ($stackPtr + 1)); 71 while ($stackPtr !== false) { 72 if ($tokens[$stackPtr]['code'] === T_CLOSE_TAG) { 73 // We can stop here. The sniff will continue from the next open 74 // tag when PHPCS reaches that token, if there is one. 75 return; 76 } 77 78 // Keep track of what namespace we are in. 79 if ($tokens[$stackPtr]['code'] === T_NAMESPACE) { 80 $nsEnd = $phpcsFile->findNext( 81 array( 82 T_NS_SEPARATOR, 83 T_STRING, 84 T_WHITESPACE, 85 ), 86 ($stackPtr + 1), 87 null, 88 true 89 ); 90 91 $namespace = trim($phpcsFile->getTokensAsString(($stackPtr + 1), ($nsEnd - $stackPtr - 1))); 92 $stackPtr = $nsEnd; 93 } else { 94 $nameToken = $phpcsFile->findNext(T_STRING, $stackPtr); 95 $name = $tokens[$nameToken]['content']; 96 if ($namespace !== '') { 97 $name = $namespace.'\\'.$name; 98 } 99 100 $compareName = strtolower($name); 101 if (isset($this->foundClasses[$compareName]) === true) { 102 $type = strtolower($tokens[$stackPtr]['content']); 103 $file = $this->foundClasses[$compareName]['file']; 104 $line = $this->foundClasses[$compareName]['line']; 105 $error = 'Duplicate %s name "%s" found; first defined in %s on line %s'; 106 $data = array( 107 $type, 108 $name, 109 $file, 110 $line, 111 ); 112 $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); 113 } else { 114 $this->foundClasses[$compareName] = array( 115 'file' => $phpcsFile->getFilename(), 116 'line' => $tokens[$stackPtr]['line'], 117 ); 118 } 119 }//end if 120 121 $stackPtr = $phpcsFile->findNext($findTokens, ($stackPtr + 1)); 122 }//end while 123 124 }//end process() 125 126 127}//end class 128