files[$fileName] = $file; } public function addClass($class) { if (isset($this->classes[$class->name])) { throw new Exception('Duplicate class definition: ' . $class->name . ' in file ' . $class->fileName); } $this->classes[$class->name] = $class; } public function addInterface($interface) { if (isset($this->interfaces[$interface->name])) { throw new Exception('Duplicate interface definition: ' . $interface->name . ' in file ' . $interface->fileName); } $this->interfaces[$interface->name] = $interface; } public function addTrait($trait) { if (isset($this->traits[$trait->name])) { throw new Exception('Duplicate trait definition: ' . $trait->name . ' in file ' . $trait->fileName); } $this->traits[$trait->name] = $trait; } 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->updateSubclassInferfacesTraits($class); } // TODO update interface and trait usages } /** * Add implemented interfaces and used traits to subclasses * @param ClassDoc $class */ protected function updateSubclassInferfacesTraits($class) { foreach($class->subclasses as $subclass) { $subclass = $this->classes[$subclass]; $subclass->interfaces = array_unique(array_merge($subclass->interfaces, $class->interfaces)); $subclass->traits = array_unique(array_merge($subclass->traits, $class->traits)); $this->updateSubclassInferfacesTraits($subclass); } } }