Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. UnusedVariableSniff.php

function UnusedVariableSniff::isUsedInLoopCycle

1 call to UnusedVariableSniff::isUsedInLoopCycle()
UnusedVariableSniff::process in vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UnusedVariableSniff.php
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint *

File

vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UnusedVariableSniff.php, line 377

Class

UnusedVariableSniff

Namespace

SlevomatCodingStandard\Sniffs\Variables

Code

private function isUsedInLoopCycle(File $phpcsFile, int $variablePointer, string $variableName) : bool {
    $tokens = $phpcsFile->getTokens();
    $loopPointer = null;
    foreach (array_reverse($tokens[$variablePointer]['conditions'], true) as $conditionPointer => $conditionTokenCode) {
        if (in_array($conditionTokenCode, TokenHelper::$functionTokenCodes, true)) {
            break;
        }
        if (!in_array($conditionTokenCode, [
            T_FOREACH,
            T_FOR,
            T_DO,
            T_WHILE,
        ], true)) {
            continue;
        }
        $loopPointer = $conditionPointer;
        $loopConditionPointer = $conditionTokenCode === T_DO ? TokenHelper::findNextEffective($phpcsFile, $tokens[$loopPointer]['scope_closer'] + 1) : $loopPointer;
        $variableUsedInLoopConditionPointer = TokenHelper::findNextContent($phpcsFile, T_VARIABLE, $variableName, $tokens[$loopConditionPointer]['parenthesis_opener'] + 1, $tokens[$loopConditionPointer]['parenthesis_closer']);
        if ($variableUsedInLoopConditionPointer === null || $variableUsedInLoopConditionPointer === $variablePointer) {
            continue;
        }
        if ($conditionTokenCode !== T_FOREACH) {
            return true;
        }
        $pointerBeforeVariableUsedInLoopCondition = TokenHelper::findPreviousEffective($phpcsFile, $variableUsedInLoopConditionPointer - 1);
        if ($tokens[$pointerBeforeVariableUsedInLoopCondition]['code'] === T_BITWISE_AND) {
            return true;
        }
    }
    if ($loopPointer === null) {
        return false;
    }
    for ($i = $tokens[$loopPointer]['scope_opener'] + 1; $i < $tokens[$loopPointer]['scope_closer']; $i++) {
        if (in_array($tokens[$i]['code'], [
            T_DOUBLE_QUOTED_STRING,
            T_HEREDOC,
        ], true) && VariableHelper::isUsedInScopeInString($phpcsFile, $variableName, $i)) {
            return true;
        }
        if ($tokens[$i]['code'] !== T_VARIABLE) {
            continue;
        }
        if ($tokens[$i]['content'] !== $variableName) {
            continue;
        }
        if (!$this->isAssignment($phpcsFile, $i)) {
            return true;
        }
        $nextPointer = TokenHelper::findNextEffective($phpcsFile, $i + 1);
        if (!in_array($tokens[$nextPointer]['code'], [
            T_INC,
            T_DEC,
            T_PLUS_EQUAL,
            T_MINUS_EQUAL,
            T_MUL_EQUAL,
            T_DIV_EQUAL,
            T_POW_EQUAL,
            T_MOD_EQUAL,
            T_AND_EQUAL,
            T_OR_EQUAL,
            T_XOR_EQUAL,
            T_SL_EQUAL,
            T_SR_EQUAL,
            T_CONCAT_EQUAL,
        ], true)) {
            continue;
        }
        $parenthesisOwnerPointer = $this->findNestedParenthesisWithOwner($phpcsFile, $i);
        if ($parenthesisOwnerPointer !== null && in_array($tokens[$parenthesisOwnerPointer]['code'], [
            T_IF,
            T_ELSEIF,
        ], true)) {
            return true;
        }
    }
    return false;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal