11
11
class ReservedWordsSniff implements PHP_CodeSniffer_Sniff
12
12
{
13
13
/**
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.
15
16
*
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[]
17
20
*/
18
21
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 ' ,
30
35
];
31
36
32
37
/**
33
38
* {@inheritdoc}
34
39
*/
35
40
public function register ()
36
41
{
37
- return [T_NAMESPACE , T_CLASS ];
42
+ return [T_CLASS , T_INTERFACE , T_TRAIT , T_NAMESPACE ];
38
43
}
39
44
40
45
/**
@@ -44,20 +49,23 @@ public function register()
44
49
* @param int $stackPtr
45
50
* @return void
46
51
*/
47
- protected function validateNameSpace (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
52
+ protected function validateNamespace (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
48
53
{
49
- $ skippedTokens = ['T_NS_SEPARATOR ' , 'T_WHITESPACE ' ];
50
- //skip "namespace" and whitespace
51
54
$ stackPtr += 2 ;
52
55
$ 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
56
59
continue ;
57
60
}
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
+ );
61
69
}
62
70
$ stackPtr ++;
63
71
}
@@ -73,12 +81,15 @@ protected function validateNameSpace(PHP_CodeSniffer_File $sourceFile, $stackPtr
73
81
protected function validateClass (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
74
82
{
75
83
$ tokens = $ sourceFile ->getTokens ();
76
- //skipped "class" and whitespace
77
- $ stackPtr += 2 ;
84
+ $ stackPtr += 2 ; //skip "class" and whitespace
78
85
$ 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
+ );
82
93
}
83
94
}
84
95
@@ -88,12 +99,14 @@ protected function validateClass(PHP_CodeSniffer_File $sourceFile, $stackPtr)
88
99
public function process (PHP_CodeSniffer_File $ sourceFile , $ stackPtr )
89
100
{
90
101
$ 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 :
93
106
$ this ->validateClass ($ sourceFile , $ stackPtr );
94
107
break ;
95
- case " T_NAMESPACE " :
96
- $ this ->validateNameSpace ($ sourceFile , $ stackPtr );
108
+ case T_NAMESPACE :
109
+ $ this ->validateNamespace ($ sourceFile , $ stackPtr );
97
110
break ;
98
111
}
99
112
}
0 commit comments