Example #1
0
 /**
  * Parses a parent class declaration for the given <b>$class</b>.
  *
  * @param PHP_Depend_Code_Class $class The context class instance.
  *
  * @return PHP_Depend_Code_Class
  * @since 1.0.0
  */
 private function _parseClassExtends(PHP_Depend_Code_Class $class)
 {
     $this->consumeToken(self::T_EXTENDS);
     $this->_tokenStack->push();
     $class->setParentClassReference($this->_setNodePositionsAndReturn($this->builder->buildASTClassReference($this->parseQualifiedName())));
     return $class;
 }
Example #2
0
 /**
  * Tests that build interface updates the source file information for null
  * values.
  *
  * @return void
  */
 public function testSetSourceFileInformationForNullValue()
 {
     $file = new PHP_Depend_Code_File(__FILE__);
     $class = new PHP_Depend_Code_Class(__CLASS__);
     $class->setSourceFile($file);
     $method = new PHP_Depend_Code_Method(__FUNCTION__);
     $method->setParent($class);
     self::assertSame($file, $method->getSourceFile());
 }
Example #3
0
 /**
  * The magic wakeup method will be called by PHP's runtime environment when
  * a serialized instance of this class was unserialized. This implementation
  * of the wakeup method will register this object in the the global class
  * context.
  *
  * @return void
  */
 public function __wakeup()
 {
     parent::__wakeup();
     $this->context->registerTrait($this);
 }
Example #4
0
 /**
  * Calculates the Variables Inheritance of a class metric, this method only
  * counts protected and public properties of parent classes.
  *
  * @param PHP_Depend_Code_Class $class The context class instance.
  *
  * @return integer
  */
 private function calculateVarsi(PHP_Depend_Code_Class $class)
 {
     // List of properties, this method only counts not overwritten properties
     $properties = array();
     // Collect all properties of the context class
     foreach ($class->getProperties() as $prop) {
         $properties[$prop->getName()] = true;
     }
     foreach ($class->getParentClasses() as $parent) {
         foreach ($parent->getProperties() as $prop) {
             if (!$prop->isPrivate() && !isset($properties[$prop->getName()])) {
                 $properties[$prop->getName()] = true;
             }
         }
     }
     return count($properties);
 }
Example #5
0
 /**
  * Calculates metrics for the given <b>$class</b> instance.
  *
  * @param PHP_Depend_Code_Class $class The context class instance.
  *
  * @return void
  * @see PHP_Depend_VisitorI::visitClass()
  */
 public function visitClass(PHP_Depend_Code_Class $class)
 {
     if (false === $class->isUserDefined()) {
         return;
     }
     $this->fireStartClass($class);
     ++$this->_cls;
     if ($class->isAbstract()) {
         ++$this->_clsa;
     }
     $parentClass = $class->getParentClass();
     if ($parentClass !== null) {
         if ($parentClass->getParentClass() === null) {
             $this->_roots[$parentClass->getUUID()] = true;
         }
         $this->_noneLeafs[$parentClass->getUUID()] = true;
     }
     // Store node metric
     $this->_nodeMetrics[$class->getUUID()] = array();
     foreach ($class->getMethods() as $method) {
         $method->accept($this);
     }
     foreach ($class->getProperties() as $property) {
         $property->accept($this);
     }
     $this->fireEndClass($class);
 }
Example #6
0
 /**
  * Visits a class node.
  *
  * @param PHP_Depend_Code_Class $class The current class node.
  *
  * @return void
  * @see PHP_Depend_VisitorI::visitClass()
  */
 public function visitClass(PHP_Depend_Code_Class $class)
 {
     $this->visits[] = $class->getName();
     parent::visitClass($class);
 }
Example #7
0
 /**
  * testBuilderCreatesCaseInSensitiveMethodIdentifiers
  *
  * @return void
  */
 public function testBuilderCreatesCaseInSensitiveMethodIdentifiers()
 {
     $file = new PHP_Depend_Code_File(__FILE__);
     $file->setUuid(__FUNCTION__);
     $class = new PHP_Depend_Code_Class(__FUNCTION__);
     $class->setSourceFile($file);
     $method0 = new PHP_Depend_Code_Method(__FUNCTION__);
     $method0->setParent($class);
     $method1 = new PHP_Depend_Code_Method(strtolower(__FUNCTION__));
     $method1->setParent($class);
     $builder0 = new PHP_Depend_Util_UuidBuilder();
     $builder1 = new PHP_Depend_Util_UuidBuilder();
     self::assertEquals($builder0->forMethod($method0), $builder1->forMethod($method1));
 }
 /**
  * testIteratorReturnsSameClassOnlyOnce
  *
  * @return void
  */
 public function testIteratorReturnsSameClassOnlyOnce()
 {
     $class1 = new PHP_Depend_Code_Class('c1');
     $class1->setUUID(md5(23));
     $class2 = new PHP_Depend_Code_Class('c2');
     $class2->setUUID(md5(23));
     $reference1 = $this->getMockBuilder(PHP_Depend_Code_ASTSelfReference::CLAZZ)->disableOriginalConstructor()->getMock();
     $reference1->expects($this->once())->method('getType')->will($this->returnValue($class1));
     $reference2 = $this->getMockBuilder(PHP_Depend_Code_ASTSelfReference::CLAZZ)->disableOriginalConstructor()->getMock();
     $reference2->expects($this->once())->method('getType')->will($this->returnValue($class2));
     $references = array($reference1, $reference2);
     $refs = new PHP_Depend_Code_ClassOrInterfaceReferenceIterator($references);
     $types = array();
     foreach ($refs as $type) {
         $types[] = $type->getUUID();
     }
     $this->assertEquals(array($class1->getUUID()), $types);
 }
Example #9
0
 /**
  * testBuilderCreatesExpectedIdentifierForMethod
  *
  * @return void
  * @covers PHP_Depend_Util_UuidBuilder
  * @group pdepend
  * @group pdepend::util
  * @group unittest
  */
 public function testBuilderCreatesExpectedIdentifierForMethod()
 {
     $class = new PHP_Depend_Code_Class(__CLASS__);
     $class->setUUID('FooBar');
     $method = new PHP_Depend_Code_Method(__FUNCTION__);
     $method->setParent($class);
     $builder = new PHP_Depend_Util_UuidBuilder();
     $this->assertRegExp('/^FooBar\\-[a-z0-9]{11}$/', $builder->forMethod($method));
 }
Example #10
0
 /**
  * Creates a ready to use class fixture.
  *
  * @param string $name Optional class name.
  *
  * @return PHP_Depend_Code_Class
  * @since 1.0.2
  */
 protected function createClassFixture($name = null)
 {
     $name = $name ? $name : get_class($this);
     $class = new PHP_Depend_Code_Class($name);
     $class->setSourceFile(new PHP_Depend_Code_File($GLOBALS['argv'][0]));
     $class->setCache(new PHP_Depend_Util_Cache_Driver_Memory());
     $class->setContext($this->getMock('PHP_Depend_Builder_Context'));
     return $class;
 }
Example #11
0
 /**
  * Visits a class node.
  *
  * @param PHP_Depend_Code_Class $class The current class node.
  *
  * @return void
  * @see PHP_Depend_VisitorI::visitClass()
  */
 public function visitClass(PHP_Depend_Code_Class $class)
 {
     if (false === $class->isUserDefined()) {
         return;
     }
     $this->fireStartClass($class);
     // Update global class count
     ++$this->_noc;
     // Update parent package
     $packageUUID = $class->getPackage()->getUUID();
     ++$this->_nodeMetrics[$packageUUID][self::M_NUMBER_OF_CLASSES];
     $this->_nodeMetrics[$class->getUUID()] = array(self::M_NUMBER_OF_METHODS => 0);
     foreach ($class->getMethods() as $method) {
         $method->accept($this);
     }
     $this->fireEndClass($class);
 }
Example #12
0
 /**
  * Calculates the Weight Method Per Class metric, this method only counts
  * protected and public methods of parent classes.
  *
  * @param PHP_Depend_Code_Class $class The context class instance.
  *
  * @return integer
  */
 private function _calculateWMCi(PHP_Depend_Code_Class $class)
 {
     // List of methods, this method only counts not overwritten methods.
     $ccn = array();
     // First collect all methods of the context class
     foreach ($class->getMethods() as $m) {
         $ccn[$m->getName()] = $this->_cyclomaticAnalyzer->getCCN2($m);
     }
     // Get parent class and collect all non private methods.
     $parent = $class->getParentClass();
     while ($parent !== null) {
         // Count all methods
         foreach ($parent->getMethods() as $m) {
             if (!$m->isPrivate() && !isset($methods[$m->getName()])) {
                 $ccn[$m->getName()] = $this->_cyclomaticAnalyzer->getCCN2($m);
             }
         }
         // Fetch parent class
         $parent = $parent->getParentClass();
     }
     return array_sum($ccn);
 }
Example #13
0
 /**
  * testHasSuppressWarningsAnnotationForReturnsTrue
  *
  * @return void
  * @covers PHP_PMD_Node_AbstractNode
  * @group phpmd
  * @group phpmd::node
  * @group unittest
  */
 public function testHasSuppressWarningsAnnotationForReturnsTrue()
 {
     $class = new PHP_Depend_Code_Class(null);
     $class->setDocComment('/** @SuppressWarnings("PMD") */');
     $rule = $this->getMock('PHP_PMD_AbstractRule');
     $node = new PHP_PMD_Node_Class($class);
     $this->assertTrue($node->hasSuppressWarningsAnnotationFor($rule));
 }
Example #14
0
 /**
  * Visits a class node.
  *
  * @param PHP_Depend_Code_Class $class The current class node.
  *
  * @return void
  * @see PHP_Depend_VisitorI::visitClass()
  */
 public function visitClass(PHP_Depend_Code_Class $class)
 {
     if (!$class->isUserDefined()) {
         return;
     }
     $xml = end($this->_xmlStack);
     $doc = $xml->ownerDocument;
     $classXml = $doc->createElement('class');
     $classXml->setAttribute('name', $class->getName());
     $this->writeNodeMetrics($classXml, $class);
     $this->writeFileReference($classXml, $class->getSourceFile());
     $xml->appendChild($classXml);
     array_push($this->_xmlStack, $classXml);
     foreach ($class->getMethods() as $method) {
         $method->accept($this);
     }
     foreach ($class->getProperties() as $property) {
         $property->accept($this);
     }
     array_pop($this->_xmlStack);
 }
Example #15
0
 /**
  * Creates an abstract item instance.
  *
  * @return PHP_Depend_Code_AbstractItem
  */
 protected function createItem()
 {
     $class = new PHP_Depend_Code_Class(__CLASS__);
     $class->setContext($this->getMock('PHP_Depend_Builder_Context'));
     return $class;
 }
Example #16
0
 /**
  * Visits a class node.
  *
  * @param PHP_Depend_Code_Class $node The current class node.
  *
  * @return void
  * @see PHP_Depend_VisitorI::visitClass()
  */
 public function visitClass(PHP_Depend_Code_Class $node)
 {
     if (!$node->isUserDefined()) {
         return;
     }
     $this->_apply(new PHP_PMD_Node_Class($node));
     parent::visitClass($node);
 }
Example #17
0
 /**
  * testVisitClassCountsClassesThatAreNotUserDefined
  *
  * @return void
  * @covers PHP_Depend_Metrics_NodeCount_Analyzer
  * @group pdepend
  * @group pdepend::metrics
  * @group pdepend::metrics::nodecount
  * @group unittest
  */
 public function testVisitClassCountsClassesThatAreNotUserDefined()
 {
     $userDefined = new PHP_Depend_Code_Class('Manuel');
     $userDefined->setUserDefined();
     $package = new PHP_Depend_Code_Package('PHP_Depend');
     $package->addType($userDefined);
     $analyzer = new PHP_Depend_Metrics_NodeCount_Analyzer();
     $analyzer->analyze(new PHP_Depend_Code_NodeIterator(array($package)));
     $metrics = $analyzer->getNodeMetrics($package);
     $this->assertEquals(1, $metrics['noc']);
 }
Example #18
0
 /**
  * testIsUserDefinedReturnsTrueWhenChildElementIsUserDefined
  *
  * @return void
  * @covers PHP_Depend_Code_Package
  * @group pdepend
  * @group pdepend::code
  * @group unittest
  */
 public function testIsUserDefinedReturnsTrueWhenChildElementIsUserDefined()
 {
     $class = new PHP_Depend_Code_Class('class', 0);
     $class->setUserDefined();
     $package = new PHP_Depend_Code_Package('package1');
     $package->addType($class);
     $this->assertTrue($package->isUserDefined());
 }
Example #19
0
 /**
  * Initializes a empty metric container for the given class node.
  *
  * @param PHP_Depend_Code_Class $class The context class instance.
  *
  * @return void
  * @since 0.9.10
  */
 private function initNodeMetricsForClass(PHP_Depend_Code_Class $class)
 {
     $uuid = $class->getUuid();
     if (isset($this->nodeMetrics[$uuid])) {
         return;
     }
     ++$this->numberOfClasses;
     $this->nodeMetrics[$uuid] = array(self::M_DEPTH_OF_INHERITANCE_TREE => 0, self::M_NUMBER_OF_ADDED_METHODS => 0, self::M_NUMBER_OF_DERIVED_CLASSES => 0, self::M_NUMBER_OF_OVERWRITTEN_METHODS => 0);
     foreach ($class->getParentClasses() as $parent) {
         $this->initNodeMetricsForClass($parent);
     }
 }
Example #20
0
 /**
  * Visits a class node.
  *
  * @param PHP_Depend_Code_Class $class The current class node.
  *
  * @return void
  * @see PHP_Depend_VisitorI::visitClass()
  */
 public function visitClass(PHP_Depend_Code_Class $class)
 {
     if (!$class->isUserDefined()) {
         return;
     }
     $doc = $this->packages->ownerDocument;
     $classXml = $doc->createElement('Class');
     $classXml->setAttribute('sourceFile', (string) $class->getSourceFile());
     $classXml->appendChild($doc->createTextNode($class->getName()));
     if ($class->isAbstract()) {
         $this->abstractClasses->appendChild($classXml);
     } else {
         $this->concreteClasses->appendChild($classXml);
     }
 }
Example #21
0
 /**
  * This method will persist a class instance for later reuse.
  *
  * @param string                $className   The local class name.
  * @param string                $packageName The package name
  * @param PHP_Depend_Code_Class $class       The context class.
  *
  * @return void
  * @@since 0.9.5
  */
 protected function storeClass($className, $packageName, PHP_Depend_Code_Class $class)
 {
     $className = strtolower($className);
     if (!isset($this->_classes[$className][$packageName])) {
         $this->_classes[$className][$packageName] = array();
     }
     $this->_classes[$className][$packageName][$class->getUUID()] = $class;
     $package = $this->buildPackage($packageName);
     $package->addType($class);
 }
Example #22
0
 /**
  * Builds a new class instance or reuses a previous created class.
  *
  * Where possible you should give a qualified class name, that is prefixed
  * with the package identifier.
  *
  * <code>
  *   $builder->buildClass('php::depend::Parser');
  * </code>
  *
  * To determine the correct class, this method implements the following
  * algorithm.
  *
  * <ol>
  *   <li>Check for an exactly matching instance and reuse it.</li>
  *   <li>Check for a class instance that belongs to the default package. If
  *   such an instance exists, reuse it and replace the default package with
  *   the newly given package information.</li>
  *   <li>Check that the requested class is in the default package, if this
  *   is true, reuse the first class instance and ignore the default package.
  *   </li>
  *   <li>Create a new instance for the specified package.</li>
  * </ol>
  *
  * @param string $name The class name.
  *
  * @return PHP_Depend_Code_Class The created class object.
  */
 public function buildClass($name)
 {
     $this->checkBuilderState();
     $className = $this->extractTypeName($name);
     $packageName = $this->extractPackageName($name);
     $class = new PHP_Depend_Code_Class($className);
     $class->setSourceFile($this->defaultFile);
     $this->storeClass($className, $packageName, $class);
     return $class;
 }
Example #23
0
 /**
  * Initializes a empty metric container for the given class node.
  *
  * @param PHP_Depend_Code_Class $class The context class instance.
  *
  * @return void
  * @since 0.9.10
  */
 private function _initNodeMetricsForClass(PHP_Depend_Code_Class $class)
 {
     if (is_object($class->getParentClass())) {
         $this->_initNodeMetricsForClass($class->getParentClass());
     }
     $uuid = $class->getUUID();
     if (isset($this->_nodeMetrics[$uuid])) {
         return;
     }
     ++$this->_numberOfClasses;
     $this->_nodeMetrics[$uuid] = array(self::M_DEPTH_OF_INHERITANCE_TREE => 0, self::M_NUMBER_OF_ADDED_METHODS => 0, self::M_NUMBER_OF_DERIVED_CLASSES => 0, self::M_NUMBER_OF_OVERWRITTEN_METHODS => 0);
 }
Example #24
0
 /**
  * Creates an abstract item instance.
  *
  * @return PHP_Depend_Code_AbstractItem
  */
 protected function createItem()
 {
     $class = new PHP_Depend_Code_Class(__CLASS__);
     $class->setSourceFile(new PHP_Depend_Code_File(__FILE__));
     $class->setCache(new PHP_Depend_Util_Cache_Driver_Memory());
     $class->setContext($this->getMock('PHP_Depend_Builder_Context'));
     return $class;
 }
Example #25
0
 /**
  * Tests the visitor accept method.
  *
  * @return void
  * @covers PHP_Depend_Code_AbstractClassOrInterface
  * @covers PHP_Depend_Code_Class
  * @group pdepend
  * @group pdepend::code
  * @group unittest
  */
 public function testVisitorAccept()
 {
     $class = new PHP_Depend_Code_Class('clazz', 0);
     $visitor = new PHP_Depend_Visitor_TestNodeVisitor();
     $class->accept($visitor);
     $this->assertSame($class, $visitor->class);
 }