public function resolveElement($definition, $reflectionElement, &$expectedName = null)
{
if ($this->isSimpleType($definition)) {
return null;
}
$originalContext = $reflectionElement;
$reflectionElement = $this->correctContextForParameterOrClassMember($reflectionElement);
if ($reflectionElement === null) {
return null;
}
// self, static, $this references
if ($definition === 'self' || $definition === 'static' || $definition === '$this') {
return $reflectionElement instanceof ClassReflectionInterface ? $reflectionElement : null;
}
$definitionBase = substr($definition, 0, strcspn($definition, '\\:'));
$namespaceAliases = $reflectionElement->getNamespaceAliases();
$className = Resolver::resolveClassFqn($definition, $namespaceAliases, $reflectionElement->getNamespaceName());
if ($resolved = $this->resolveIfParsed($definition, $reflectionElement)) {
return $resolved;
}
if (!empty($definitionBase) && isset($namespaceAliases[$definitionBase]) && $definition !== $className) {
// Aliased class
$expectedName = $className;
if (strpos($className, ':') === false) {
return $this->getClass($className, $reflectionElement->getNamespaceName());
} else {
$definition = $className;
}
}
if ($reflectionElement instanceof ClassReflectionInterface && ($pos = strpos($definition, '::') || ($pos = strpos($definition, '->')))) {
$reflectionElement = $this->resolveContextForClassProperty($definition, $reflectionElement, $pos);
$definition = substr($definition, $pos + 2);
} elseif ($originalContext instanceof ParameterReflectionInterface) {
return null;
}
if (!$this->isContextUsable($reflectionElement)) {
return null;
}
return $this->resolveIfInContext($definition, $reflectionElement);
}