1111class ReservedWordsSniff implements PHP_CodeSniffer_Sniff
1212{
1313 /**
14- * source: http://php.net/manual/en/reserved.other-reserved-words.php
14+ * The following words cannot be used to name a class, interface or trait,
15+ * and they are also prohibited from being used in namespaces.
1516 *
16- * @var array PHP 7 reserved words for name spaces
17+ * @link http://php.net/manual/en/reserved.other-reserved-words.php
18+ *
19+ * @var string[]
1720 */
1821 protected $ reservedWords = [
19- 'int ' ,
20- 'float ' ,
21- 'bool ' ,
22- 'string ' ,
23- 'true ' ,
24- 'false ' ,
25- 'null ' ,
26- 'resource ' ,
27- 'object ' ,
28- 'mixed ' ,
29- 'numeric ' ,
22+ 'int ' => '7 ' ,
23+ 'float ' => '7 ' ,
24+ 'bool ' => '7 ' ,
25+ 'string ' => '7 ' ,
26+ 'true ' => '7 ' ,
27+ 'false ' => '7 ' ,
28+ 'null ' => '7 ' ,
29+ 'void ' => '7.1 ' ,
30+ 'iterable ' => '7.1 ' ,
31+ 'resource ' => '7 ' ,
32+ 'object ' => '7 ' ,
33+ 'mixed ' => '7 ' ,
34+ 'numeric ' => '7 ' ,
3035 ];
3136
3237 /**
3338 * {@inheritdoc}
3439 */
3540 public function register ()
3641 {
37- return [T_NAMESPACE , T_CLASS ];
42+ return [T_CLASS , T_INTERFACE , T_TRAIT , T_NAMESPACE ];
3843 }
3944
4045 /**
@@ -44,20 +49,23 @@ public function register()
4449 * @param int $stackPtr
4550 * @return void
4651 */
47- protected function validateNameSpace (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
52+ protected function validateNamespace (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
4853 {
49- $ skippedTokens = ['T_NS_SEPARATOR ' , 'T_WHITESPACE ' ];
50- //skip "namespace" and whitespace
5154 $ stackPtr += 2 ;
5255 $ tokens = $ sourceFile ->getTokens ();
53- while (' T_SEMICOLON ' != $ tokens [$ stackPtr ]['type ' ] ) {
54- if (in_array ( $ tokens [$ stackPtr ]['type ' ], $ skippedTokens ) ) {
55- $ stackPtr ++;
56+ while ($ stackPtr < $ sourceFile -> numTokens && $ tokens [$ stackPtr ]['code ' ] !== T_SEMICOLON ) {
57+ if ($ tokens [$ stackPtr ]['code ' ] === T_WHITESPACE || $ tokens [ $ stackPtr ][ ' code ' ] === T_NS_SEPARATOR ) {
58+ $ stackPtr ++; //skip "namespace" and whitespace
5659 continue ;
5760 }
58- $ nameSpacePart = strtolower ($ tokens [$ stackPtr ]['content ' ]);
59- if (in_array ($ nameSpacePart , $ this ->reservedWords )) {
60- $ sourceFile ->addError ('\'' . $ nameSpacePart . '\' is a reserved word in PHP 7. ' , $ stackPtr );
61+ $ namespacePart = $ tokens [$ stackPtr ]['content ' ];
62+ if (isset ($ this ->reservedWords [strtolower ($ namespacePart )])) {
63+ $ sourceFile ->addError (
64+ 'Cannot use "%s" in namespace as it is reserved since PHP %s ' ,
65+ $ stackPtr ,
66+ 'Namespace ' ,
67+ [$ namespacePart , $ this ->reservedWords [$ namespacePart ]]
68+ );
6169 }
6270 $ stackPtr ++;
6371 }
@@ -73,12 +81,15 @@ protected function validateNameSpace(PHP_CodeSniffer_File $sourceFile, $stackPtr
7381 protected function validateClass (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
7482 {
7583 $ tokens = $ sourceFile ->getTokens ();
76- //skipped "class" and whitespace
77- $ stackPtr += 2 ;
84+ $ stackPtr += 2 ; //skip "class" and whitespace
7885 $ className = strtolower ($ tokens [$ stackPtr ]['content ' ]);
79-
80- if (in_array ($ className , $ this ->reservedWords )) {
81- $ sourceFile ->addError ('Class name \'' . $ className . '\' is a reserved word in PHP 7 ' , $ stackPtr );
86+ if (isset ($ this ->reservedWords [$ className ])) {
87+ $ sourceFile ->addError (
88+ 'Cannot use "%s" as class name as it is reserved since PHP %s ' ,
89+ $ stackPtr ,
90+ 'Class ' ,
91+ [$ className , $ this ->reservedWords [$ className ]]
92+ );
8293 }
8394 }
8495
@@ -88,12 +99,14 @@ protected function validateClass(PHP_CodeSniffer_File $sourceFile, $stackPtr)
8899 public function process (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
89100 {
90101 $ tokens = $ sourceFile ->getTokens ();
91- switch ($ tokens [$ stackPtr ]['type ' ]) {
92- case "T_CLASS " :
102+ switch ($ tokens [$ stackPtr ]['code ' ]) {
103+ case T_CLASS :
104+ case T_INTERFACE :
105+ case T_TRAIT :
93106 $ this ->validateClass ($ sourceFile , $ stackPtr );
94107 break ;
95- case " T_NAMESPACE " :
96- $ this ->validateNameSpace ($ sourceFile , $ stackPtr );
108+ case T_NAMESPACE :
109+ $ this ->validateNamespace ($ sourceFile , $ stackPtr );
97110 break ;
98111 }
99112 }
0 commit comments