Zephir\CompilerFile::preCompileClass PHP Method

preCompileClass() public method

Creates a definition for a class
public preCompileClass ( zephir\CompilationContext $compilationContext, string $namespace, array $topStatement, array $docblock )
$compilationContext zephir\CompilationContext
$namespace string
$topStatement array
$docblock array
    public function preCompileClass(CompilationContext $compilationContext, $namespace, $topStatement, $docblock)
    {
        $classDefinition = new ClassDefinition($namespace, $topStatement['name']);
        $classDefinition->setIsExternal($this->_external);
        if (isset($topStatement['extends'])) {
            $classDefinition->setExtendsClass($this->getFullName($topStatement['extends']));
        }
        if (isset($topStatement['implements'])) {
            foreach ($topStatement['implements'] as &$implement) {
                $implement['value'] = $this->getFullName($implement['value']);
            }
            $classDefinition->setImplementsInterfaces($topStatement['implements']);
        }
        if (isset($topStatement['abstract'])) {
            $classDefinition->setIsAbstract($topStatement['abstract']);
        }
        if (isset($topStatement['final'])) {
            $classDefinition->setIsFinal($topStatement['final']);
        }
        if (is_array($docblock)) {
            $classDefinition->setDocBlock($docblock["value"]);
        }
        if (isset($topStatement['definition'])) {
            $definition = $topStatement['definition'];
            if (isset($definition['properties'])) {
                foreach ($definition['properties'] as $property) {
                    /**
                     * Add property to the definition
                     */
                    $classDefinition->addProperty(new ClassProperty($classDefinition, $property['visibility'], $property['name'], isset($property['default']) ? $property['default'] : null, isset($property['docblock']) ? $property['docblock'] : null, $property));
                    /**
                     * Check and process shortcuts
                     */
                    if (isset($property['shortcuts'])) {
                        $this->_processShorcuts($property, $classDefinition);
                    }
                }
            }
            /**
             * Register constants
             */
            if (isset($definition['constants'])) {
                foreach ($definition['constants'] as $constant) {
                    $classDefinition->addConstant(new ClassConstant($constant['name'], isset($constant['default']) ? $constant['default'] : null, isset($constant['docblock']) ? $constant['docblock'] : null));
                }
            }
            /**
             * Register methods
             */
            if (isset($definition['methods'])) {
                foreach ($definition['methods'] as $method) {
                    $classDefinition->addMethod(new ClassMethod($classDefinition, $method['visibility'], $method['name'], isset($method['parameters']) ? new ClassMethodParameters($method['parameters']) : null, isset($method['statements']) ? new StatementsBlock($method['statements']) : null, isset($method['docblock']) ? $method['docblock'] : null, isset($method['return-type']) ? $method['return-type'] : null, $method), $method);
                }
            }
        }
        $this->_classDefinition = $classDefinition;
        /**
         * Assign current class definition to the compilation context
         */
        $compilationContext->classDefinition = $classDefinition;
        /**
         * Run pre-compilation passes
         */
        $classDefinition->preCompile($compilationContext);
    }