Пример #1
0
 /**
  * {@inheritdoc}
  */
 public function process($context, Result $result, Collection $collection)
 {
     $this->result = $result;
     $this->collection = $collection;
     $this->docParser = new DocParser();
     $this->docParser->setIgnoreNotImportedAnnotations(true);
     $phpdoc = $namespace = false;
     $tokenParser = new TokenParser($context->getFileContent());
     while ($token = $tokenParser->next(false)) {
         if (false === is_array($token)) {
             continue;
         }
         switch ($token[0]) {
             case T_DOC_COMMENT:
                 if ($phpdoc !== false) {
                     $this->processDocComment($phpdoc);
                     $phpdoc = false;
                 }
                 $phpdoc = $token[1];
                 break;
             case T_NAMESPACE:
                 $namespace = $tokenParser->parseNamespace();
                 break;
             case T_USE:
                 // add imports to doc parser to be able to use annotation without FQCN.
                 foreach ($tokenParser->parseUseStatement() as $alias => $target) {
                     if ($target[0] === '\\') {
                         $target = substr($target, 1);
                     }
                     $imports[$alias] = $target;
                 }
                 $this->docParser->setImports($imports);
                 break;
             case T_CLASS:
                 $token = $tokenParser->next(false);
                 $class = $namespace ? $namespace . '\\' . $token[1] : $token[1];
                 $this->dispatchEvent(Events::TOKEN_PHP_CLASS, new Context\PHP\PHPClass($class, $phpdoc), $phpdoc);
                 break;
             case T_VARIABLE:
                 $this->dispatchEvent(Events::TOKEN_PHP_VARIABLE, new Context\PHP\PHPVariable(substr($token[1], 1), isset($class) ? $class : null, $phpdoc), $phpdoc);
                 break;
             case T_FUNCTION:
                 $token = $tokenParser->next(false);
                 if (!is_array($token)) {
                     continue;
                 }
                 $this->dispatchEvent(Events::TOKEN_PHP_FUNCTION, new Context\PHP\PHPFunction($token[1], isset($class) ? $class : null, $phpdoc), $phpdoc);
                 break;
         }
     }
 }
Пример #2
0
 /**
  * @return void
  */
 protected function parse()
 {
     if ($this->parsed || !($fileName = $this->finder->findFile($this->className))) {
         return;
     }
     $this->parsed = true;
     $contents = file_get_contents($fileName);
     if ($this->classAnnotationOptimize) {
         if (preg_match("/\\A.*^\\s*((abstract|final)\\s+)?class\\s+{$this->shortClassName}\\s+/sm", $contents, $matches)) {
             $contents = $matches[0];
         }
     }
     $tokenParser = new TokenParser($contents);
     $docComment = '';
     while ($token = $tokenParser->next(false)) {
         if (is_array($token)) {
             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:
                     $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.
                 // 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) {
                     }
                     $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) {
                                 $this->parentClassName = '\\' . $use . $postfix;
                                 $fullySpecified = true;
                             }
                         }
                     }
                     if (!$fullySpecified) {
                         $this->parentClassName = '\\' . $this->namespace . '\\' . $this->parentClassName;
                     }
                     break;
             }
         }
     }
 }