示例#1
0
 /**
  * @param $doc_comment       string
  * @param $annotation_name   string
  * @param $i                 integer
  * @param $annotation_class  string
  * @param $reflection_object Has_Doc_Comment|Reflection
  * @return Annotation
  */
 private static function parseAnnotationValue($doc_comment, $annotation_name, &$i, $annotation_class, Reflection $reflection_object)
 {
     $i += strlen($annotation_name) + 1;
     $next_char = $doc_comment[$i];
     switch ($next_char) {
         case SP:
         case TAB:
             $i++;
             $j = strlen($doc_comment);
             $next_annotation = strpos($doc_comment, SP . '* @', $i);
             $end_doc_comment = strpos($doc_comment, SP . '*/', $i);
             $next_in = strpos($doc_comment, LF . self::DOC_COMMENT_IN, $i);
             if ($next_annotation !== false && $next_annotation < $j) {
                 $j = $next_annotation;
             }
             if ($end_doc_comment !== false && $end_doc_comment < $j) {
                 $j = $end_doc_comment;
             }
             if ($next_in !== false && $next_in < $j) {
                 $j = $next_in;
             }
             if ($j === false) {
                 trigger_error('Missing doc_comment end', E_USER_ERROR);
             }
             $value = trim(preg_replace('%\\s*\\n\\s+\\*\\s*%', '', substr($doc_comment, $i, $j - $i)));
             break;
         case CR:
         case LF:
             $value = true;
             break;
         default:
             $value = null;
     }
     /** @var $annotation Annotation */
     $annotation = isset($value) ? new $annotation_class($value, $reflection_object, $annotation_name) : null;
     if (isset($annotation) && isA($annotation, Annotation_In::class)) {
         /** @var $annotation Annotation_In */
         $j = strrpos(substr($doc_comment, 0, $i), LF . self::DOC_COMMENT_IN);
         if ($j === false) {
             $annotation->class_name = $reflection_object instanceof Reflection_Class_Component ? $reflection_object->getDeclaringClassName() : $reflection_object->getName();
         } else {
             $j += strlen(self::DOC_COMMENT_IN) + 1;
             $k = strpos($doc_comment, LF, $j);
             $annotation->class_name = substr($doc_comment, $j, $k - $j);
         }
     }
     if (isset($annotation) && isA($annotation, Types_Annotation::class)) {
         $do = false;
         if (is_array($annotation->value)) {
             foreach ($annotation->value as $value) {
                 if ($value && (ctype_upper($value[0]) || $value[0] == BS)) {
                     $do = true;
                     break;
                 }
             }
         } else {
             $do = $annotation->value && ctype_upper($annotation->value[0]);
         }
         if ($do) {
             /** @var $annotation Types_Annotation */
             $j = strrpos(substr($doc_comment, 0, $i), LF . self::DOC_COMMENT_IN);
             if ($j === false) {
                 $class_name = $reflection_object instanceof Reflection_Class_Component ? $reflection_object->getDeclaringClassName() : $reflection_object->getName();
                 $namespace = Namespaces::of($class_name);
                 $use = PHP\Reflection_Class::of($class_name)->getNamespaceUse();
             } else {
                 $j += strlen(self::DOC_COMMENT_IN) + 1;
                 $k = strpos($doc_comment, LF, $j);
                 $in_class = substr($doc_comment, $j, $k - $j);
                 $namespace = Namespaces::of($in_class);
                 $use = PHP\Reflection_Class::of($in_class)->getNamespaceUse();
             }
             $annotation->applyNamespace($namespace, $use);
         } elseif (is_array($annotation->value)) {
             foreach ($annotation->value as $key => $value) {
                 $annotation->value[$key] = Builder::className($value);
             }
         } else {
             if ($annotation->value[0] === BS) {
                 $annotation->value = substr($annotation->value, 1);
             }
             $annotation->value = Builder::className($annotation->value);
         }
     }
     return $annotation;
 }
示例#2
0
 /**
  * TODO property you'd better do this into the last @override field @$annotation_name class
  *
  * @param $class_property  Reflection
  * @param $type_annotation Type_Annotation
  * @param $value           string
  * @param $pos             integer
  */
 private function searchIntoFinalClass(Reflection $class_property, Type_Annotation $type_annotation, $value, $pos)
 {
     $class = $class_property instanceof Reflection_Property ? $class_property->getFinalClass() : $class_property;
     trigger_error(sprintf('Looking namespace use for Method_Annotation into final class %1 for property %2' . ' is not reliable', $class->getName(), $class_property->getName()), E_USER_WARNING);
     $php_class = Reflection_Class::of($class->getName());
     $type_annotation->value = substr($value, 0, $pos);
     $type_annotation->applyNamespace($class->getNamespaceName(), $php_class->getNamespaceUse());
 }