You are here

protected function StaticReflectionParser::parse in Drupal 9

Same name and namespace in other branches
  1. 10 core/lib/Drupal/Component/Annotation/Doctrine/StaticReflectionParser.php \Drupal\Component\Annotation\Doctrine\StaticReflectionParser::parse()

Return value

void

3 calls to StaticReflectionParser::parse()
StaticReflectionParser::getDocComment in core/lib/Drupal/Component/Annotation/Doctrine/StaticReflectionParser.php
Gets the doc comment.
StaticReflectionParser::getStaticReflectionParserForDeclaringClass in core/lib/Drupal/Component/Annotation/Doctrine/StaticReflectionParser.php
Gets the PSR-0 parser for the declaring class.
StaticReflectionParser::getUseStatements in core/lib/Drupal/Component/Annotation/Doctrine/StaticReflectionParser.php
Gets the use statements from this file.

File

core/lib/Drupal/Component/Annotation/Doctrine/StaticReflectionParser.php, line 162
This class is a near-copy of Doctrine\Common\Reflection\StaticReflectionParser, which is part of the Doctrine project: <http://www.doctrine-project.org>. It was copied from version 1.2.2.

Class

StaticReflectionParser
Parses a file for namespaces/use/class declarations.

Namespace

Drupal\Component\Annotation\Doctrine

Code

protected function parse() {
  $fileName = $this->finder
    ->findFile($this->className);
  if ($this->parsed || !$fileName) {
    return;
  }
  $this->parsed = true;
  $contents = file_get_contents($fileName);
  if ($this->classAnnotationOptimize) {
    $regex = sprintf('/\\A.*^\\s*((abstract|final)\\s+)?class\\s+%s\\s+/sm', $this->shortClassName);
    if (preg_match($regex, $contents, $matches)) {
      $contents = $matches[0];
    }
  }
  $tokenParser = new TokenParser($contents);
  $docComment = '';
  $last_token = false;
  while ($token = $tokenParser
    ->next(false)) {
    switch ($token[0]) {
      case T_USE:
        $this->useStatements = array_merge($this->useStatements, $tokenParser
          ->parseUseStatement());
        break;
      case T_DOC_COMMENT:
        $docComment = $token[1];
        break;
      case T_CLASS:
        if ($last_token !== T_PAAMAYIM_NEKUDOTAYIM && $last_token !== T_NEW) {
          $this->docComment['class'] = $docComment;
          $docComment = '';
        }
        break;
      case T_VAR:
      case T_PRIVATE:
      case T_PROTECTED:
      case T_PUBLIC:
        $token = $tokenParser
          ->next();
        if ($token[0] === T_VARIABLE) {
          $propertyName = substr($token[1], 1);
          $this->docComment['property'][$propertyName] = $docComment;
          continue 2;
        }
        if ($token[0] !== T_FUNCTION) {

          // For example, it can be T_FINAL.
          continue 2;
        }

      // No break.
      case T_FUNCTION:

        // The next string after function is the name, but
        // there can be & before the function name so find the
        // string.
        while (($token = $tokenParser
          ->next()) && $token[0] !== T_STRING) {
          continue;
        }
        if ($token === null) {
          break;
        }
        $methodName = $token[1];
        $this->docComment['method'][$methodName] = $docComment;
        $docComment = '';
        break;
      case T_EXTENDS:
        $this->parentClassName = $tokenParser
          ->parseClass();
        $nsPos = strpos($this->parentClassName, '\\');
        $fullySpecified = false;
        if ($nsPos === 0) {
          $fullySpecified = true;
        }
        else {
          if ($nsPos) {
            $prefix = strtolower(substr($this->parentClassName, 0, $nsPos));
            $postfix = substr($this->parentClassName, $nsPos);
          }
          else {
            $prefix = strtolower($this->parentClassName);
            $postfix = '';
          }
          foreach ($this->useStatements as $alias => $use) {
            if ($alias !== $prefix) {
              continue;
            }
            $this->parentClassName = '\\' . $use . $postfix;
            $fullySpecified = true;
          }
        }
        if (!$fullySpecified) {
          $this->parentClassName = '\\' . $this->namespace . '\\' . $this->parentClassName;
        }
        break;
    }
    $last_token = is_array($token) ? $token[0] : false;
  }
}