diff --git a/package.xml b/package.xml
index c89d8a63ae..16c45500b5 100644
--- a/package.xml
+++ b/package.xml
@@ -54,6 +54,8 @@ http://pear.php.net/dtd/package-2.0.xsd">
-- Enforce the use of a strict types declaration in PHP files
- Added PSR12.Files.DeclareStatement sniff
-- Enforces the formatting of declare statements within a file
+ - Added PSR12.Functions.ReturnTypeDeclaration sniff
+ -- Enforces the formatting of return type declarations in functions and closures
- Added PSR12.Properties.ConstantVisibility sniff
-- Enforces that constants must have their visibility defined
-- Uses a warning instead of an error due to this conditionally requiring the project to support PHP 7.1+
@@ -1090,6 +1092,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
+
@@ -1122,6 +1125,9 @@ http://pear.php.net/dtd/package-2.0.xsd">
+
+
+
diff --git a/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php b/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php
new file mode 100644
index 0000000000..c26877baae
--- /dev/null
+++ b/src/Standards/PSR12/Sniffs/Functions/ReturnTypeDeclarationSniff.php
@@ -0,0 +1,106 @@
+
+ * @copyright 2006-2019 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
+ */
+
+namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Functions;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+use PHP_CodeSniffer\Util\Tokens;
+
+class ReturnTypeDeclarationSniff implements Sniff
+{
+
+
+ /**
+ * Returns an array of tokens this test wants to listen for.
+ *
+ * @return array
+ */
+ public function register()
+ {
+ return [
+ T_FUNCTION,
+ T_CLOSURE,
+ ];
+
+ }//end register()
+
+
+ /**
+ * Processes this test when one of its tokens is encountered.
+ *
+ * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
+ * @param int $stackPtr The position of the current token
+ * in the stack passed in $tokens.
+ *
+ * @return void
+ */
+ public function process(File $phpcsFile, $stackPtr)
+ {
+ $tokens = $phpcsFile->getTokens();
+
+ if (isset($tokens[$stackPtr]['parenthesis_opener']) === false
+ || isset($tokens[$stackPtr]['parenthesis_closer']) === false
+ || $tokens[$stackPtr]['parenthesis_opener'] === null
+ || $tokens[$stackPtr]['parenthesis_closer'] === null
+ ) {
+ return;
+ }
+
+ $methodProperties = $phpcsFile->getMethodProperties($stackPtr);
+ if ($methodProperties['return_type'] === '') {
+ return;
+ }
+
+ $returnType = $methodProperties['return_type_token'];
+ if ($tokens[($returnType - 1)]['code'] !== T_WHITESPACE
+ || $tokens[($returnType - 1)]['content'] !== ' '
+ || $tokens[($returnType - 2)]['code'] !== T_COLON
+ ) {
+ $error = 'There must be a single space between the colon and type in a return type declaration';
+ if ($tokens[($returnType - 1)]['code'] === T_WHITESPACE
+ && $tokens[($returnType - 2)]['code'] === T_COLON
+ ) {
+ $fix = $phpcsFile->addFixableError($error, $returnType, 'SpaceBeforeReturnType');
+ if ($fix === true) {
+ $phpcsFile->fixer->replaceToken(($returnType - 1), ' ');
+ }
+ } else if ($tokens[($returnType - 1)]['code'] === T_COLON) {
+ $fix = $phpcsFile->addFixableError($error, $returnType, 'SpaceBeforeReturnType');
+ if ($fix === true) {
+ $phpcsFile->fixer->addContentBefore($returnType, ' ');
+ }
+ } else {
+ $phpcsFile->addError($error, $returnType, 'SpaceBeforeReturnType');
+ }
+ }
+
+ $colon = $phpcsFile->findPrevious(T_COLON, $returnType);
+ if ($tokens[($colon - 1)]['code'] !== T_CLOSE_PARENTHESIS) {
+ $error = 'There must not be a space before the colon in a return type declaration';
+ $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($colon - 1), null, true);
+ if ($tokens[$prev]['code'] === T_CLOSE_PARENTHESIS) {
+ $fix = $phpcsFile->addFixableError($error, $colon, 'SpaceBeforeColon');
+ if ($fix === true) {
+ $phpcsFile->fixer->beginChangeset();
+ for ($x = ($prev + 1); $x < $colon; $x++) {
+ $phpcsFile->fixer->replaceToken($x, '');
+ }
+
+ $phpcsFile->fixer->endChangeset();
+ }
+ } else {
+ $phpcsFile->addError($error, $colon, 'SpaceBeforeColon');
+ }
+ }
+
+ }//end process()
+
+
+}//end class
diff --git a/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc b/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc
new file mode 100644
index 0000000000..d3c68e39ab
--- /dev/null
+++ b/src/Standards/PSR12/Tests/Functions/ReturnTypeDeclarationUnitTest.inc
@@ -0,0 +1,56 @@
+
+ * @copyright 2006-2018 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
+ */
+
+namespace PHP_CodeSniffer\Standards\PSR12\Tests\Functions;
+
+use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest;
+
+class ReturnTypeDeclarationUnitTest extends AbstractSniffUnitTest
+{
+
+
+ /**
+ * Returns the lines where errors should occur.
+ *
+ * The key of the array should represent the line number and the value
+ * should represent the number of errors that should occur on that line.
+ *
+ * @return array
+ */
+ protected function getErrorList()
+ {
+ return [
+ 27 => 1,
+ 28 => 1,
+ 35 => 2,
+ 41 => 2,
+ 48 => 2,
+ 52 => 1,
+ 55 => 1,
+ 56 => 1,
+ ];
+
+ }//end getErrorList()
+
+
+ /**
+ * Returns the lines where warnings should occur.
+ *
+ * The key of the array should represent the line number and the value
+ * should represent the number of warnings that should occur on that line.
+ *
+ * @return array
+ */
+ protected function getWarningList()
+ {
+ return [];
+
+ }//end getWarningList()
+
+
+}//end class
diff --git a/src/Standards/PSR12/ruleset.xml b/src/Standards/PSR12/ruleset.xml
index 12b710ceb5..6b99768e98 100644
--- a/src/Standards/PSR12/ruleset.xml
+++ b/src/Standards/PSR12/ruleset.xml
@@ -107,9 +107,8 @@
-
-
+
@@ -186,6 +185,7 @@
+
@@ -250,6 +250,7 @@
+
@@ -315,6 +316,7 @@
+