/** * Maps reflection type * * @param php.ReflectionMethod|php.ReflectionParameter $reflect * @param string $name * @return php.Closure */ private function mapReflectionType($reflect, $name) { if ('self' === $name) { return function () use($reflect) { return new XPClass($reflect->getDeclaringClass()); }; } else { if ('parent' === $name) { return function () use($reflect) { if ($parent = $reflect->getDeclaringClass()->getParentClass()) { return new XPClass($parent); } throw new IllegalStateException('Cannot resolve parent type of class without parent'); }; } else { return function () use($name) { return Type::forName($name); }; } } }
/** * Maps annotations * * @param php.ReflectionParameter $reflect * @return [:var] */ protected function paramAnnotations($reflect) { $target = '$' . $reflect->name; $details = XPClass::detailsForMethod($reflect->getDeclaringClass(), $reflect->getDeclaringFunction()->name); return isset($details[DETAIL_TARGET_ANNO][$target]) ? $this->annotationsOf($details[DETAIL_TARGET_ANNO][$target]) : null; }