1<?php
2/**
3 * Squiz_Sniffs_WhiteSpace_LanguageConstructSpacingSniff.
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-2014 Squiz Pty Ltd (ABN 77 084 670 600)
12 * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
13 * @link      http://pear.php.net/package/PHP_CodeSniffer
14 */
15
16/**
17 * Squiz_Sniffs_WhiteSpace_LanguageConstructSpacingSniff.
18 *
19 * Ensures all language constructs (without brackets) contain a
20 * single space between themselves and their content.
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-2014 Squiz Pty Ltd (ABN 77 084 670 600)
27 * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
28 * @version   Release: @package_version@
29 * @link      http://pear.php.net/package/PHP_CodeSniffer
30 */
31class Squiz_Sniffs_WhiteSpace_LanguageConstructSpacingSniff implements PHP_CodeSniffer_Sniff
32{
33
34
35    /**
36     * Returns an array of tokens this test wants to listen for.
37     *
38     * @return array
39     */
40    public function register()
41    {
42        return array(
43                T_ECHO,
44                T_PRINT,
45                T_RETURN,
46                T_INCLUDE,
47                T_INCLUDE_ONCE,
48                T_REQUIRE,
49                T_REQUIRE_ONCE,
50                T_NEW,
51               );
52
53    }//end register()
54
55
56    /**
57     * Processes this test, when one of its tokens is encountered.
58     *
59     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
60     * @param int                  $stackPtr  The position of the current token in
61     *                                        the stack passed in $tokens.
62     *
63     * @return void
64     */
65    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
66    {
67        $tokens = $phpcsFile->getTokens();
68
69        if ($tokens[($stackPtr + 1)]['code'] === T_SEMICOLON) {
70            // No content for this language construct.
71            return;
72        }
73
74        if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) {
75            $content       = $tokens[($stackPtr + 1)]['content'];
76            $contentLength = strlen($content);
77            if ($contentLength !== 1) {
78                $error = 'Language constructs must be followed by a single space; expected 1 space but found %s';
79                $data  = array($contentLength);
80                $fix   = $phpcsFile->addFixableError($error, $stackPtr, 'IncorrectSingle', $data);
81                if ($fix === true) {
82                    $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' ');
83                }
84            }
85        } else if ($tokens[($stackPtr + 1)]['code'] !== T_OPEN_PARENTHESIS) {
86            $error = 'Language constructs must be followed by a single space; expected "%s" but found "%s"';
87            $data  = array(
88                      $tokens[$stackPtr]['content'].' '.$tokens[($stackPtr + 1)]['content'],
89                      $tokens[$stackPtr]['content'].$tokens[($stackPtr + 1)]['content'],
90                     );
91            $fix   = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data);
92            if ($fix === true) {
93                $phpcsFile->fixer->addContent($stackPtr, ' ');
94            }
95        }//end if
96
97    }//end process()
98
99
100}//end class
101