Permalink
Browse files

Undo deprecation and implement PropertyScanner

  • Loading branch information...
1 parent 0faa04e commit d556b6fd22e30f09cf957fd9973370e45c266b31 @postalservice14 postalservice14 committed Sep 12, 2012
@@ -210,16 +210,26 @@ public function getConstants()
/**
* Returns a list of property names
*
- * @deprecated use getProperties()
* @return array
*/
public function getPropertyNames()
{
- return $this->getProperties();
+ $this->scan();
+
+ $return = array();
+
+ foreach ($this->infos as $info) {
+ if ($info['type'] != 'property') {
+ continue;
+ }
+
+ $return[] = $info['name'];
+ }
+ return $return;
}
/**
- * Returns a list of property names
+ * Returns a list of properties
*
* @return array
*/
@@ -234,11 +244,46 @@ public function getProperties()
continue;
}
- $return[] = $info['name'];
+ $return[] = $this->getProperty($info['name']);
}
return $return;
}
+ public function getProperty($propertyNameOrInfoIndex)
+ {
+ $this->scan();
+
+ if (is_int($propertyNameOrInfoIndex)) {
+ $info = $this->infos[$propertyNameOrInfoIndex];
+ if ($info['type'] != 'property') {
+ throw new Exception\InvalidArgumentException('Index of info offset is not about a property');
+ }
+ } elseif (is_string($propertyNameOrInfoIndex)) {
+ $propertyFound = false;
+ foreach ($this->infos as $info) {
+ if ($info['type'] === 'property' && $info['name'] === $propertyNameOrInfoIndex) {
+ $propertyFound = true;
+ break;
+ }
+ }
+ if (!$propertyFound) {
+ return false;
+ }
+ } else {
+ throw new Exception\InvalidArgumentException('Invalid property name of info index type. Must be of type int or string');
+ }
+ if (!isset($info)) {
+ return false;
+ }
+ $p = new PropertyScanner(
+ array_slice($this->tokens, $info['tokenStart'], $info['tokenEnd'] - $info['tokenStart'] + 1),
+ $this->nameInformation
+ );
+ $p->setClass($this->name);
+ $p->setScannerClass($this);
+ return $p;
+ }
+
public function getMethodNames()
{
$this->scan();
@@ -84,7 +84,7 @@ public function getDocComment()
/**
* @param Annotation\AnnotationManager $annotationManager
- * @return Annotation\AnnotationCollection
+ * @return AnnotationScanner
*/
public function getAnnotations(Annotation\AnnotationManager $annotationManager)
{
@@ -1 +1,285 @@
<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @package Zend_Code
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation;
+use Zend\Code\Exception;
+use Zend\Code\NameInformation;
+
+class PropertyScanner implements ScannerInterface
+{
+ /**
+ * @var bool
+ */
+ protected $isScanned = false;
+
+ /**
+ * @var array
+ */
+ protected $tokens;
+
+ /**
+ * @var NameInformation
+ */
+ protected $nameInformation;
+
+ /**
+ * @var string
+ */
+ protected $class;
+
+ /**
+ * @var ClassScanner
+ */
+ protected $scannerClass;
+
+ /**
+ * @var int
+ */
+ protected $lineStart;
+
+ /**
+ * @var bool
+ */
+ protected $isProtected = false;
+
+ /**
+ * @var bool
+ */
+ protected $isPublic = true;
+
+ /**
+ * @var bool
+ */
+ protected $isPrivate = false;
+
+ /**
+ * @var bool
+ */
+ protected $isStatic = false;
+
+ /**
+ * @var string
+ */
+ protected $docComment;
+
+ /**
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * @var string
+ */
+ protected $value;
+
+ /**
+ * Constructor
+ *
+ * @param array $propertyTokens
+ * @param NameInformation $nameInformation
+ */
+ public function __construct(array $propertyTokens, NameInformation $nameInformation = null)
+ {
+ $this->tokens = $propertyTokens;
+ $this->nameInformation = $nameInformation;
+ }
+
+ /**
+ * @param string $class
+ */
+ public function setClass($class)
+ {
+ $this->class = $class;
+ }
+
+ /**
+ * @param ClassScanner $scannerClass
+ */
+ public function setScannerClass(ClassScanner $scannerClass)
+ {
+ $this->scannerClass = $scannerClass;
+ }
+
+ /**
+ * @return ClassScanner
+ */
+ public function getClassScanner()
+ {
+ return $this->scannerClass;
+ }
+
+ /**
+ * @return string
+ */
+ public function getName()
+ {
+ $this->scan();
+ return $this->name;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isPublic()
+ {
+ $this->scan();
+ return $this->isPublic;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isPrivate()
+ {
+ $this->scan();
+ return $this->isPrivate;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isProtected()
+ {
+ $this->scan();
+ return $this->isProtected;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isStatic()
+ {
+ $this->scan();
+ return $this->isStatic;
+ }
+
+ /**
+ * @return string
+ */
+ public function getValue()
+ {
+ $this->scan();
+ return $this->value;
+ }
+
+ /**
+ * @return string
+ */
+ public function getDocComment()
+ {
+ $this->scan();
+ return $this->docComment;
+ }
+
+ /**
+ * @param Annotation\AnnotationManager $annotationManager
+ * @return AnnotationScanner
+ */
+ public function getAnnotations(Annotation\AnnotationManager $annotationManager)
+ {
+ if (($docComment = $this->getDocComment()) == '') {
+ return false;
+ }
+
+ return new AnnotationScanner($annotationManager, $docComment, $this->nameInformation);
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ $this->scan();
+ return var_export($this, true);
+ }
+
+ /**
+ * Scan tokens
+ *
+ * @throws \Zend\Code\Exception\RuntimeException
+ */
+ protected function scan()
+ {
+ if ($this->isScanned) {
+ return;
+ }
+
+ if (!$this->tokens) {
+ throw new Exception\RuntimeException('No tokens were provided');
+ }
+
+ /**
+ * Variables & Setup
+ */
+ $tokens = &$this->tokens;
+
+ reset($tokens);
+
+ SCANNER_TOP:
+
+ $token = current($tokens);
+
+ if (!is_string($token)) {
+ list($tokenType, $tokenContent, $tokenLine) = $token;
+
+ switch ($tokenType) {
+ case T_DOC_COMMENT:
+ if ($this->docComment === null && $this->name === null) {
+ $this->docComment = $tokenContent;
+ }
+ goto SCANNER_CONTINUE;
+
+ case T_VARIABLE:
+ $this->name = ltrim($tokenContent, '$');
+ goto SCANNER_CONTINUE;
+
+ case T_PUBLIC:
+ // use defaults
+ goto SCANNER_CONTINUE;
+
+ case T_PROTECTED:
+ $this->isProtected = true;
+ $this->isPublic = false;
+ goto SCANNER_CONTINUE;
+
+ case T_PRIVATE:
+ $this->isPrivate = true;
+ $this->isPublic = false;
+ goto SCANNER_CONTINUE;
+
+ case T_STATIC:
+ $this->isStatic = true;
+ goto SCANNER_CONTINUE;
+
+ default:
+ if ($this->name !== null && trim($tokenContent) !== '') {
+ $this->value .= (is_string($token)) ? $token : $tokenContent;
+ if (substr($this->value, 0, 1) === '"' || substr($this->value, 0, 1) === "'") {
+ $this->value = substr($this->value, 1, -1); // Remove quotes
+ }
+ }
+ goto SCANNER_CONTINUE;
+ }
+ }
+
+ SCANNER_CONTINUE:
+
+ if (next($this->tokens) === false) {
+ goto SCANNER_END;
+ }
+ goto SCANNER_TOP;
+
+ SCANNER_END:
+
+ $this->isScanned = true;
+ }
+}
Oops, something went wrong.

0 comments on commit d556b6f

Please sign in to comment.