Skip to content

Commit a5ac762

Browse files
committed
New sniffs for enforcing require strict types & formatting of declare statements (ref #2365)
1 parent 9c965b1 commit a5ac762

9 files changed

+579
-0
lines changed

package.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
402402
<file baseinstalldir="PHP/CodeSniffer" name="LowerCaseKeywordSniff.php" role="php" />
403403
<file baseinstalldir="PHP/CodeSniffer" name="LowerCaseTypeSniff.php" role="php" />
404404
<file baseinstalldir="PHP/CodeSniffer" name="NoSilencedErrorsSniff.php" role="php" />
405+
<file baseinstalldir="PHP/CodeSniffer" name="RequireStrictTypesSniff.php" role="php" />
405406
<file baseinstalldir="PHP/CodeSniffer" name="SAPIUsageSniff.php" role="php" />
406407
<file baseinstalldir="PHP/CodeSniffer" name="SyntaxSniff.php" role="php" />
407408
<file baseinstalldir="PHP/CodeSniffer" name="UpperCaseConstantSniff.php" role="php" />
@@ -670,6 +671,9 @@ http://pear.php.net/dtd/package-2.0.xsd">
670671
<file baseinstalldir="PHP/CodeSniffer" name="LowerCaseTypeUnitTest.php" role="test" />
671672
<file baseinstalldir="PHP/CodeSniffer" name="NoSilencedErrorsUnitTest.inc" role="test" />
672673
<file baseinstalldir="PHP/CodeSniffer" name="NoSilencedErrorsUnitTest.php" role="test" />
674+
<file baseinstalldir="PHP/CodeSniffer" name="RequireStrictTypesUnitTest.1.inc" role="test" />
675+
<file baseinstalldir="PHP/CodeSniffer" name="RequireStrictTypesUnitTest.2.inc" role="test" />
676+
<file baseinstalldir="PHP/CodeSniffer" name="RequireStrictTypesUnitTest.php" role="test" />
673677
<file baseinstalldir="PHP/CodeSniffer" name="SAPIUsageUnitTest.inc" role="test" />
674678
<file baseinstalldir="PHP/CodeSniffer" name="SAPIUsageUnitTest.php" role="test" />
675679
<file baseinstalldir="PHP/CodeSniffer" name="SyntaxUnitTest.inc" role="test" />
@@ -1039,6 +1043,9 @@ http://pear.php.net/dtd/package-2.0.xsd">
10391043
<dir name="Classes">
10401044
<file baseinstalldir="PHP/CodeSniffer" name="ClassInstantiationSniff.php" role="php" />
10411045
</dir>
1046+
<dir name="Files">
1047+
<file baseinstalldir="PHP/CodeSniffer" name="DeclareStatementSniff.php" role="php" />
1048+
</dir>
10421049
<dir name="Functions">
10431050
<file baseinstalldir="PHP/CodeSniffer" name="NullableTypeDeclarationSniff.php" role="php" />
10441051
</dir>
@@ -1058,6 +1065,11 @@ http://pear.php.net/dtd/package-2.0.xsd">
10581065
<file baseinstalldir="PHP/CodeSniffer" name="ClassInstantiationUnitTest.inc.fixed" role="test" />
10591066
<file baseinstalldir="PHP/CodeSniffer" name="ClassInstantiationUnitTest.php" role="test" />
10601067
</dir>
1068+
<dir name="Files">
1069+
<file baseinstalldir="PHP/CodeSniffer" name="DeclareStatementUnitTest.inc" role="test" />
1070+
<file baseinstalldir="PHP/CodeSniffer" name="DeclareStatementUnitTest.inc.fixed" role="test" />
1071+
<file baseinstalldir="PHP/CodeSniffer" name="DeclareStatementUnitTest.php" role="test" />
1072+
</dir>
10611073
<dir name="Functions">
10621074
<file baseinstalldir="PHP/CodeSniffer" name="NullableTypeDeclarationUnitTest.inc" role="test" />
10631075
<file baseinstalldir="PHP/CodeSniffer" name="NullableTypeDeclarationUnitTest.inc.fixed" role="test" />
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
/**
3+
* Checks that the strict_types has been declared.
4+
*
5+
* @author Sertan Danis <sdanis@squiz.net>
6+
* @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600)
7+
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
8+
*/
9+
10+
namespace PHP_CodeSniffer\Standards\Generic\Sniffs\PHP;
11+
12+
use PHP_CodeSniffer\Sniffs\Sniff;
13+
use PHP_CodeSniffer\Files\File;
14+
15+
class RequireStrictTypesSniff implements Sniff
16+
{
17+
18+
19+
/**
20+
* Returns an array of tokens this test wants to listen for.
21+
*
22+
* @return array
23+
*/
24+
public function register()
25+
{
26+
return [T_OPEN_TAG];
27+
28+
}//end register()
29+
30+
31+
/**
32+
* Processes this sniff, when one of its tokens is encountered.
33+
*
34+
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
35+
* @param int $stackPtr The position of the current token in
36+
* the stack passed in $tokens.
37+
*
38+
* @return int
39+
*/
40+
public function process(File $phpcsFile, $stackPtr)
41+
{
42+
$tokens = $phpcsFile->getTokens();
43+
$declare = $phpcsFile->findNext(T_DECLARE, $stackPtr);
44+
$found = false;
45+
46+
if ($declare !== false) {
47+
$nextString = $phpcsFile->findNext(T_STRING, $declare);
48+
49+
if ($nextString !== false) {
50+
if (strtolower($tokens[$nextString]['content']) === 'strict_types') {
51+
// There is a strict types declaration.
52+
$found = true;
53+
}
54+
}
55+
}
56+
57+
if ($found === false) {
58+
$error = 'Missing required strict_types declaration';
59+
$phpcsFile->addError($error, $stackPtr, 'MissingDeclaration');
60+
}
61+
62+
// Skip the rest of the file so we don't pick up additional
63+
// open tags, typically embedded in HTML.
64+
return $phpcsFile->numTokens;
65+
66+
}//end process()
67+
68+
69+
}//end class
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
4+
declare(strict_types=1);
5+
6+
declare(ticks=1) {
7+
// some code
8+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?php
2+
declare(ticks=1);
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
/**
3+
* Unit test class for the RequireStrictType sniff.
4+
*
5+
* @author Sertan Danis <sdanis@squiz.net>
6+
* @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600)
7+
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
8+
*/
9+
10+
namespace PHP_CodeSniffer\Standards\Generic\Tests\PHP;
11+
12+
use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest;
13+
14+
class RequireStrictTypesUnitTest extends AbstractSniffUnitTest
15+
{
16+
17+
18+
/**
19+
* Returns the lines where errors should occur.
20+
*
21+
* The key of the array should represent the line number and the value
22+
* should represent the number of errors that should occur on that line.
23+
*
24+
* @param string $testFile The name of the file being tested.
25+
*
26+
* @return array<int, int>
27+
*/
28+
public function getErrorList($testFile='')
29+
{
30+
switch ($testFile) {
31+
case 'RequireStrictTypesUnitTest.1.inc':
32+
return [];
33+
break;
34+
}
35+
36+
return [1 => 1];
37+
38+
}//end getErrorList()
39+
40+
41+
/**
42+
* Returns the lines where warnings should occur.
43+
*
44+
* The key of the array should represent the line number and the value
45+
* should represent the number of warnings that should occur on that line.
46+
*
47+
* @return array<int, int>
48+
*/
49+
public function getWarningList()
50+
{
51+
return [];
52+
53+
}//end getWarningList()
54+
55+
56+
}//end class

0 commit comments

Comments
 (0)