public function updateReferences()
{
// update all subclass references
foreach ($this->classes as $class) {
$className = $class->name;
while (isset($this->classes[$class->parentClass])) {
$class = $this->classes[$class->parentClass];
$class->subclasses[] = $className;
}
}
// update interfaces of subclasses
foreach ($this->classes as $class) {
$this->updateSubclassInterfacesTraits($class);
}
// update implementedBy and usedBy for interfaces and traits
foreach ($this->classes as $class) {
foreach ($class->traits as $trait) {
if (isset($this->traits[$trait])) {
$trait = $this->traits[$trait];
$trait->usedBy[] = $class->name;
$class->properties = array_merge($trait->properties, $class->properties);
$class->methods = array_merge($trait->methods, $class->methods);
}
}
foreach ($class->interfaces as $interface) {
if (isset($this->interfaces[$interface])) {
$this->interfaces[$interface]->implementedBy[] = $class->name;
if ($class->isAbstract) {
// add not implemented interface methods
foreach ($this->interfaces[$interface]->methods as $method) {
if (!isset($class->methods[$method->name])) {
$class->methods[$method->name] = $method;
}
}
}
}
}
}
foreach ($this->interfaces as $interface) {
foreach ($interface->parentInterfaces as $pInterface) {
if (isset($this->interfaces[$pInterface])) {
$this->interfaces[$pInterface]->implementedBy[] = $interface->name;
}
}
}
// inherit docs
foreach ($this->classes as $class) {
$this->inheritDocs($class);
}
// inherit properties, methods, contants and events to subclasses
foreach ($this->classes as $class) {
$this->updateSubclassInheritance($class);
}
foreach ($this->interfaces as $interface) {
$this->updateSubInterfaceInheritance($interface);
}
// add properties from getters and setters
foreach ($this->classes as $class) {
$this->handlePropertyFeature($class);
}
// TODO reference exceptions to methods where they are thrown
}