/**
  * @covers phpDocumentor\Descriptor\ProjectDescriptor::__construct
  * @covers phpDocumentor\Descriptor\ProjectDescriptor::setIndexes
  * @covers phpDocumentor\Descriptor\ProjectDescriptor::getIndexes
  */
 public function testGetSetIndexes()
 {
     $this->assertInstanceOf('phpDocumentor\\Descriptor\\Collection', $this->fixture->getIndexes());
     $indexCollection = new Collection();
     $this->fixture->setIndexes($indexCollection);
     $this->assertSame($indexCollection, $this->fixture->getIndexes());
 }
Пример #2
0
 /**
  * Creates a class inheritance diagram.
  *
  * @param ProjectDescriptor $project
  * @param Transformation    $transformation
  *
  * @return void
  */
 public function processClass(ProjectDescriptor $project, Transformation $transformation)
 {
     try {
         $this->checkIfGraphVizIsInstalled();
     } catch (\Exception $e) {
         echo $e->getMessage();
         return;
     }
     if ($transformation->getParameter('font') !== null && $transformation->getParameter('font')->getValue()) {
         $this->nodeFont = $transformation->getParameter('font')->getValue();
     } else {
         $this->nodeFont = 'Courier';
     }
     $filename = $this->getDestinationPath($transformation);
     $graph = GraphVizGraph::create()->setRankSep('1.0')->setCenter('true')->setRank('source')->setRankDir('RL')->setSplines('true')->setConcentrate('true');
     $this->buildNamespaceTree($graph, $project->getNamespace());
     $classes = $project->getIndexes()->get('classes', new Collection())->getAll();
     $interfaces = $project->getIndexes()->get('interfaces', new Collection())->getAll();
     $traits = $project->getIndexes()->get('traits', new Collection())->getAll();
     /** @var ClassDescriptor[]|InterfaceDescriptor[]|TraitDescriptor[] $containers  */
     $containers = array_merge($classes, $interfaces, $traits);
     foreach ($containers as $container) {
         $from_name = $container->getFullyQualifiedStructuralElementName();
         $parents = array();
         $implemented = array();
         if ($container instanceof ClassDescriptor) {
             if ($container->getParent()) {
                 $parents[] = $container->getParent();
             }
             $implemented = $container->getInterfaces()->getAll();
         }
         if ($container instanceof InterfaceDescriptor) {
             $parents = $container->getParent()->getAll();
         }
         /** @var string|ClassDescriptor|InterfaceDescriptor $parent */
         foreach ($parents as $parent) {
             $edge = $this->createEdge($graph, $from_name, $parent);
             $edge->setArrowHead('empty');
             $graph->link($edge);
         }
         /** @var string|ClassDescriptor|InterfaceDescriptor $parent */
         foreach ($implemented as $parent) {
             $edge = $this->createEdge($graph, $from_name, $parent);
             $edge->setStyle('dotted');
             $edge->setArrowHead('empty');
             $graph->link($edge);
         }
     }
     $graph->export('svg', $filename);
 }
 /**
  * Iterates through each element in the project and replaces its inline @see and @link tag with a markdown
  * representation.
  *
  * @param ProjectDescriptor $project
  *
  * @return void
  */
 public function execute(ProjectDescriptor $project)
 {
     /** @var Collection|DescriptorAbstract[] $elementCollection */
     $this->elementCollection = $project->getIndexes()->get('elements');
     foreach ($this->elementCollection as $descriptor) {
         $this->resolveSeeAndLinkTags($descriptor);
     }
 }
 /**
  * {@inheritDoc}
  */
 public function execute(ProjectDescriptor $project)
 {
     $elements = $project->getIndexes()->get('elements');
     /** @var DescriptorAbstract $element */
     foreach ($elements as $element) {
         $element->setDescription($this->replaceInlineExamples($element));
     }
 }
 /**
  * @covers phpDocumentor\Compiler\Pass\NamespaceTreeBuilder::execute
  * @covers phpDocumentor\Compiler\Pass\NamespaceTreeBuilder::addElementsOfTypeToNamespace
  * @covers phpDocumentor\Compiler\Pass\NamespaceTreeBuilder::createNamespaceDescriptorTree
  */
 public function testNamespaceStringIsConvertedToTreeAndAddedToElements()
 {
     $class = new ClassDescriptor();
     $class->setNamespace('My\\Space\\Deeper');
     $class->setFullyQualifiedStructuralElementName('My\\Space\\Deeper\\Class1');
     $this->project->getFiles()->get(0)->getClasses()->add($class);
     // assert that namespaces are not created in duplicate by processing two classes
     $class2 = new ClassDescriptor();
     $class2->setNamespace('My\\Space\\Deeper2');
     $class2->setFullyQualifiedStructuralElementName('My\\Space\\Deeper2\\Class2');
     $this->project->getFiles()->get(0)->getClasses()->add($class2);
     $this->fixture->execute($this->project);
     $elements = $this->project->getIndexes()->get('elements')->getAll();
     $this->assertSame(array('~\\', '~\\My', '~\\My\\Space', '~\\My\\Space\\Deeper', '~\\My\\Space\\Deeper2'), array_keys($elements));
     $this->assertInstanceOf('phpDocumentor\\Descriptor\\NamespaceDescriptor', $this->project->getNamespace()->getChildren()->get('My'));
     $this->assertInstanceOf('phpDocumentor\\Descriptor\\NamespaceDescriptor', $this->project->getNamespace()->getChildren()->get('My')->getChildren()->get('Space'));
     $this->assertSame($elements['~\\My'], $this->project->getNamespace()->getChildren()->get('My'));
 }
 /**
  * Adds a class descriptor to the project's elements and add a parent file.
  *
  * @param FileDescriptor $fileDescriptor
  *
  * @return ClassDescriptor
  */
 protected function givenProjectHasClassDescriptorAssociatedWithFile($fileDescriptor)
 {
     $classDescriptor = new ClassDescriptor();
     if ($fileDescriptor) {
         $classDescriptor->setFile($fileDescriptor);
     }
     $elementIndex = $this->project->getIndexes()->get('elements', new Collection());
     $elementIndex->add($classDescriptor);
     return $classDescriptor;
 }
 /**
  * {@inheritDoc}
  */
 public function execute(ProjectDescriptor $project)
 {
     $elementCollection = new Collection();
     $project->getIndexes()->set('elements', $elementCollection);
     $constantsIndex = $project->getIndexes()->get('constants', new Collection());
     $functionsIndex = $project->getIndexes()->get('functions', new Collection());
     $classesIndex = $project->getIndexes()->get('classes', new Collection());
     $interfacesIndex = $project->getIndexes()->get('interfaces', new Collection());
     $traitsIndex = $project->getIndexes()->get('traits', new Collection());
     foreach ($project->getFiles() as $file) {
         $this->addElementsToIndexes($file->getConstants()->getAll(), array($constantsIndex, $elementCollection));
         $this->addElementsToIndexes($file->getFunctions()->getAll(), array($functionsIndex, $elementCollection));
         foreach ($file->getClasses()->getAll() as $element) {
             $this->addElementsToIndexes($element, array($classesIndex, $elementCollection));
             $this->addElementsToIndexes($this->getSubElements($element), array($elementCollection));
         }
         foreach ($file->getInterfaces()->getAll() as $element) {
             $this->addElementsToIndexes($element, array($interfacesIndex, $elementCollection));
             $this->addElementsToIndexes($this->getSubElements($element), array($elementCollection));
         }
         foreach ($file->getTraits()->getAll() as $element) {
             $this->addElementsToIndexes($element, array($traitsIndex, $elementCollection));
             $this->addElementsToIndexes($this->getSubElements($element), array($elementCollection));
         }
     }
 }
 /**
  * @covers phpDocumentor\Compiler\Pass\PackageTreeBuilder::execute
  * @covers phpDocumentor\Compiler\Pass\PackageTreeBuilder::addElementsOfTypeToPackage
  */
 public function testAddFunctionToNamespace()
 {
     $function = new FunctionDescriptor();
     $function->setPackage('My\\Space');
     $function->setFullyQualifiedStructuralElementName('My\\Space\\Function1');
     $this->project->getFiles()->get(0)->getFunctions()->add($function);
     // double check if a second function in the same deep namespace ends up at the right location
     $function2 = new FunctionDescriptor();
     $function2->setPackage('My\\Space');
     $function2->setFullyQualifiedStructuralElementName('My\\Space\\Function2');
     $this->project->getFiles()->get(0)->getFunctions()->add($function2);
     $this->fixture->execute($this->project);
     $this->assertSame(array($function, $function2), $this->project->getIndexes()->get('packages')->get('\\My\\Space')->getFunctions()->getAll());
 }
 /**
  * {@inheritDoc}
  */
 public function execute(ProjectDescriptor $project)
 {
     /** @var DescriptorAbstract $element */
     foreach ($project->getIndexes()->get('elements', new Collection()) as $element) {
         $todos = $element->getTags()->get('todo');
         if (!$todos) {
             continue;
         }
         /** @var TagDescriptor $todo */
         foreach ($todos as $todo) {
             $fileDescriptor = $this->getFileDescriptor($element);
             $this->addTodoMarkerToFile($fileDescriptor, $todo, $element->getLine());
         }
     }
 }
 /**
  * @covers phpDocumentor\Compiler\Pass\ElementsIndexBuilder::execute
  * @covers phpDocumentor\Compiler\Pass\ElementsIndexBuilder::addElementsToIndexes
  * @covers phpDocumentor\Compiler\Pass\ElementsIndexBuilder::getIndexKey
  * @covers phpDocumentor\Compiler\Pass\ElementsIndexBuilder::getSubElements
  */
 public function testAddMethodsToIndex()
 {
     $file1 = $this->project->getFiles()->get(0);
     $classDescriptor1 = new ClassDescriptor();
     $classDescriptor1->setFullyQualifiedStructuralElementName('My\\Space\\Class1');
     $file1->getClasses()->add($classDescriptor1);
     $classMethodDescriptor1 = new MethodDescriptor();
     $classMethodDescriptor1->setFullyQualifiedStructuralElementName('My\\Space\\Class1::METHOD');
     $classDescriptor1->getMethods()->add($classMethodDescriptor1);
     $file2 = $this->project->getFiles()->get(1);
     $classDescriptor2 = new ClassDescriptor();
     $classDescriptor2->setFullyQualifiedStructuralElementName('My\\Space\\Class2');
     $file2->getClasses()->add($classDescriptor2);
     $classMethodDescriptor2 = new MethodDescriptor();
     $classMethodDescriptor2->setFullyQualifiedStructuralElementName('My\\Space\\Class2::METHOD');
     $classDescriptor2->getMethods()->add($classMethodDescriptor2);
     $this->fixture->execute($this->project);
     $elements = $this->project->getIndexes()->get('elements')->getAll();
     $this->assertCount(4, $elements);
     $this->assertSame(array('My\\Space\\Class1', 'My\\Space\\Class1::METHOD', 'My\\Space\\Class2', 'My\\Space\\Class2::METHOD'), array_keys($elements));
     $this->assertSame(array($classDescriptor1, $classMethodDescriptor1, $classDescriptor2, $classMethodDescriptor2), array_values($elements));
     // class methods are not indexed separately
     $this->assertNull($this->project->getIndexes()->get('methods'));
 }
 /**
  * Creates a tree of NamespaceDescriptors based on the provided FQNN (namespace name).
  *
  * This method will examine the namespace name and create a namespace descriptor for each part of
  * the FQNN if it doesn't exist in the namespaces field of the current namespace (starting with the root
  * Namespace in the Project Descriptor),
  *
  * As an intended side effect this method also populates the *elements* index of the ProjectDescriptor with all
  * created NamespaceDescriptors. Each index key is prefixed with a tilde (~) so that it will not conflict with
  * other FQSEN's, such as classes or interfaces.
  *
  * @param ProjectDescriptor $project
  * @param string            $namespaceName A FQNN of the namespace (and parents) to create.
  *
  * @see ProjectDescriptor::getNamespace() for the root namespace.
  * @see NamespaceDescriptor::getNamespaces() for the child namespaces of a given namespace.
  *
  * @return void
  */
 protected function createNamespaceDescriptorTree(ProjectDescriptor $project, $namespaceName)
 {
     $parts = explode('\\', ltrim($namespaceName, '\\'));
     $fqnn = '';
     // this method does not use recursion to traverse the tree but uses a pointer that will be overridden with the
     // next item that is to be traversed (child namespace) at the end of the loop.
     $pointer = $project->getNamespace();
     foreach ($parts as $part) {
         $fqnn .= '\\' . $part;
         if ($pointer->getChildren()->get($part)) {
             $pointer = $pointer->getChildren()->get($part);
             continue;
         }
         // namespace does not exist, create it
         $interimNamespaceDescriptor = new NamespaceDescriptor();
         $interimNamespaceDescriptor->setParent($pointer);
         $interimNamespaceDescriptor->setName($part);
         $interimNamespaceDescriptor->setFullyQualifiedStructuralElementName($fqnn);
         // add to the pointer's list of children
         $pointer->getChildren()->set($part, $interimNamespaceDescriptor);
         // add to index
         $project->getIndexes()->elements['~' . $fqnn] = $interimNamespaceDescriptor;
         $project->getIndexes()->get('namespaces', new Collection())->add($interimNamespaceDescriptor);
         // move pointer forward
         $pointer = $interimNamespaceDescriptor;
     }
 }
Пример #12
0
 /**
  * Executes the linker.
  *
  * @param ProjectDescriptor $project Representation of the Object Graph that can be manipulated.
  *
  * @return void
  */
 public function execute(ProjectDescriptor $project)
 {
     $this->setObjectAliasesList($project->getIndexes()->elements->getAll());
     $this->substitute($project);
 }
Пример #13
0
 /**
  * Get number of deprecated elements.
  *
  * @param ProjectDescriptor $project
  *
  * @return int
  */
 protected function getDeprecatedCounter(ProjectDescriptor $project)
 {
     $deprecatedCounter = 0;
     /** @var DescriptorAbstract $element */
     foreach ($project->getIndexes()->get('elements') as $element) {
         if ($element->isDeprecated()) {
             $deprecatedCounter += 1;
         }
     }
     return $deprecatedCounter;
 }
 /**
  * Creates a tree of PackageDescriptors based on the provided FQNN (package name).
  *
  * This method will examine the package name and create a package descriptor for each part of
  * the FQNN if it doesn't exist in the packages field of the current package (starting with the root
  * Package in the Project Descriptor),
  *
  * As an intended side effect this method also populates the *elements* index of the ProjectDescriptor with all
  * created PackageDescriptors. Each index key is prefixed with a tilde (~) so that it will not conflict with
  * other FQSEN's, such as classes or interfaces.
  *
  * @param ProjectDescriptor $project
  * @param string            $packageName A FQNN of the package (and parents) to create.
  *
  * @see ProjectDescriptor::getPackage() for the root package.
  * @see PackageDescriptor::getChildren() for the child packages of a given package.
  *
  * @return void
  */
 protected function createPackageDescriptorTree(ProjectDescriptor $project, $packageName)
 {
     $parts = explode('\\', ltrim($packageName, '\\'));
     $fqnn = '';
     // this method does not use recursion to traverse the tree but uses a pointer that will be overridden with the
     // next item that is to be traversed (child package) at the end of the loop.
     /** @var PackageDescriptor $pointer  */
     $pointer = $project->getIndexes()->packages['\\'];
     foreach ($parts as $part) {
         $fqnn .= '\\' . $part;
         if ($pointer->getChildren()->get($part)) {
             $pointer = $pointer->getChildren()->get($part);
             continue;
         }
         // package does not exist, create it
         $interimPackageDescriptor = new PackageDescriptor();
         $interimPackageDescriptor->setParent($pointer);
         $interimPackageDescriptor->setName($part);
         $interimPackageDescriptor->setFullyQualifiedStructuralElementName($fqnn);
         // add to the pointer's list of children
         $pointer->getChildren()->set($part ?: 'UNKNOWN', $interimPackageDescriptor);
         // add to index
         $project->getIndexes()->packages[$fqnn] = $interimPackageDescriptor;
         // move pointer forward
         $pointer = $interimPackageDescriptor;
     }
 }
Пример #15
0
 /**
  * @param ProjectDescriptor $project
  * @param $element
  * @return false|string
  */
 private function generateUrlForXmlElement(ProjectDescriptor $project, $element)
 {
     $elements = $project->getIndexes()->get('elements');
     $elementFqcn = ($element->parentNode->nodeName === 'namespace' ? '~\\' : '') . $element->nodeValue;
     $node = isset($elements[$elementFqcn]) ? $elements[$elementFqcn] : $element->nodeValue;
     // do not use the normalized version if the element is not found!
     $rule = $this->routers->match($node);
     if (!$rule) {
         throw new \InvalidArgumentException('No matching routing rule could be found for the given node, please provide an artifact location, ' . 'encountered: ' . ($node === null ? 'NULL' : get_class($node)));
     }
     $rule = new ForFileProxy($rule);
     $url = $rule->generate($node);
     return $url;
 }