Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
/**
3
 * Sniffs_Squiz_WhiteSpace_OperatorSpacingSniff.
4
 *
5
 * PHP version 5
6
 *
7
 * @category  PHP
8
 * @package   PHP_CodeSniffer
9
 * @author    Greg Sherwood <gsherwood@squiz.net>
10
 * @author    Marc McIntyre <mmcintyre@squiz.net>
11
 * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600)
12
 * @license   http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
13
 * @version   CVS: $Id: OperatorSpacingSniff.php 270270 2008-12-01 23:25:16Z squiz $
14
 * @link      http://pear.php.net/package/PHP_CodeSniffer
15
 */
16
 
17
/**
18
 * Sniffs_Squiz_WhiteSpace_OperatorSpacingSniff.
19
 *
20
 * Verifies that operators have valid spacing surrounding them.
21
 *
22
 * @category  PHP
23
 * @package   PHP_CodeSniffer
24
 * @author    Greg Sherwood <gsherwood@squiz.net>
25
 * @author    Marc McIntyre <mmcintyre@squiz.net>
26
 * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600)
27
 * @license   http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
28
 * @version   Release: 1.2.1
29
 * @link      http://pear.php.net/package/PHP_CodeSniffer
30
 */
31
class Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff implements PHP_CodeSniffer_Sniff
32
{
33
 
34
    /**
35
     * A list of tokenizers this sniff supports.
36
     *
37
     * @var array
38
     */
39
    public $supportedTokenizers = array(
40
                                   'PHP',
41
                                   'JS',
42
                                  );
43
 
44
 
45
    /**
46
     * Returns an array of tokens this test wants to listen for.
47
     *
48
     * @return array
49
     */
50
    public function register()
51
    {
52
        $comparison = PHP_CodeSniffer_Tokens::$comparisonTokens;
53
        $operators  = PHP_CodeSniffer_Tokens::$operators;
54
        $assignment = PHP_CodeSniffer_Tokens::$assignmentTokens;
55
 
56
        return array_unique(array_merge($comparison, $operators, $assignment));
57
 
58
    }//end register()
59
 
60
 
61
    /**
62
     * Processes this sniff, when one of its tokens is encountered.
63
     *
64
     * @param PHP_CodeSniffer_File $phpcsFile The current file being checked.
65
     * @param int                  $stackPtr  The position of the current token in the
66
     *                                        stack passed in $tokens.
67
     *
68
     * @return void
69
     */
70
    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
71
    {
72
        $tokens = $phpcsFile->getTokens();
73
 
74
        if ($tokens[$stackPtr]['code'] === T_EQUAL) {
75
            // Skip for '=&' case.
76
            if (isset($tokens[($stackPtr + 1)]) === true && $tokens[($stackPtr + 1)]['code'] === T_BITWISE_AND) {
77
                return;
78
            }
79
 
80
            // Skip default values in function declarations.
81
            if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) {
82
                $bracket = end($tokens[$stackPtr]['nested_parenthesis']);
83
                if (isset($tokens[$bracket]['parenthesis_owner']) === true) {
84
                    $function = $tokens[$bracket]['parenthesis_owner'];
85
                    if ($tokens[$function]['code'] === T_FUNCTION) {
86
                        return;
87
                    }
88
                }
89
            }
90
        }
91
 
92
        if ($tokens[$stackPtr]['code'] === T_BITWISE_AND) {
93
            // If its not a reference, then we expect one space either side of the
94
            // bitwise operator.
95
            if ($phpcsFile->isReference($stackPtr) === false) {
96
                // Check there is one space before the & operator.
97
                if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) {
98
                    $error = 'Expected 1 space before "&" operator; 0 found';
99
                    $phpcsFile->addError($error, $stackPtr);
100
                } else {
101
                    if (strlen($tokens[($stackPtr - 1)]['content']) !== 1) {
102
                        $found = strlen($tokens[($stackPtr - 1)]['content']);
103
                        $error = "Expected 1 space before \"&\" operator; $found found";
104
                        $phpcsFile->addError($error, $stackPtr);
105
                    }
106
                }
107
 
108
                // Check there is one space after the & operator.
109
                if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
110
                    $error = 'Expected 1 space after "&" operator; 0 found';
111
                    $phpcsFile->addError($error, $stackPtr);
112
                } else {
113
                    if (strlen($tokens[($stackPtr + 1)]['content']) !== 1) {
114
                        $found = strlen($tokens[($stackPtr + 1)]['content']);
115
                        $error = "Expected 1 space after \"&\" operator; $found found";
116
                        $phpcsFile->addError($error, $stackPtr);
117
                    }
118
                }
119
            }//end if
120
        } else {
121
            if ($tokens[$stackPtr]['code'] === T_MINUS) {
122
                // Check minus spacing, but make sure we aren't just assigning
123
                // a minus value or returning one.
124
                $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true);
125
                if ($tokens[$prev]['code'] === T_RETURN) {
126
                    // Just returning a negative value; eg. return -1.
127
                    return;
128
                }
129
 
130
                if (in_array($tokens[$prev]['code'], PHP_CodeSniffer_Tokens::$operators) === true) {
131
                    // Just trying to operate on a negative value; eg. ($var * -1).
132
                    return;
133
                }
134
 
135
                if (in_array($tokens[$prev]['code'], PHP_CodeSniffer_Tokens::$comparisonTokens) === true) {
136
                    // Just trying to compare a negative value; eg. ($var === -1).
137
                    return;
138
                }
139
 
140
                // A list of tokens that indicate that the token is not
141
                // part of an arithmetic operation.
142
                $invalidTokens = array(
143
                                  T_COMMA,
144
                                  T_OPEN_PARENTHESIS,
145
                                  T_OPEN_SQUARE_BRACKET,
146
                                 );
147
 
148
                if (in_array($tokens[$prev]['code'], $invalidTokens) === true) {
149
                    // Just trying to use a negative value; eg. myFunction($var, -2).
150
                    return;
151
                }
152
 
153
                $number = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true);
154
                if ($tokens[$number]['code'] === T_LNUMBER) {
155
                    $semi = $phpcsFile->findNext(T_WHITESPACE, ($number + 1), null, true);
156
                    if ($tokens[$semi]['code'] === T_SEMICOLON) {
157
                        if ($prev !== false && (in_array($tokens[$prev]['code'], PHP_CodeSniffer_Tokens::$assignmentTokens) === true)) {
158
                            // This is a negative assignment.
159
                            return;
160
                        }
161
                    }
162
                }
163
            }//end if
164
 
165
            $operator = $tokens[$stackPtr]['content'];
166
 
167
            if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE) {
168
                $error = "Expected 1 space before \"$operator\"; 0 found";
169
                $phpcsFile->addError($error, $stackPtr);
170
            } else if (strlen($tokens[($stackPtr - 1)]['content']) !== 1) {
171
                // Don't throw an error for assignments, because other standards allow
172
                // multiple spaces there to align multiple assignments.
173
                if (in_array($tokens[$stackPtr]['code'], PHP_CodeSniffer_Tokens::$assignmentTokens) === false) {
174
                    $found = strlen($tokens[($stackPtr - 1)]['content']);
175
                    $error = "Expected 1 space before \"$operator\"; $found found";
176
                    $phpcsFile->addError($error, $stackPtr);
177
                }
178
            }
179
 
180
            if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
181
                $error = "Expected 1 space after \"$operator\"; 0 found";
182
                $phpcsFile->addError($error, $stackPtr);
183
            } else if (strlen($tokens[($stackPtr + 1)]['content']) !== 1) {
184
                $found = strlen($tokens[($stackPtr + 1)]['content']);
185
                $error = "Expected 1 space after \"$operator\"; $found found";
186
                $phpcsFile->addError($error, $stackPtr);
187
            }
188
 
189
        }//end if
190
 
191
    }//end process()
192
 
193
 
194
}//end class
195
 
196
?>