Phan\Language\Element\Clazz::fromReflectionClass PHP Метод

fromReflectionClass() публичный статический Метод

public static fromReflectionClass ( CodeBase $code_base, ReflectionClass $class ) : Clazz
$code_base Phan\CodeBase A reference to the entire code base in which this context exists
$class ReflectionClass A reflection class representing a builtin class.
Результат Clazz A Class structural element representing the given named builtin.
    public static function fromReflectionClass(CodeBase $code_base, \ReflectionClass $class) : Clazz
    {
        // Build a set of flags based on the constitution
        // of the built-in class
        $flags = 0;
        if ($class->isFinal()) {
            $flags = \ast\flags\CLASS_FINAL;
        } elseif ($class->isInterface()) {
            $flags = \ast\flags\CLASS_INTERFACE;
        } elseif ($class->isTrait()) {
            $flags = \ast\flags\CLASS_TRAIT;
        }
        if ($class->isAbstract()) {
            $flags |= \ast\flags\CLASS_ABSTRACT;
        }
        $context = new Context();
        $class_fqsen = FullyQualifiedClassName::fromStringInContext($class->getName(), $context);
        // Build a base class element
        $clazz = new Clazz($context, $class->getName(), UnionType::fromStringInContext($class->getName(), $context), $flags, $class_fqsen);
        // If this class has a parent class, add it to the
        // class info
        if ($parent_class = $class->getParentClass()) {
            $parent_class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString('\\' . $parent_class->getName());
            $parent_type = $parent_class_fqsen->asType();
            $clazz->setParentType($parent_type);
        }
        // n.b.: public properties on internal classes don't get
        //       listed via reflection until they're set unless
        //       they have a default value. Therefore, we don't
        //       bother iterating over `$class->getProperties()`
        //       `$class->getStaticProperties()`.
        foreach ($class->getDefaultProperties() as $name => $value) {
            $property_context = $context->withScope(new ClassScope(new GlobalScope(), $clazz->getFQSEN()));
            $property_fqsen = FullyQualifiedPropertyName::make($clazz->getFQSEN(), $name);
            $property = new Property($property_context, $name, Type::fromObject($value)->asUnionType(), 0, $property_fqsen);
            $clazz->addProperty($code_base, $property, new None());
        }
        foreach (UnionType::internalPropertyMapForClassName($clazz->getName()) as $property_name => $property_type_string) {
            // An asterisk indicates that the class supports
            // dynamic properties
            if ($property_name === '*') {
                $clazz->setHasDynamicProperties(true);
                continue;
            }
            $property_context = $context->withScope(new ClassScope(new GlobalScope(), $clazz->getFQSEN()));
            $property_type = UnionType::fromStringInContext($property_type_string, new Context());
            $property_fqsen = FullyQualifiedPropertyName::make($clazz->getFQSEN(), $property_name);
            $property = new Property($property_context, $property_name, $property_type, 0, $property_fqsen);
            $clazz->addProperty($code_base, $property, new None());
        }
        foreach ($class->getInterfaceNames() as $name) {
            $clazz->addInterfaceClassFQSEN(FullyQualifiedClassName::fromFullyQualifiedString('\\' . $name));
        }
        foreach ($class->getTraitNames() as $name) {
            $clazz->addTraitFQSEN(FullyQualifiedClassName::fromFullyQualifiedString('\\' . $name));
        }
        foreach ($class->getConstants() as $name => $value) {
            $constant_fqsen = FullyQualifiedClassConstantName::make($clazz->getFQSEN(), $name);
            $constant = new ClassConstant($context, $name, Type::fromObject($value)->asUnionType(), 0, $constant_fqsen);
            $clazz->addConstant($code_base, $constant);
        }
        foreach ($class->getMethods() as $reflection_method) {
            $method_context = $context->withScope(new ClassScope(new GlobalScope(), $clazz->getFQSEN()));
            $method_list = FunctionFactory::methodListFromReflectionClassAndMethod($method_context, $code_base, $class, $reflection_method);
            foreach ($method_list as $method) {
                $clazz->addMethod($code_base, $method, new None());
            }
        }
        return $clazz;
    }