--- /dev/null
+<?php
+/*
+*@package PHP_CodeDoc
+*/
+/*
+
+method parser - implements all the routines related to parsing a method
+and returning a Method Data Object.
+
+
+NOTE: these methods are called statically from the main parser, and hence
+inherit $this from the parser!!!!!!!
+
+
+*/
+
+
+
+
+class PHP_CodeDoc_Parser_Method {
+
+
+ function read($inclass) {
+
+ if ($c = PHP_CodeDoc_Parser_Method::parse()) {
+ $this->debug(__METHOD__,$c->name);
+ if ($inclass) {
+
+ $c->rfilename = $this->rfilename;
+ $c->activeFile = $this->activeFile;
+
+ $this->classes[$this->_active_class]->Operations[$c->name] = $c;
+ $this->classes[$this->_active_class]->Operations[$c->name]->class = $this->classes[$this->_active_class]->name;
+
+
+ // silly stuff :)
+ // merge method's author with class.
+ // hey this is a cool use of all those array functions!
+
+
+ if (@$a = $this->classes[$this->_active_class]->Operations[$c->name]->description->author)
+ $this->classes[$this->_active_class]->description->author
+ = array_reverse(array_values( array_unique (array_reverse(array_merge(
+ $this->classes[$this->_active_class]->description->author, $a)))));
+
+ // echo $this->methods++;
+ } else {
+ $c->active_package = &$this->packages[$this->active_package->name];
+ $c->rfilename = $this->rfilename;
+ $c->activeFile = $this->activeFile;
+
+ $this->active_directory->functions[] = $c;
+ //$c->active_package->functions[$c->name] = $c;
+ }
+ $this->pos = $c->endpos;
+ }
+ }
+
+
+ var $_active_method; // return object (PHP_CodeDoc_MethodParser)
+
+ function parse() { // really parse
+
+ // before pos... 2 points...
+ /// probably need to look back for 'string'?
+ $flags= array($this->look_nws(-1,';'), $this->look_nws(-2,';'), $this->look_nws(-3,';'), $this->look_nws(-4,';'));
+
+
+ $startpos = $this->pos;
+ if ($npos = $this->find_token_pos($startpos,array(T_STRING),'(')) {
+ $n = @$this->tokens[$npos][1];
+ } else {
+ return;
+ }
+
+ $this->pos = $this->pos + 4;
+ $method = new PHP_CodeDoc_Data_Method;
+ $method->name = $n;
+ $method->type = "Public";
+ $method->isPublic = 1;
+ $method->isStatic = in_array(T_STATIC, $flags) ? 1 : 0;
+ $method->isFinal = in_array(T_FINAL, $flags) ? 1 : 0;
+ $method->visibility = 1;
+ if (in_array(T_PRIVATE, $flags)) {
+ $method->type = "Private";
+ $method ->isPublic = 0;
+ $method->visibility = 0;
+ }
+ if (in_array(T_PROTECTED, $flags)) {
+ $method->type = "Protected";
+ $method ->isPublic = 0;
+ $method->visibility = 0;
+ }
+
+
+ $method->Param = PHP_CodeDoc_Parser_Method::_get_args($method);
+
+ if ($v = PHP_CodeDoc_Parser_Comment::parse()) {
+ $method->description = $v;
+ }
+
+ $this->pos = $startpos;
+ PHP_CodeDoc_Parser_Method::_store_method_tokens($method);
+ // store the array of objects so It can be printed out!
+ $this->pos = $startpos;
+
+ $method->endpos = $this->endpos;
+ return $method;
+
+ }
+
+
+
+
+ function _store_method_tokens(&$method) { //remember the tokens for a method.. (for printing later)
+ //return;
+ $tokens=array();
+ $n=0;
+ $in_method =0;
+ $inbrak =0;
+ $level=0;
+ $pos = $this->pos;
+ $method->tokenStart = $this->pos;
+ $startpos = $this->pos;
+ while ($pos < $this->total) {
+ $v = $this->tokens[$pos];
+ if (is_array($v)) {
+ if (!$inbrak && $v[0] == T_CURLY_OPEN) {
+ if ($level ==0)
+ $in_method=1;
+ $level++;
+ }
+ //if ($v[1] && $v[1]{0} == "(")
+ // $inbrak++;
+ //$v[0] = token_name($v[0]);
+ $v[2]= "{$level}:{$inbrak}";
+ } else {
+ if (!$inbrak && trim($v) == "}")
+ $level--;
+ if (!$inbrak && trim($v) == "{") {
+ if ($level ==0)
+ $in_method=1;
+ $level++;
+ }
+ if (trim($v) == "(") $inbrak++;
+ if (trim($v) == ")") $inbrak--;
+
+ }
+
+ $tokens[$n] = $v;
+ if ($in_method && !$level) {
+ $this->endpos = $pos;
+ $method->tokenEnd = $pos;
+
+ return;
+ }
+ $pos++;
+ $n++;
+ }
+ $this->endpos = $this->pos+1;
+ $method->tokenEnd = $this->pos+1;
+ }
+
+
+
+ function _get_args (&$method) {// read arguments of a method call
+ $Param= array();
+ $level =0;
+ $p = -1;
+ while ($this->pos < $this->total) {
+ $v = $this->tokens[$this->pos];
+ if (is_array($v)) {
+ if ($v[0] == T_WHITESPACE) {
+ $this->pos++;
+ continue 1;
+ }
+ switch ($v[0]) {
+ case T_VARIABLE:
+ $p++;
+ $Param[$p] = new StdClass;
+ $Param[$p]->name = $v[1];
+ break;
+
+ case T_FILE:
+ case T_LINE:
+ case T_LNUMBER:
+ case T_CONSTANT_ENCAPSED_STRING:
+ if (!@$Param[$p]->Value)
+ $Param[$p]->Value = $v[1];
+ break;
+ case T_ARRAY:
+ $Param[$p]->Value = "array()";
+ break;
+ }
+ //echo "XXX:{$this->pos}:" .token_name($v[0]) . ":{$this->level}:". $v[1] .":\n";
+ } else {
+ //if ($v == "(") $level++;
+ if ($v == "{") return $Param;
+
+ //if ($v == ",") $current_var = "";
+ //echo "XXX:{$this->pos}:RAW:{$v}\n";
+ }
+ $this->pos++;
+ }
+ return $Param; // shouldnt really get here
+ }
+
+
+
+}
\ No newline at end of file