コード例 #1
0
 /**
  * Adds a new method to the class using an array of tokens
  *
  * @param ClassReflection $class     Class reflection
  * @param string          $methodTag Method tag contents
  *
  * @return bool
  */
 protected function injectMethod(ClassReflection $class, $methodTag)
 {
     $data = $this->parseMethod($methodTag);
     // Bail if the method format is invalid
     if (!$data) {
         return false;
     }
     $method = new MethodReflection($data['name'], $class->getLine());
     $method->setDocComment($data['description']);
     $method->setShortDesc($data['description']);
     if ($data['hint']) {
         $method->setHint(array(array($data['hint'], null)));
     }
     // Add arguments to the method
     foreach ($data['args'] as $name => $arg) {
         $param = new ParameterReflection($name, $class->getLine());
         if (!empty($arg['hint'])) {
             $param->setHint(array(array($arg['hint'], null)));
         }
         if (!empty($arg['default'])) {
             $param->setDefault($arg['default']);
         }
         $method->addParameter($param);
     }
     $class->addMethod($method);
     return true;
 }
コード例 #2
0
 protected function createClasses($interfaceName, $parentName, $className)
 {
     $interface = new ClassReflection($interfaceName, 1);
     $parent = new ClassReflection($parentName, 1);
     $parent->addInterface($interfaceName);
     $class = new ClassReflection($className, 1);
     $class->setParent($parentName);
     return array($interfaceName, $parentName, $className, $class, $parent, $interface);
 }
コード例 #3
0
 public function visit(ClassReflection $class)
 {
     $filePath = $this->remoteRepository->getRelativePath($class->getFile());
     if ('' !== $filePath) {
         $class->setRelativeFilePath($filePath);
         return true;
     }
     return false;
 }
コード例 #4
0
 /**
  * Adds a new property to the class using an array of tokens.
  *
  * @param ClassReflection $class       Class reflection
  * @param string          $propertyTag Property tag contents
  *
  * @return bool
  */
 protected function injectProperty(ClassReflection $class, $propertyTag)
 {
     if (!($data = $this->parseProperty($propertyTag))) {
         return false;
     }
     $property = new PropertyReflection($data['name'], $class->getLine());
     $property->setDocComment($data['description']);
     $property->setShortDesc($data['description']);
     if (isset($data['hint'])) {
         $property->setHint(array(array($data['hint'], null)));
     }
     $class->addProperty($property);
     return true;
 }
コード例 #5
0
 public function addClass(ClassReflection $class)
 {
     $name = $class->getName();
     $hash = $class->getHash();
     if (isset($this->classes[$name])) {
         unset($this->hashes[$this->classes[$name]][$name]);
         if (!$this->hashes[$this->classes[$name]]) {
             unset($this->hashes[$this->classes[$name]]);
         }
     }
     $this->hashes[$hash][$name] = true;
     $this->classes[$name] = $hash;
     $this->modified[] = $name;
     $this->visited[$hash] = true;
 }
コード例 #6
0
 public function visit(ClassReflection $class)
 {
     $modified = false;
     foreach ($class->getMethods() as $name => $method) {
         if (!($parentMethod = $class->getParentMethod($name))) {
             continue;
         }
         foreach ($method->getParameters() as $name => $parameter) {
             if (!($parentParameter = $parentMethod->getParameter($name))) {
                 continue;
             }
             if ($parameter->getShortDesc() != $parentParameter->getShortDesc()) {
                 $parameter->setShortDesc($parentParameter->getShortDesc());
                 $modified = true;
             }
             if ($parameter->getHint() != $parentParameter->getRawHint()) {
                 // FIXME: should test for a raw hint from tags, not the one from PHP itself
                 $parameter->setHint($parentParameter->getRawHint());
                 $modified = true;
             }
         }
         if ($method->getHint() != $parentMethod->getRawHint()) {
             $method->setHint($parentMethod->getRawHint());
             $modified = true;
         }
         if ($method->getHintDesc() != $parentMethod->getHintDesc()) {
             $method->setHintDesc($parentMethod->getHintDesc());
             $modified = true;
         }
         if ('{@inheritdoc}' == strtolower(trim($method->getShortDesc())) || !$method->getDocComment()) {
             if ($method->getShortDesc() != $parentMethod->getShortDesc()) {
                 $method->setShortDesc($parentMethod->getShortDesc());
                 $modified = true;
             }
             if ($method->getLongDesc() != $parentMethod->getLongDesc()) {
                 $method->setLongDesc($parentMethod->getLongDesc());
                 $modified = true;
             }
             if ($method->getExceptions() != $parentMethod->getRawExceptions()) {
                 $method->setExceptions($parentMethod->getRawExceptions());
                 $modified = true;
             }
         }
     }
     return $modified;
 }
コード例 #7
0
 public function readProject(Project $project)
 {
     $classes = array();
     foreach (Finder::create()->name('c_*.json')->in($this->getStoreDir($project)) as $file) {
         $classes[] = ClassReflection::fromArray($project, json_decode(file_get_contents($file), true));
     }
     return $classes;
 }
コード例 #8
0
ファイル: NodeVisitor.php プロジェクト: bopo/website
 protected function addClassOrInterface($node)
 {
     $class = new ClassReflection((string) $node->namespacedName, $node->getLine());
     $class->setModifiers($node->type);
     $class->setNamespace($this->context->getNamespace());
     $class->setAliases($this->context->getAliases());
     $class->setHash($this->context->getHash());
     $class->setFile($this->context->getFile());
     if ($this->context->getFilter()->acceptClass($class)) {
         $comment = $this->context->getDocBlockParser()->parse($node->getDocComment(), $this->context, $class);
         $class->setDocComment($node->getDocComment());
         $class->setShortDesc($comment->getShortDesc());
         $class->setLongDesc($comment->getLongDesc());
         if ($errors = $comment->getErrors()) {
             $this->context->addErrors((string) $class, $node->getLine(), $errors);
             $class->setErrors($errors);
         } else {
             $class->setTags($comment->getOtherTags());
         }
         $this->context->enterClass($class);
     }
     return $class;
 }
コード例 #9
0
ファイル: SymfonyFilter.php プロジェクト: kpocha/Sami
 public function acceptClass(ClassReflection $class)
 {
     return $class->getTags('api');
 }
コード例 #10
0
ファイル: ArrayStore.php プロジェクト: rafasashi/Sami
 public function writeClass(Project $project, ClassReflection $class)
 {
     $this->classes[$class->getName()] = $class;
 }
コード例 #11
0
 private function isAnyPropertyAnApi(ClassReflection $class)
 {
     $rc = new \ReflectionClass($class->getName());
     $props = $rc->getProperties();
     foreach ($props as $prop) {
         $docComment = $prop->getDocComment();
         if (false !== strpos($docComment, '@api')) {
             return true;
         }
     }
     return false;
 }
コード例 #12
0
ファイル: SymfonyFilter.php プロジェクト: bopo/website
 public function acceptClass(ClassReflection $class)
 {
     return $class->getDocBlock()->getTag('api');
 }
コード例 #13
0
ファイル: Project.php プロジェクト: codebubb/web_ssh
 protected function updateCache(ClassReflection $class)
 {
     $name = $class->getName();
     $this->namespaces[$class->getNamespace()] = $class->getNamespace();
     // add sub-namespaces
     $namespace = $class->getNamespace();
     while ($namespace = substr($namespace, 0, strrpos($namespace, '\\'))) {
         $this->namespaces[$namespace] = $namespace;
     }
     if ($class->isException()) {
         $this->namespaceExceptions[$class->getNamespace()][$name] = $class;
     } elseif ($class->isInterface()) {
         $this->namespaceInterfaces[$class->getNamespace()][$name] = $class;
         $this->interfaces[$name] = $class;
     } else {
         $this->namespaceClasses[$class->getNamespace()][$name] = $class;
     }
     if ($this->getConfig('simulate_namespaces')) {
         if (false !== ($pos = strrpos($name, '_'))) {
             $this->simulatedNamespaces[$namespace = str_replace('_', '\\', substr($name, 0, $pos))][$name] = $class;
             // add sub-namespaces
             while ($namespace = substr($namespace, 0, strrpos($namespace, '\\'))) {
                 if (!isset($this->simulatedNamespaces[$namespace])) {
                     $this->simulatedNamespaces[$namespace] = array();
                 }
             }
         } else {
             $this->simulatedNamespaces[''][$name] = $class;
         }
     }
 }
コード例 #14
0
 public function removeClass(ClassReflection $class)
 {
     unset($this->classes[$class->getName()]);
     unset($this->interfaces[$class->getName()]);
     unset($this->namespaceClasses[$class->getNamespace()][$class->getName()]);
     unset($this->namespaceInterfaces[$class->getNamespace()][$class->getName()]);
     unset($this->namespaceExceptions[$class->getNamespace()][$class->getName()]);
 }