You are here

public function Drupal_Sniffs_Semantics_FunctionTSniff::processFunctionCall in Coder 7.2

Processes this function call.

Parameters

PHP_CodeSniffer_File $phpcsFile: The file being scanned.

int $stackPtr: The position of the function call in the stack.

int $openBracket: The position of the opening parenthesis in the stack.

int $closeBracket: The position of the closing parenthesis in the stack.

Drupal_Sniffs_Semantics_FunctionCallSniff $sniff: Can be used to retreive the function's arguments with the getArgument() method.

Return value

void

Overrides Drupal_Sniffs_Semantics_FunctionCall::processFunctionCall

File

coder_sniffer/Drupal/Sniffs/Semantics/FunctionTSniff.php, line 53

Class

Drupal_Sniffs_Semantics_FunctionTSniff
Check the usage of the t() function to not escape translateable strings with back slashes. Also checks that the first argument does not use string concatenation.

Code

public function processFunctionCall(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $openBracket, $closeBracket, Drupal_Sniffs_Semantics_FunctionCallSniff $sniff) {
  $tokens = $phpcsFile
    ->getTokens();
  $argument = $sniff
    ->getArgument(1);
  if ($argument === false) {
    $error = 'Empty calls to t() are not allowed';
    $phpcsFile
      ->addError($error, $stackPtr, 'EmptyT');
    return;
  }
  if ($tokens[$argument['start']]['code'] !== T_CONSTANT_ENCAPSED_STRING) {

    // Not a translatable string literal.
    $warning = 'Only string literals should be passed to t() where possible';
    $phpcsFile
      ->addWarning($warning, $argument['start'], 'NotLiteralString');
    return;
  }
  $string = $tokens[$argument['start']]['content'];
  if ($string === '""' || $string === "''") {
    $warning = 'Do not pass empty strings to t()';
    $phpcsFile
      ->addWarning($warning, $argument['start'], 'EmptyString');
    return;
  }
  $lastChar = substr($string, -1);
  if ($lastChar === '"' || $lastChar === "'") {
    $message = substr($string, 1, -1);
    if ($message !== trim($message)) {
      $warning = 'Translatable strings must not begin or end with white spaces, use placeholders with t() for variables';
      $phpcsFile
        ->addWarning($warning, $argument['start'], 'WhiteSpace');
    }
  }
  $concatFound = $phpcsFile
    ->findNext(T_STRING_CONCAT, $argument['start'], $argument['end']);
  if ($concatFound !== false) {
    $error = 'Concatenating translatable strings is not allowed, use placeholders instead and only one string literal';
    $phpcsFile
      ->addError($error, $concatFound, 'Concat');
  }

  // Check if there is a backslash escaped single quote in the string and
  // if the string makes use of double quotes.
  if ($string[0] === "'" && strpos($string, "\\'") !== false && strpos($string, '"') === false) {
    $warn = 'Avoid backslash escaping in translatable strings when possible, use "" quotes instead';
    $phpcsFile
      ->addWarning($warn, $argument['start'], 'BackslashSingleQuote');
    return;
  }
  if ($string[0] === '"' && strpos($string, '\\"') !== false && strpos($string, "'") === false) {
    $warn = "Avoid backslash escaping in translatable strings when possible, use '' quotes instead";
    $phpcsFile
      ->addWarning($warn, $argument['start'], 'BackslashDoubleQuote');
  }
}