private function resolveAnnotationClass(\Reflector $prop, $annotationValue, $annotationName) { /** @var Property|Method $prop */ if (!($type = ltrim($annotationValue, '\\'))) { throw new InvalidStateException("Missing annotation @{$annotationName} with typehint on {$prop}.", $prop); } if (!class_exists($type) && !interface_exists($type)) { if (substr(func_get_arg(1), 0, 1) === '\\') { throw new MissingClassException("Class \"{$type}\" was not found, please check the typehint on {$prop} in annotation @{$annotationName}.", $prop); } $expandedType = NULL; if (method_exists('Nette\\Reflection\\AnnotationsParser', 'expandClassName')) { $expandedType = Nette\Reflection\AnnotationsParser::expandClassName($annotationValue, $prop instanceof \ReflectionProperty ? Nette\Reflection\Helpers::getDeclaringClass($prop) : $prop->getDeclaringClass()); } if ($expandedType && (class_exists($expandedType) || interface_exists($expandedType))) { $type = $expandedType; } elseif (!class_exists($type = $prop->getDeclaringClass()->getNamespaceName() . '\\' . $type) && !interface_exists($type)) { throw new MissingClassException("Neither class \"" . func_get_arg(1) . "\" or \"{$type}\" was found, please check the typehint on {$prop} in annotation @{$annotationName}.", $prop); } } return ClassType::from($type)->getName(); }