1<?php
2/**
3 * Generic_Sniffs_PHP_LowerCaseKeywordSniff.
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 * Generic_Sniffs_PHP_LowerCaseKeywordSniff.
17 *
18 * Checks that all PHP keywords are lowercase.
19 *
20 * @category  PHP
21 * @package   PHP_CodeSniffer
22 * @author    Greg Sherwood <gsherwood@squiz.net>
23 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
24 * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
25 * @version   Release: @package_version@
26 * @link      http://pear.php.net/package/PHP_CodeSniffer
27 */
28class Generic_Sniffs_PHP_LowerCaseKeywordSniff implements PHP_CodeSniffer_Sniff
29{
30
31
32    /**
33     * Returns an array of tokens this test wants to listen for.
34     *
35     * @return array
36     */
37    public function register()
38    {
39        return array(
40                T_HALT_COMPILER,
41                T_ABSTRACT,
42                T_ARRAY,
43                T_ARRAY_HINT,
44                T_AS,
45                T_BREAK,
46                T_CALLABLE,
47                T_CASE,
48                T_CATCH,
49                T_CLASS,
50                T_CLONE,
51                T_CONST,
52                T_CONTINUE,
53                T_DECLARE,
54                T_DEFAULT,
55                T_DO,
56                T_ECHO,
57                T_ELSE,
58                T_ELSEIF,
59                T_EMPTY,
60                T_ENDDECLARE,
61                T_ENDFOR,
62                T_ENDFOREACH,
63                T_ENDIF,
64                T_ENDSWITCH,
65                T_ENDWHILE,
66                T_EVAL,
67                T_EXIT,
68                T_EXTENDS,
69                T_FINAL,
70                T_FINALLY,
71                T_FOR,
72                T_FOREACH,
73                T_FUNCTION,
74                T_GLOBAL,
75                T_GOTO,
76                T_IF,
77                T_IMPLEMENTS,
78                T_INCLUDE,
79                T_INCLUDE_ONCE,
80                T_INSTANCEOF,
81                T_INSTEADOF,
82                T_INTERFACE,
83                T_ISSET,
84                T_LIST,
85                T_LOGICAL_AND,
86                T_LOGICAL_OR,
87                T_LOGICAL_XOR,
88                T_NAMESPACE,
89                T_NEW,
90                T_PRINT,
91                T_PRIVATE,
92                T_PROTECTED,
93                T_PUBLIC,
94                T_REQUIRE,
95                T_REQUIRE_ONCE,
96                T_RETURN,
97                T_STATIC,
98                T_SWITCH,
99                T_THROW,
100                T_TRAIT,
101                T_TRY,
102                T_UNSET,
103                T_USE,
104                T_VAR,
105                T_WHILE,
106               );
107
108    }//end register()
109
110
111    /**
112     * Processes this sniff, when one of its tokens is encountered.
113     *
114     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
115     * @param int                  $stackPtr  The position of the current token in the
116     *                                        stack passed in $tokens.
117     *
118     * @return void
119     */
120    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
121    {
122        $tokens  = $phpcsFile->getTokens();
123        $keyword = $tokens[$stackPtr]['content'];
124        if (strtolower($keyword) !== $keyword) {
125            if ($keyword === strtoupper($keyword)) {
126                $phpcsFile->recordMetric($stackPtr, 'PHP keyword case', 'upper');
127            } else {
128                $phpcsFile->recordMetric($stackPtr, 'PHP keyword case', 'mixed');
129            }
130
131            $error = 'PHP keywords must be lowercase; expected "%s" but found "%s"';
132            $data  = array(
133                      strtolower($keyword),
134                      $keyword,
135                     );
136
137            $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Found', $data);
138            if ($fix === true) {
139                $phpcsFile->fixer->replaceToken($stackPtr, strtolower($keyword));
140            }
141        } else {
142            $phpcsFile->recordMetric($stackPtr, 'PHP keyword case', 'lower');
143        }
144
145    }//end process()
146
147
148}//end class
149