/** * Check to see if the given Clazz is a duplicate * * @return null */ public static function analyzeParentConstructorCalled(CodeBase $code_base, Clazz $clazz) { // Only look at classes configured to require a call // to its parent constructor if (!in_array($clazz->getName(), Config::get()->parent_constructor_required)) { return; } // Don't worry about internal classes if ($clazz->isInternal()) { return; } // Don't worry if there's no parent class if (!$clazz->hasParentClassFQSEN()) { return; } if (!$code_base->hasClassWithFQSEN($clazz->getParentClassFQSEN())) { // This is an error, but its caught elsewhere. We'll // just roll through looking for other errors return; } $parent_clazz = $code_base->getClassByFQSEN($clazz->getParentClassFQSEN()); if (!$parent_clazz->isAbstract() && !$clazz->getIsParentConstructorCalled()) { Issue::emit(Issue::TypeParentConstructorCalled, $clazz->getContext()->getFile(), $clazz->getContext()->getLineNumberStart(), (string) $clazz->getFQSEN(), (string) $parent_clazz->getFQSEN()); } }
/** * Check to see if the given Clazz is a duplicate * * @return null */ public static function analyzeParentClassExists(CodeBase $code_base, Clazz $clazz) { // Don't worry about internal classes if ($clazz->isInternal()) { return; } if ($clazz->hasParentType()) { self::fqsenExistsForClass($clazz->getParentClassFQSEN(), $code_base, $clazz, Issue::UndeclaredExtendedClass); } foreach ($clazz->getInterfaceFQSENList() as $fqsen) { self::fqsenExistsForClass($fqsen, $code_base, $clazz, Issue::UndeclaredInterface); } foreach ($clazz->getTraitFQSENList() as $fqsen) { self::fqsenExistsForClass($fqsen, $code_base, $clazz, Issue::UndeclaredTrait); } }
/** * Check to see if the given Clazz is a duplicate * * @return null */ public static function analyzeParentClassExists(CodeBase $code_base, Clazz $clazz) { // Don't worry about internal classes if ($clazz->isInternal()) { return; } if ($clazz->hasParentClassFQSEN()) { self::fqsenExistsForClass($clazz->getParentClassFQSEN(), $code_base, $clazz, "Trying to inherit from unknown class %s"); } foreach ($clazz->getInterfaceFQSENList() as $fqsen) { self::fqsenExistsForClass($fqsen, $code_base, $clazz, "Trying to implement unknown interface %s"); } foreach ($clazz->getTraitFQSENList() as $fqsen) { self::fqsenExistsForClass($fqsen, $code_base, $clazz, "Trying to use unknown trait %s"); } }
/** * Add a class to the code base * * @return null */ public function addClass(Clazz $class) { $this->class_map[$class->getFQSEN()] = $class; // For classes that aren't internal PHP classes if (!$class->isInternal()) { // Associate the class with the file it was found in $this->getFileByPath($class->getFileRef()->getFile())->addClassFQSEN($class->getFQSEN()); } }