Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

String length for concat matters #19

Merged
merged 1 commit into from

2 participants

@Swaagie

No description provided.

@3rd-Eden 3rd-Eden merged commit 46fab08 into Hotelsnl:master
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on May 23, 2012
  1. check for the length of a string on concat

    Martijn Swaagman authored
This page is out of date. Refresh to see the latest.
View
133 Hotelsnl/Sniffs/Strings/UnnecessaryStringConcatSniff.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Hotelsnl_Sniffs_Strings_UnnecessaryStringConcatSniff.
+ *
+ * PHP version 5
+ *
+ * @category PHP
+ * @package PHP_CodeSniffer
+ * @author Greg Sherwood <gsherwood@squiz.net>
+ * @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
+ * @link http://pear.php.net/package/PHP_CodeSniffer
+ */
+
+/**
+ * Hotelsnl_Sniffs_Strings_UnnecessaryStringConcatSniff.
+ *
+ * Checks that two strings are not concatenated together; suggests
+ * using one string instead.
+ *
+ * @category PHP
+ * @package PHP_CodeSniffer
+ * @author Greg Sherwood <gsherwood@squiz.net>
+ * @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
+ * @version Release: 1.3.3
+ * @link http://pear.php.net/package/PHP_CodeSniffer
+ */
+class Hotelsnl_Sniffs_Strings_UnnecessaryStringConcatSniff implements PHP_CodeSniffer_Sniff
+{
+
+ /**
+ * A list of tokenizers this sniff supports.
+ *
+ * @var array
+ */
+ public $supportedTokenizers = array(
+ 'PHP',
+ 'JS',
+ );
+
+ /**
+ * If true, an error will be thrown; otherwise a warning.
+ *
+ * @var bool
+ */
+ public $error = true;
+
+
+ /**
+ * Returns an array of tokens this test wants to listen for.
+ *
+ * @return array
+ */
+ public function register()
+ {
+ return array(
+ T_STRING_CONCAT,
+ T_PLUS,
+ );
+
+ }//end register()
+
+
+ /**
+ * Processes this sniff, when one of its tokens is encountered.
+ *
+ * @param PHP_CodeSniffer_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(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+ {
+ // Work out which type of file this is for.
+ $tokens = $phpcsFile->getTokens();
+ if ($tokens[$stackPtr]['code'] === T_STRING_CONCAT) {
+ if ($phpcsFile->tokenizerType === 'JS') {
+ return;
+ }
+ } else {
+ if ($phpcsFile->tokenizerType === 'PHP') {
+ return;
+ }
+ }
+
+ $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true);
+ $next = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true);
+ if ($prev === false || $next === false) {
+ return;
+ }
+
+ $stringTokens = PHP_CodeSniffer_Tokens::$stringTokens;
+ if (in_array($tokens[$prev]['code'], $stringTokens) === true
+ && in_array($tokens[$next]['code'], $stringTokens) === true
+ ) {
+
+ $variable = $phpcsFile->findPrevious(T_VARIABLE, $stackPtr);
+ $previousLength = strlen($tokens[$next]['content'])
+ + strlen($tokens[$prev]['content'])
+ + ($tokens[$prev]['level'] * 2)
+ + strlen($tokens[$variable]['content'])
+ + 3;
+
+ if ($tokens[$prev]['content'][0] === $tokens[$next]['content'][0] && $previousLength <= 80) {
+ // Before we throw an error for PHP, allow strings to be
+ // combined if they would have < and ? next to each other because
+ // this trick is sometimes required in PHP strings.
+ if ($phpcsFile->tokenizerType === 'PHP') {
+ $prevChar = substr($tokens[$prev]['content'], -2, 1);
+ $nextChar = $tokens[$next]['content'][1];
+ $combined = $prevChar.$nextChar;
+ if ($combined === '?'.'>' || $combined === '<'.'?') {
+ return;
+ }
+ }
+
+ $error = 'String concat is not required here; use a single string instead';
+ if ($this->error === true) {
+ $phpcsFile->addError($error, $stackPtr, 'Found');
+ } else {
+ $phpcsFile->addWarning($error, $stackPtr, 'Found');
+ }
+ }
+ }
+
+ }//end process()
+
+
+}//end class
+
+?>
View
1  Hotelsnl/ruleset.xml
@@ -9,7 +9,6 @@
<rule ref="Generic.Formatting.SpaceAfterCast"/>
<rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie"/>
<rule ref="Generic.NamingConventions.ConstructorName"/>
- <rule ref="Generic.Strings.UnnecessaryStringConcat"/>
<rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
<rule ref="Generic.WhiteSpace.ScopeIndent"/>
<rule ref="PEAR.ControlStructures.MultiLineCondition"/>
Something went wrong with that request. Please try again.