public function applyDependencies(AstParserInterface $astParser, AstMap $astMap, DependencyResult $dependencyResult)
 {
     foreach ($astMap->getAstClassReferences() as $classReference) {
         foreach ($astMap->getClassInherits($classReference->getClassName()) as $inherit) {
             if ($inherit instanceof FlattenAstInherit) {
                 continue;
             }
             $dependencyResult->addDependency(new Dependency($classReference->getClassName(), $inherit->getLine(), $inherit->getClassName()));
         }
     }
 }
 public function flattenDependencies(AstMap $astMap, DependencyResult $dependencyResult)
 {
     foreach ($astMap->getAstClassReferences() as $classReference) {
         foreach ($astMap->getClassInherits($classReference->getClassName()) as $inherit) {
             if (!$inherit instanceof FlattenAstInherit) {
                 continue;
             }
             foreach ($dependencyResult->getDependenciesByClass($inherit->getClassName()) as $dep) {
                 $dependencyResult->addInheritDependency(new InheritDependency($classReference->getClassName(), $dep->getClassB(), $dep, $inherit));
             }
         }
     }
 }
 /**
  * @param AstMap                          $astMap
  * @param DependencyResult                $dependencyResult
  * @param ClassNameLayerResolverInterface $classNameLayerResolver
  *
  * @return array
  */
 private function calculateLayerDependencies(AstMap $astMap, DependencyResult $dependencyResult, ClassNameLayerResolverInterface $classNameLayerResolver)
 {
     $layersDependOnLayers = [];
     // all classes
     foreach ($astMap->getAstClassReferences() as $classReferences) {
         foreach ($classNameLayerResolver->getLayersByClassName($classReferences->getClassName()) as $classReferenceLayer) {
             $layersDependOnLayers[$classReferenceLayer] = [];
         }
     }
     // dependencies
     foreach ($dependencyResult->getDependenciesAndInheritDependencies() as $dependency) {
         $layersA = $classNameLayerResolver->getLayersByClassName($dependency->getClassA());
         $layersB = $classNameLayerResolver->getLayersByClassName($dependency->getClassB());
         if (empty($layersB)) {
             continue;
         }
         foreach ($layersA as $layerA) {
             if (!isset($layersDependOnLayers[$layerA])) {
                 $layersDependOnLayers[$layerA] = [];
             }
             foreach ($layersB as $layerB) {
                 if ($layerA == $layerB) {
                     continue;
                 }
                 if (!isset($layersDependOnLayers[$layerA][$layerB])) {
                     $layersDependOnLayers[$layerA][$layerB] = 1;
                     continue;
                 }
                 $layersDependOnLayers[$layerA][$layerB] = $layersDependOnLayers[$layerA][$layerB] + 1;
             }
         }
     }
     return $layersDependOnLayers;
 }