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);
}