|
23 | 23 | * @version Release: @package_version@
|
24 | 24 | * @link http://pear.php.net/package/PHP_CodeSniffer
|
25 | 25 | */
|
26 |
| -class Generic_Sniffs_Classes_DuplicateClassNameSniff implements PHP_CodeSniffer_MultiFileSniff |
| 26 | +class Generic_Sniffs_Classes_DuplicateClassNameSniff implements PHP_CodeSniffer_Sniff |
27 | 27 | {
|
28 | 28 |
|
| 29 | + /** |
| 30 | + * List of classes that have been found during checking. |
| 31 | + * |
| 32 | + * @var array |
| 33 | + */ |
| 34 | + public $foundClasses = array(); |
| 35 | + |
| 36 | + |
| 37 | + /** |
| 38 | + * Registers the tokens that this sniff wants to listen for. |
| 39 | + * |
| 40 | + * @return array(integer) |
| 41 | + */ |
| 42 | + public function register() |
| 43 | + { |
| 44 | + return array(T_OPEN_TAG); |
| 45 | + |
| 46 | + }//end register() |
| 47 | + |
29 | 48 |
|
30 | 49 | /**
|
31 |
| - * Called once per script run to allow for processing of this sniff. |
| 50 | + * Processes this test, when one of its tokens is encountered. |
32 | 51 | *
|
33 |
| - * @param array(PHP_CodeSniffer_File) $files The PHP_CodeSniffer files processed |
34 |
| - * during the script run. |
| 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. |
35 | 55 | *
|
36 | 56 | * @return void
|
37 | 57 | */
|
38 |
| - public function process(array $files) |
| 58 | + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) |
39 | 59 | {
|
40 |
| - $foundClasses = array(); |
| 60 | + $tokens = $phpcsFile->getTokens(); |
41 | 61 |
|
42 |
| - foreach ($files as $phpcsFile) { |
43 |
| - $tokens = $phpcsFile->getTokens(); |
| 62 | + $namespace = ''; |
| 63 | + $stackPtr = $phpcsFile->findNext(array(T_CLASS, T_INTERFACE, T_NAMESPACE), 0); |
| 64 | + while ($stackPtr !== false) { |
| 65 | + // Keep track of what namespace we are in. |
| 66 | + if ($tokens[$stackPtr]['code'] === T_NAMESPACE) { |
| 67 | + $nsEnd = $phpcsFile->findNext( |
| 68 | + array(T_NS_SEPARATOR, T_STRING, T_WHITESPACE), |
| 69 | + ($stackPtr + 1), |
| 70 | + null, |
| 71 | + true |
| 72 | + ); |
44 | 73 |
|
45 |
| - $namespace = ''; |
46 |
| - $stackPtr = $phpcsFile->findNext(array(T_CLASS, T_INTERFACE, T_NAMESPACE), 0); |
47 |
| - while ($stackPtr !== false) { |
48 |
| - // Keep track of what namespace we are in. |
49 |
| - if ($tokens[$stackPtr]['code'] === T_NAMESPACE) { |
50 |
| - $nsEnd = $phpcsFile->findNext( |
51 |
| - array(T_NS_SEPARATOR, T_STRING, T_WHITESPACE), |
52 |
| - ($stackPtr + 1), |
53 |
| - null, |
54 |
| - true |
55 |
| - ); |
| 74 | + $namespace = trim($phpcsFile->getTokensAsString(($stackPtr + 1), ($nsEnd - $stackPtr - 1))); |
| 75 | + $stackPtr = $nsEnd; |
| 76 | + } else { |
| 77 | + $nameToken = $phpcsFile->findNext(T_STRING, $stackPtr); |
| 78 | + $name = $tokens[$nameToken]['content']; |
| 79 | + if ($namespace !== '') { |
| 80 | + $name = $namespace.'\\'.$name; |
| 81 | + } |
56 | 82 |
|
57 |
| - $namespace = trim($phpcsFile->getTokensAsString(($stackPtr + 1), ($nsEnd - $stackPtr - 1))); |
58 |
| - $stackPtr = $nsEnd; |
| 83 | + $compareName = strtolower($name); |
| 84 | + if (isset($this->foundClasses[$compareName]) === true) { |
| 85 | + $type = strtolower($tokens[$stackPtr]['content']); |
| 86 | + $file = $this->foundClasses[$compareName]['file']; |
| 87 | + $line = $this->foundClasses[$compareName]['line']; |
| 88 | + $error = 'Duplicate %s name "%s" found; first defined in %s on line %s'; |
| 89 | + $data = array( |
| 90 | + $type, |
| 91 | + $name, |
| 92 | + $file, |
| 93 | + $line, |
| 94 | + ); |
| 95 | + $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); |
59 | 96 | } else {
|
60 |
| - $nameToken = $phpcsFile->findNext(T_STRING, $stackPtr); |
61 |
| - $name = $tokens[$nameToken]['content']; |
62 |
| - if ($namespace !== '') { |
63 |
| - $name = $namespace.'\\'.$name; |
64 |
| - } |
65 |
| - |
66 |
| - $compareName = strtolower($name); |
67 |
| - if (isset($foundClasses[$compareName]) === true) { |
68 |
| - $type = strtolower($tokens[$stackPtr]['content']); |
69 |
| - $file = $foundClasses[$compareName]['file']; |
70 |
| - $line = $foundClasses[$compareName]['line']; |
71 |
| - $error = 'Duplicate %s name "%s" found; first defined in %s on line %s'; |
72 |
| - $data = array( |
73 |
| - $type, |
74 |
| - $name, |
75 |
| - $file, |
76 |
| - $line, |
77 |
| - ); |
78 |
| - $phpcsFile->addWarning($error, $stackPtr, 'Found', $data); |
79 |
| - } else { |
80 |
| - $foundClasses[$compareName] = array( |
81 |
| - 'file' => $phpcsFile->getFilename(), |
82 |
| - 'line' => $tokens[$stackPtr]['line'], |
83 |
| - ); |
84 |
| - } |
| 97 | + $this->foundClasses[$compareName] = array( |
| 98 | + 'file' => $phpcsFile->getFilename(), |
| 99 | + 'line' => $tokens[$stackPtr]['line'], |
| 100 | + ); |
85 | 101 | }
|
| 102 | + } |
86 | 103 |
|
87 |
| - $stackPtr = $phpcsFile->findNext(array(T_CLASS, T_INTERFACE, T_NAMESPACE), ($stackPtr + 1)); |
88 |
| - }//end while |
89 |
| - |
90 |
| - }//end foreach |
| 104 | + $stackPtr = $phpcsFile->findNext(array(T_CLASS, T_INTERFACE, T_NAMESPACE), ($stackPtr + 1)); |
| 105 | + }//end while |
91 | 106 |
|
92 | 107 | }//end process()
|
93 | 108 |
|
|
0 commit comments