--- /dev/null
+<?php
+namespace Consolidation\AnnotatedCommand\Parser\Internal;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Param;
+use phpDocumentor\Reflection\DocBlock\Tags\Return_;
+use Consolidation\AnnotatedCommand\Parser\CommandInfo;
+use Consolidation\AnnotatedCommand\Parser\DefaultsWithDescriptions;
+
+/**
+ * Given a class and method name, parse the annotations in the
+ * DocBlock comment, and provide accessor methods for all of
+ * the elements that are needed to create an annotated Command.
+ */
+class CommandDocBlockParser3 extends AbstractCommandDocBlockParser
+{
+ /**
+ * Parse the docBlock comment for this command, and set the
+ * fields of this class with the data thereby obtained.
+ */
+ public function parse()
+ {
+ // DocBlockFactory::create fails if the comment is empty.
+ $docComment = $this->reflection->getDocComment();
+ if (empty($docComment)) {
+ return;
+ }
+ $phpdoc = $this->createDocBlock();
+
+ // First set the description (synopsis) and help.
+ $this->commandInfo->setDescription((string)$phpdoc->getSummary());
+ $this->commandInfo->setHelp((string)$phpdoc->getDescription());
+
+ $this->processAllTags($phpdoc);
+ }
+
+ public function createDocBlock()
+ {
+ $docBlockFactory = \phpDocumentor\Reflection\DocBlockFactory::createInstance();
+ $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
+
+ return $docBlockFactory->create(
+ $this->reflection,
+ $contextFactory->createFromReflector($this->reflection)
+ );
+ }
+
+ protected function getTagContents($tag)
+ {
+ return (string)$tag;
+ }
+
+ /**
+ * Store the data from a @param annotation in our argument descriptions.
+ */
+ protected function processParamTag($tag)
+ {
+ if (!$tag instanceof Param) {
+ return;
+ }
+ return parent::processParamTag($tag);
+ }
+
+ /**
+ * Store the data from a @return annotation in our argument descriptions.
+ */
+ protected function processReturnTag($tag)
+ {
+ if (!$tag instanceof Return_) {
+ return;
+ }
+ // If there is a spurrious trailing space on the return type, remove it.
+ $this->commandInfo->setReturnType(trim($this->getTagContents($tag)));
+ }
+}