1<?php
2/**
3 * PSR2_Sniffs_Namespaces_NamespaceDeclarationSniff.
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 * PSR2_Sniffs_Namespaces_NamespaceDeclarationSniff.
17 *
18 * Ensures namespaces are declared correctly.
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 PSR2_Sniffs_Namespaces_NamespaceDeclarationSniff 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(T_NAMESPACE);
40
41    }//end register()
42
43
44    /**
45     * Processes this test, when one of its tokens is encountered.
46     *
47     * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
48     * @param int                  $stackPtr  The position of the current token in
49     *                                        the stack passed in $tokens.
50     *
51     * @return void
52     */
53    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
54    {
55        $tokens = $phpcsFile->getTokens();
56
57        for ($i = ($stackPtr + 1); $i < ($phpcsFile->numTokens - 1); $i++) {
58            if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) {
59                continue;
60            }
61
62            break;
63        }
64
65        // The $i var now points to the first token on the line after the
66        // namespace declaration, which must be a blank line.
67        $next = $phpcsFile->findNext(T_WHITESPACE, $i, $phpcsFile->numTokens, true);
68        if ($next === false) {
69            return;
70        }
71
72        $diff = ($tokens[$next]['line'] - $tokens[$i]['line']);
73        if ($diff === 1) {
74            return;
75        }
76
77        if ($diff < 0) {
78            $diff = 0;
79        }
80
81        $error = 'There must be one blank line after the namespace declaration';
82        $fix   = $phpcsFile->addFixableError($error, $stackPtr, 'BlankLineAfter');
83
84        if ($fix === true) {
85            if ($diff === 0) {
86                $phpcsFile->fixer->addNewlineBefore($i);
87            } else {
88                $phpcsFile->fixer->beginChangeset();
89                for ($x = $i; $x < $next; $x++) {
90                    if ($tokens[$x]['line'] === $tokens[$next]['line']) {
91                        break;
92                    }
93
94                    $phpcsFile->fixer->replaceToken($x, '');
95                }
96
97                $phpcsFile->fixer->addNewline($i);
98                $phpcsFile->fixer->endChangeset();
99            }
100        }
101
102    }//end process()
103
104
105}//end class
106