diff --git a/README.md b/README.md index 2527657..d2ce43b 100644 --- a/README.md +++ b/README.md @@ -54,4 +54,7 @@ Does not allow for any `else` or `elseif` statements. Functions/methods must be 20 lines of code or fewer. ### Codor.Files.FunctionParameter ### -Functions/methods must have no more than 3 parameters. \ No newline at end of file +Functions/methods must have no more than 3 parameters. + +### Codor.Files.ReturnNull ### +Functions/methods must not returl `null`. \ No newline at end of file diff --git a/src/Codor/Sniffs/Files/ReturnNullSniff.php b/src/Codor/Sniffs/Files/ReturnNullSniff.php new file mode 100644 index 0000000..3b0c1ce --- /dev/null +++ b/src/Codor/Sniffs/Files/ReturnNullSniff.php @@ -0,0 +1,50 @@ +getTokens(); + $returnTokenIndex = $stackPtr; + + $returnValueToken = ''; + for ($index = $returnTokenIndex; $index < count($tokens); $index++) { + if ($tokens[$index]['type'] === 'T_SEMICOLON') { + $returnValueToken = $tokens[$index - 1]; + break; + } + } + + if ($returnValueToken == '') { + return; + } + + if ($returnValueToken['type'] === 'T_NULL') { + $error = "Return null value found."; + $phpcsFile->addError($error, $stackPtr); + } + } +} diff --git a/tests/Sniffs/Files/Assets/ReturnNullSniff/FunctionThatReturnsNull.inc b/tests/Sniffs/Files/Assets/ReturnNullSniff/FunctionThatReturnsNull.inc new file mode 100644 index 0000000..4fa6e1b --- /dev/null +++ b/tests/Sniffs/Files/Assets/ReturnNullSniff/FunctionThatReturnsNull.inc @@ -0,0 +1,19 @@ +runner->setSniff('Codor.Files.ReturnNull')->setFolder(__DIR__.'/Assets/ReturnNullSniff/'); + } + + /** @test */ + public function it_detects_functions_that_return_null() + { + $results = $this->runner->sniff('FunctionThatReturnsNull.inc'); + $this->assertEquals(2, $results->getErrorCount()); + $this->assertEquals(0, $results->getWarningCount()); + } +} \ No newline at end of file