1
0
mirror of synced 2024-12-13 14:56:01 +03:00
doctrine2/lib/vendor/addendum/annotations/doc_comment.php
2009-06-02 18:05:26 +00:00

130 lines
3.2 KiB
PHP
Executable File

<?php
class DocComment {
private static $classes = array();
private static $methods = array();
private static $fields = array();
private static $parsedFiles = array();
public static function clearCache() {
self::$classes = array();
self::$methods = array();
self::$fields = array();
self::$parsedFiles = array();
}
public function get($reflection) {
if($reflection instanceof ReflectionClass) {
return $this->forClass($reflection);
} elseif($reflection instanceof ReflectionMethod) {
return $this->forMethod($reflection);
} elseif($reflection instanceof ReflectionProperty) {
return $this->forProperty($reflection);
}
}
public function forClass($reflection) {
$this->process($reflection->getFileName());
$name = $reflection->getName();
return isset(self::$classes[$name]) ? self::$classes[$name] : false;
}
public function forMethod($reflection) {
$this->process($reflection->getDeclaringClass()->getFileName());
$class = $reflection->getDeclaringClass()->getName();
$method = $reflection->getName();
return isset(self::$methods[$class][$method]) ? self::$methods[$class][$method] : false;
}
public function forProperty($reflection) {
$this->process($reflection->getDeclaringClass()->getFileName());
$class = $reflection->getDeclaringClass()->getName();
$field = $reflection->getName();
return isset(self::$fields[$class][$field]) ? self::$fields[$class][$field] : false;
}
private function process($file) {
if(!isset(self::$parsedFiles[$file])) {
$this->parse($file);
self::$parsedFiles[$file] = true;
}
}
protected function parse($file) {
$tokens = $this->getTokens($file);
$currentClass = false;
$currentBlock = false;
$max = count($tokens);
$i = 0;
while($i < $max) {
$token = $tokens[$i];
if(is_array($token)) {
list($code, $value) = $token;
switch($code) {
case T_DOC_COMMENT:
$comment = $value;
break;
case T_CLASS:
$class = $this->getString($tokens, $i, $max);
if($comment !== false) {
self::$classes[$class] = $comment;
$comment = false;
}
break;
case T_VARIABLE:
if($comment !== false) {
$field = substr($token[1], 1);
self::$fields[$class][$field] = $comment;
$comment = false;
}
break;
case T_FUNCTION:
if($comment !== false) {
$function = $this->getString($tokens, $i, $max);
self::$methods[$class][$function] = $comment;
$comment = false;
}
break;
// ignore
case T_WHITESPACE:
case T_PUBLIC:
case T_PROTECTED:
case T_PRIVATE:
case T_ABSTRACT:
case T_FINAL:
case T_VAR:
break;
default:
$comment = false;
break;
}
} else {
$comment = false;
}
$i++;
}
}
private function getString($tokens, &$i, $max) {
do {
$token = $tokens[$i];
$i++;
if(is_array($token)) {
if($token[0] == T_STRING) {
return $token[1];
}
}
} while($i <= $max);
return false;
}
private function getTokens($file) {
return token_get_all(file_get_contents($file));
}
}
?>