public static function PHP_CodeCoverage_Util::getLinesToBeIgnored

Returns the lines of a source file that should be ignored.

Parameters

string $filename:

boolean $cacheTokens:

Return value

array

Throws

PHP_CodeCoverage_Exception

4 calls to PHP_CodeCoverage_Util::getLinesToBeIgnored()
PHP_CodeCoverage_Report_Node_File::__construct in drupal/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/File.php
Constructor.
PHP_CodeCoverage_UtilTest::testGetLinesToBeIgnored in drupal/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/UtilTest.php
@covers PHP_CodeCoverage_Util::getLinesToBeIgnored
PHP_CodeCoverage_UtilTest::testGetLinesToBeIgnored2 in drupal/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/UtilTest.php
@covers PHP_CodeCoverage_Util::getLinesToBeIgnored
PHP_CodeCoverage_UtilTest::testGetLinesToBeIgnoredOneLineAnnotations in drupal/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/UtilTest.php
@covers PHP_CodeCoverage_Util::getLinesToBeIgnored

File

drupal/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util.php, line 78

Class

PHP_CodeCoverage_Util
Utility methods.

Code

public static function getLinesToBeIgnored($filename, $cacheTokens = TRUE) {
  if (!is_string($filename)) {
    throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(1, 'string');
  }
  if (!is_bool($cacheTokens)) {
    throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(2, 'boolean');
  }
  if (!isset(self::$ignoredLines[$filename])) {
    self::$ignoredLines[$filename] = array();
    $ignore = FALSE;
    $stop = FALSE;
    $lines = file($filename);
    foreach ($lines as $index => $line) {
      if (!trim($line)) {
        self::$ignoredLines[$filename][$index + 1] = TRUE;
      }
    }
    if ($cacheTokens) {
      $tokens = PHP_Token_Stream_CachingFactory::get($filename);
    }
    else {
      $tokens = new PHP_Token_Stream($filename);
    }
    $classes = array_merge($tokens
      ->getClasses(), $tokens
      ->getTraits());
    $tokens = $tokens
      ->tokens();
    foreach ($tokens as $token) {
      switch (get_class($token)) {
        case 'PHP_Token_COMMENT':
        case 'PHP_Token_DOC_COMMENT':
          $_token = trim($token);
          $_line = trim($lines[$token
            ->getLine() - 1]);
          if ($_token == '// @codeCoverageIgnore' || $_token == '//@codeCoverageIgnore') {
            $ignore = TRUE;
            $stop = TRUE;
          }
          else {
            if ($_token == '// @codeCoverageIgnoreStart' || $_token == '//@codeCoverageIgnoreStart') {
              $ignore = TRUE;
            }
            else {
              if ($_token == '// @codeCoverageIgnoreEnd' || $_token == '//@codeCoverageIgnoreEnd') {
                $stop = TRUE;
              }
            }
          }

          // be sure the comment doesn't have some token BEFORE it on the same line...
          // it would not be safe to ignore the whole line in those cases.
          if (0 === strpos($_token, $_line)) {
            $count = substr_count($token, "\n");
            $line = $token
              ->getLine();
            for ($i = $line; $i < $line + $count; $i++) {
              self::$ignoredLines[$filename][$i] = TRUE;
            }
            if ($token instanceof PHP_Token_DOC_COMMENT) {

              // Workaround for the fact the DOC_COMMENT token
              // does not include the final \n character in its
              // text.
              if (substr(trim($lines[$i - 1]), -2) == '*/') {
                self::$ignoredLines[$filename][$i] = TRUE;
              }
            }
          }
          break;
        case 'PHP_Token_INTERFACE':
        case 'PHP_Token_TRAIT':
        case 'PHP_Token_CLASS':
        case 'PHP_Token_FUNCTION':
          $docblock = $token
            ->getDocblock();
          if (strpos($docblock, '@codeCoverageIgnore')) {
            $endLine = $token
              ->getEndLine();
            for ($i = $token
              ->getLine(); $i <= $endLine; $i++) {
              self::$ignoredLines[$filename][$i] = TRUE;
            }
          }
          else {
            if ($token instanceof PHP_Token_INTERFACE || $token instanceof PHP_Token_TRAIT || $token instanceof PHP_Token_CLASS) {
              if (empty($classes[$token
                ->getName()]['methods'])) {
                for ($i = $token
                  ->getLine(); $i <= $token
                  ->getEndLine(); $i++) {
                  self::$ignoredLines[$filename][$i] = TRUE;
                }
              }
              else {
                $firstMethod = array_shift($classes[$token
                  ->getName()]['methods']);
                $lastMethod = array_pop($classes[$token
                  ->getName()]['methods']);
                if ($lastMethod === NULL) {
                  $lastMethod = $firstMethod;
                }
                for ($i = $token
                  ->getLine(); $i < $firstMethod['startLine']; $i++) {
                  self::$ignoredLines[$filename][$i] = TRUE;
                }
                for ($i = $token
                  ->getEndLine(); $i > $lastMethod['endLine']; $i--) {
                  self::$ignoredLines[$filename][$i] = TRUE;
                }
              }
            }
          }
          break;
        case 'PHP_Token_INTERFACE':
          $endLine = $token
            ->getEndLine();
          for ($i = $token
            ->getLine(); $i <= $endLine; $i++) {
            self::$ignoredLines[$filename][$i] = TRUE;
          }
          break;
        case 'PHP_Token_NAMESPACE':
          self::$ignoredLines[$filename][$token
            ->getEndLine()] = TRUE;

        // Intentional fallthrough
        case 'PHP_Token_OPEN_TAG':
        case 'PHP_Token_CLOSE_TAG':
        case 'PHP_Token_USE':
          self::$ignoredLines[$filename][$token
            ->getLine()] = TRUE;
          break;
      }
      if ($ignore) {
        self::$ignoredLines[$filename][$token
          ->getLine()] = TRUE;
        if ($stop) {
          $ignore = FALSE;
          $stop = FALSE;
        }
      }
    }
  }
  return self::$ignoredLines[$filename];
}