예제 #1
0
    protected function scan(array $tokens)
    {
        $annotations     = array();
        $annotationIndex = -1;
        $contentEnd      = false;

        reset($tokens);

        SCANNER_TOP:
        $token = current($tokens);

        switch ($token[0]) {

            case 'ANNOTATION_CLASS':

                $contentEnd = false;
                $annotationIndex++;
                $class                         = substr($token[1], 1);
                $class                         = $this->nameInformation->resolveName($class);
                $annotations[$annotationIndex] = array($class, null);
                goto SCANNER_CONTINUE;

            case 'ANNOTATION_CONTENT_START':

                $annotations[$annotationIndex][1] = '';

            case 'ANNOTATION_CONTENT_END':
            case 'ANNOTATION_CONTENT':
            case 'ANNOTATION_WHITESPACE':
            case 'ANNOTATION_NEWLINE':

                if (!$contentEnd && isset($annotations[$annotationIndex]) && is_string($annotations[$annotationIndex][1])) {
                    $annotations[$annotationIndex][1] .= $token[1];
                }

                if ($token[0] === 'ANNOTATION_CONTENT_END') {
                    $contentEnd = true;
                }

                goto SCANNER_CONTINUE;
        }

        SCANNER_CONTINUE:
        if (next($tokens) === false) {
            goto SCANNER_END;
        }
        goto SCANNER_TOP;

        SCANNER_END:

        foreach ($annotations as $annotation) {
            if ($this->annotationManager->hasAnnotation($annotation[0])) {
                $this->append(
                    $this->annotationManager->createAnnotation($annotation[0], trim($annotation[1], '()'))
                );
            }
        }
    }
 /**
  * @param  array $tokens
  */
 protected function scan(array $tokens)
 {
     $annotations = [];
     $annotationIndex = -1;
     $contentEnd = false;
     reset($tokens);
     SCANNER_TOP:
     $token = current($tokens);
     switch ($token[0]) {
         case 'ANNOTATION_CLASS':
             $contentEnd = false;
             $annotationIndex++;
             $class = substr($token[1], 1);
             $class = $this->nameInformation->resolveName($class);
             $annotations[$annotationIndex] = [$class, null];
             goto SCANNER_CONTINUE;
             // goto no break needed
         // goto no break needed
         case 'ANNOTATION_CONTENT_START':
             $annotations[$annotationIndex][1] = '';
             // fall-through
         // fall-through
         case 'ANNOTATION_CONTENT_END':
         case 'ANNOTATION_CONTENT':
         case 'ANNOTATION_WHITESPACE':
         case 'ANNOTATION_NEWLINE':
             if (!$contentEnd && isset($annotations[$annotationIndex]) && is_string($annotations[$annotationIndex][1])) {
                 $annotations[$annotationIndex][1] .= $token[1];
             }
             if ($token[0] === 'ANNOTATION_CONTENT_END') {
                 $contentEnd = true;
             }
             goto SCANNER_CONTINUE;
             // goto no break needed
     }
     SCANNER_CONTINUE:
     if (next($tokens) === false) {
         goto SCANNER_END;
     }
     goto SCANNER_TOP;
     SCANNER_END:
     foreach ($annotations as $annotation) {
         $annotation[] = '@' . $annotation[0] . $annotation[1];
         $annotationObject = $this->annotationManager->createAnnotation($annotation);
         if ($annotationObject) {
             $this->append($annotationObject);
         }
     }
 }