/** * 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 a method * * @param php.ReflectionMethod $reflect * @return [:var] */ protected function method($reflect) { return ['name' => $reflect->name, 'access' => new Modifiers($reflect->getModifiers() & ~0x1fb7f008), 'holder' => $reflect->getDeclaringClass()->name, 'params' => function () use($reflect) { $params = []; foreach ($reflect->getParameters() as $pos => $param) { $params[] = $this->param($pos, $param); } return $params; }, 'annotations' => function () use($reflect) { return $this->methodAnnotations($reflect); }, 'invoke' => function ($instance, $args) use($reflect) { return $this->invokeMethod($reflect, $instance, $args); }, 'comment' => function () use($reflect) { if (self::$RETAIN_COMMENTS) { return $reflect->getDocComment(); } else { $method = $this->memberDeclaration($this->resolve('\\' . $reflect->getDeclaringClass()->name), 'method', $reflect->name); return isset($method['comment']) ? $method['comment'] : null; } }]; }