Skip to content

Commit

Permalink
Introduce MeaningfulVariableNameSniff
Browse files Browse the repository at this point in the history
  • Loading branch information
szepeviktor committed Apr 14, 2023
1 parent 0def324 commit 05502dd
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
<?php

/**
* Prohibit usage of bad variable names.
*
* @package PSR12NeutronRuleset
*/

declare(strict_types=1);

namespace PSR12NeutronRuleset\Sniffs\NamingConventions;

use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Sniffs\AbstractVariableSniff;

/**
* Checks the meaningful naming of variables and member variables.
*
* Modified copy from https://github.com/InteractionDesignFoundation/coding-standard
*/
final class MeaningfulVariableNameSniff extends AbstractVariableSniff
{

/**
* Forbidden variable names.
*
* @var array<string, string>
*/
public array $forbiddenNames = [];

/**
* Processes this test, when one of its tokens is encountered.
*
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
* @param int|string $stackPtr The position of the current token in the stack passed in $tokens.
*
* @return void
*/
protected function processVariable(File $phpcsFile, $stackPtr): void
{
$tokens = $phpcsFile->getTokens();
$varName = ltrim($tokens[$stackPtr]['content'], '$');

if ($this->checkForProhibitedVariableNames($varName)) {
$error = 'Variable "%s" has not very meaningful, searchable or pronounceable name';
$phpcsFile->addError($error, $stackPtr, 'NotMeaningfulVariableName', [$varName]);
return;
}
}

/**
* Processes class member variables.
*
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
* @param int|string $stackPtr The position of the current token in the stack passed in $tokens.
*
* @return void
*/
protected function processMemberVar(File $phpcsFile, $stackPtr): void
{
$tokens = $phpcsFile->getTokens();
$varName = ltrim($tokens[$stackPtr]['content'], '$');

if ($this->checkForProhibitedVariableNames($varName)) {
$error = 'Variable "%s" has not very meaningful, searchable or pronounceable name';
$phpcsFile->addError($error, $stackPtr, 'NotMeaningfulVariableName', [$varName]);
return;
}
}

/**
* Processes the variable found within a double-quoted string.
*
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
* @param int|string $stackPtr The position of the double-quoted string.
*
* @return void
*/
protected function processVariableInString(File $phpcsFile, $stackPtr): void
{
$tokens = $phpcsFile->getTokens();

if (
preg_match_all(
'|[^\\\]\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)|',
$tokens[$stackPtr]['content'],
$matches
) !== 0
) {
foreach ($matches[1] as $varName) {
// If it鈥檚 a php reserved var, then it's ok.
if (isset($this->phpReservedVars[$varName])) {
continue;
}

if ($this->checkForProhibitedVariableNames($varName)) {
$error = 'Variable "%s" has not very meaningful or searchable name';
$phpcsFile->addError($error, $stackPtr, 'NotMeaningfulVariableName', [$varName]);
return;
}
}
}
}

/**
* Check variable name.
*
* @param string $varName Variable name to check.
*
* @return bool
*/
private function checkForProhibitedVariableNames(string $varName): bool
{
return isset($this->forbiddenNames[$varName]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* @package PSR12NeutronRuleset
*/

declare(strict_types=1);

namespace PSR12NeutronRuleset\Sniffs\Strings;

use PHP_CodeSniffer\Files\File;
Expand All @@ -30,8 +32,8 @@ public function register()
/**
* Process sniff.
*
* @param \PHP_CodeSniffer\Files\File $phpcsFile 1
* @param int $stackPtr 2
* @param \PHP_CodeSniffer\Files\File $phpcsFile File name.
* @param int $stackPtr Stack pointer.
*
* @return void
*/
Expand Down
43 changes: 42 additions & 1 deletion PSR12NeutronRuleset/ruleset.xml
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,50 @@
<type>warning</type>
</rule>

<!-- Own rules -->
<!-- Custom rules -->
<rule ref="PSR12NeutronRuleset.Strings.ConcatenationUsage">
<severity>5</severity>
<type>warning</type>
</rule>
<!-- https://github.com/szepeviktor/uninformative-words -->
<rule ref="PSR12NeutronRuleset.NamingConventions.MeaningfulVariableName">
<properties>
<property name="forbiddenNames" type="array">
<element key="arr" value="Provide more context"/>
<element key="bool" value="Provide more context"/>
<element key="boolean" value="Provide more context"/>
<element key="cnt" value="Provide more context"/>
<element key="col" value="Provide more context"/>
<element key="coll" value="Provide more context"/>
<element key="custom" value="Provide more context"/>
<element key="detail" value="Provide more context"/>
<element key="data" value="Provide more context"/>
<element key="double" value="Provide more context"/>
<element key="elem" value="Provide more context"/>
<element key="err" value="Provide more context"/>
<element key="extra" value="Provide more context"/>
<element key="float" value="Provide more context"/>
<element key="impl" value="Provide more context"/>
<element key="ind" value="Provide more context"/>
<element key="info" value="Provide more context"/>
<element key="int" value="Provide more context"/>
<element key="integer" value="Provide more context"/>
<element key="item" value="Provide more context"/>
<element key="iter" value="Provide more context"/>
<element key="key" value="Provide more context"/>
<element key="len" value="Provide more context"/>
<element key="more" value="Provide more context"/>
<element key="other" value="Provide more context"/>
<element key="proc" value="Provide more context"/>
<element key="req" value="Provide more context"/>
<element key="res" value="Provide more context"/>
<element key="ret" value="Provide more context"/>
<element key="return" value="Provide more context"/>
<element key="str" value="Provide more context"/>
<element key="value" value="Provide more context"/>
<element key="var" value="Provide more context"/>
<element key="vdata" value="Provide more context"/>
</property>
</properties>
</rule>
</ruleset>

0 comments on commit 05502dd

Please sign in to comment.