/** * Maps a parameter * * @param int $pos * @param php.ReflectionParameter $reflect * @return [:var] */ protected function param($pos, $reflect) { if ($type = $reflect->getType()) { $type = $this->mapReflectionType($reflect, (string) $type); } else { $type = null; } if ($reflect->isVariadic()) { $var = true; $default = null; } else { if ($reflect->isOptional()) { $var = null; $default = function () use($reflect) { return $reflect->getDefaultValue(); }; } else { $var = false; $default = null; } } return ['pos' => $pos, 'name' => $reflect->name, 'type' => $type, 'ref' => $reflect->isPassedByReference(), 'default' => $default, 'var' => $var, 'annotations' => function () use($reflect) { return $this->paramAnnotations($reflect); }]; }
/** * Maps annotations * * @param php.ReflectionParameter $reflect * @return [:var] */ protected function paramAnnotations($reflect) { $annotations = []; foreach ($reflect->getAttributes() as $name => $value) { $annotations[$name] = empty($value) ? null : new Value($value[0]); } return empty($annotations) ? parent::paramAnnotations($reflect) : $annotations; }
/** * Maps a parameter * * @param int $pos * @param php.ReflectionParameter $reflect * @return [:var] */ protected function param($pos, $reflect) { if ($reflect->isArray()) { $type = function () { return Type::$ARRAY; }; } else { if ($reflect->isCallable()) { $type = function () { return Type::$CALLABLE; }; } else { if ($class = $reflect->getClass()) { $type = function () use($class) { return new XPClass($class); }; } else { $type = null; } } } if (self::$VARIADIC_SUPPORTED && $reflect->isVariadic()) { $var = true; $default = null; } else { if ($reflect->isOptional()) { $var = null; $default = function () use($reflect) { return $reflect->getDefaultValue(); }; } else { $var = false; $default = null; } } return ['pos' => $pos, 'name' => $reflect->name, 'type' => $type, 'ref' => $reflect->isPassedByReference(), 'default' => $default, 'var' => $var, 'annotations' => function () use($reflect) { return $this->paramAnnotations($reflect); }]; }